blob: b6d246f78fb397d981b48414b3659cc06e26b51a [file] [log] [blame]
Diego Sueiro20e45672018-12-07 10:00:46 +00001/** @file
2 * @brief Monochrome Character Framebuffer shell module
3 *
4 * Provide some Character Framebuffer shell commands that can be useful for
5 * testing.
6 */
7
8/*
9 * Copyright (c) 2018 Diego Sueiro
10 *
11 * SPDX-License-Identifier: Apache-2.0
12 */
13
14#include <stdlib.h>
Gerard Marull-Paretas5113c142022-05-06 11:12:04 +020015#include <zephyr/shell/shell.h>
16#include <zephyr/display/cfb.h>
Diego Sueiro20e45672018-12-07 10:00:46 +000017
18#define HELP_NONE "[none]"
19#define HELP_INIT "call \"cfb init\" first"
20#define HELP_PRINT "<col: pos> <row: pos> \"<text>\""
TOKITA Hiroshi39c82882023-04-13 07:31:36 +090021#define HELP_DRAW_POINT "<x> <y0>"
TOKITA Hiroshi182c55f2023-04-13 06:43:39 +090022#define HELP_DRAW_LINE "<x0> <y0> <x1> <y1>"
TOKITA Hiroshi92efbee2023-04-13 07:29:48 +090023#define HELP_DRAW_RECT "<x0> <y0> <x1> <y1>"
TOKITA Hiroshi47f14d62023-01-13 19:59:35 +090024#define HELP_INVERT "[<x> <y> <width> <height>]"
Diego Sueiro20e45672018-12-07 10:00:46 +000025
Gerard Marull-Paretasb402ac72022-08-17 15:28:41 +020026static const struct device *const dev =
27 DEVICE_DT_GET(DT_CHOSEN(zephyr_display));
Diego Sueiro20e45672018-12-07 10:00:46 +000028static const char * const param_name[] = {
29 "height", "width", "ppt", "rows", "cols"};
30
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +020031static int cmd_clear(const struct shell *sh, size_t argc, char *argv[])
Diego Sueiro20e45672018-12-07 10:00:46 +000032{
33 int err;
34
35 ARG_UNUSED(argc);
36 ARG_UNUSED(argv);
37
38 if (!dev) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +020039 shell_error(sh, HELP_INIT);
Diego Sueiro20e45672018-12-07 10:00:46 +000040 return -ENODEV;
41 }
42
43 err = cfb_framebuffer_clear(dev, true);
44 if (err) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +020045 shell_error(sh, "Framebuffer clear error=%d", err);
Diego Sueiro20e45672018-12-07 10:00:46 +000046 return err;
47 }
48
49 err = cfb_framebuffer_finalize(dev);
50 if (err) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +020051 shell_error(sh, "Framebuffer finalize error=%d", err);
Diego Sueiro20e45672018-12-07 10:00:46 +000052 return err;
53 }
54
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +020055 shell_print(sh, "Display Cleared");
Diego Sueiro20e45672018-12-07 10:00:46 +000056
57 return err;
58}
59
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +020060static int cmd_cfb_print(const struct shell *sh, int col, int row, char *str)
Diego Sueiro20e45672018-12-07 10:00:46 +000061{
62 int err;
Kumar Galaa1b77fd2020-05-27 11:26:57 -050063 uint8_t ppt;
Diego Sueiro20e45672018-12-07 10:00:46 +000064
65 if (!dev) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +020066 shell_error(sh, HELP_INIT);
Diego Sueiro20e45672018-12-07 10:00:46 +000067 return -ENODEV;
68 }
69
70 ppt = cfb_get_display_parameter(dev, CFB_DISPLAY_PPT);
71
72 err = cfb_framebuffer_clear(dev, false);
73 if (err) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +020074 shell_error(sh, "Framebuffer clear failed error=%d", err);
Diego Sueiro20e45672018-12-07 10:00:46 +000075 return err;
76 }
77
78 err = cfb_print(dev, str, col, row * ppt);
79 if (err) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +020080 shell_error(sh, "Failed to print the string %s error=%d",
Diego Sueiro20e45672018-12-07 10:00:46 +000081 str, err);
82 return err;
83 }
84
85 err = cfb_framebuffer_finalize(dev);
86 if (err) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +020087 shell_error(sh,
Diego Sueiro20e45672018-12-07 10:00:46 +000088 "Failed to finalize the Framebuffer error=%d", err);
89 return err;
90 }
91
92 return err;
93}
94
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +020095static int cmd_print(const struct shell *sh, size_t argc, char *argv[])
Diego Sueiro20e45672018-12-07 10:00:46 +000096{
97 int err;
98 int col, row;
99
100 if (!dev) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200101 shell_error(sh, HELP_INIT);
Diego Sueiro20e45672018-12-07 10:00:46 +0000102 return -ENODEV;
103 }
104
105 col = strtol(argv[1], NULL, 10);
106 if (col > cfb_get_display_parameter(dev, CFB_DISPLAY_COLS)) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200107 shell_error(sh, "Invalid col=%d position", col);
Diego Sueiro20e45672018-12-07 10:00:46 +0000108 return -EINVAL;
109 }
110
111 row = strtol(argv[2], NULL, 10);
112 if (row > cfb_get_display_parameter(dev, CFB_DISPLAY_ROWS)) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200113 shell_error(sh, "Invalid row=%d position", row);
Diego Sueiro20e45672018-12-07 10:00:46 +0000114 return -EINVAL;
115 }
116
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200117 err = cmd_cfb_print(sh, col, row, argv[3]);
Diego Sueiro20e45672018-12-07 10:00:46 +0000118 if (err) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200119 shell_error(sh, "Failed printing to Framebuffer error=%d",
Diego Sueiro20e45672018-12-07 10:00:46 +0000120 err);
121 }
122
123 return err;
124}
125
TOKITA Hiroshie2c94652023-01-14 16:07:05 +0900126static int cmd_draw_text(const struct shell *sh, size_t argc, char *argv[])
127{
128 int err;
129 int x, y;
130
131 if (!dev) {
132 shell_error(sh, HELP_INIT);
133 return -ENODEV;
134 }
135
136 x = strtol(argv[1], NULL, 10);
137 y = strtol(argv[2], NULL, 10);
138 err = cfb_draw_text(dev, argv[3], x, y);
139 if (err) {
140 shell_error(sh, "Failed text drawing to Framebuffer error=%d", err);
141 return err;
142 }
143
144 err = cfb_framebuffer_finalize(dev);
145
146 return err;
147}
148
TOKITA Hiroshi39c82882023-04-13 07:31:36 +0900149static int cmd_draw_point(const struct shell *sh, size_t argc, char *argv[])
150{
151 int err;
152 struct cfb_position pos;
153
154 if (!dev) {
155 shell_error(sh, HELP_INIT);
156 return -ENODEV;
157 }
158
159 pos.x = strtol(argv[1], NULL, 10);
160 pos.y = strtol(argv[2], NULL, 10);
161
162 err = cfb_draw_point(dev, &pos);
163 if (err) {
164 shell_error(sh, "Failed point drawing to Framebuffer error=%d", err);
165 return err;
166 }
167
168 err = cfb_framebuffer_finalize(dev);
169
170 return err;
171}
172
TOKITA Hiroshi182c55f2023-04-13 06:43:39 +0900173static int cmd_draw_line(const struct shell *sh, size_t argc, char *argv[])
174{
175 int err;
176 struct cfb_position start, end;
177
178 if (!dev) {
179 shell_error(sh, HELP_INIT);
180 return -ENODEV;
181 }
182
183 start.x = strtol(argv[1], NULL, 10);
184 start.y = strtol(argv[2], NULL, 10);
185 end.x = strtol(argv[3], NULL, 10);
186 end.y = strtol(argv[4], NULL, 10);
187
188 err = cfb_draw_line(dev, &start, &end);
189 if (err) {
190 shell_error(sh, "Failed text drawing to Framebuffer error=%d", err);
191 return err;
192 }
193
194 err = cfb_framebuffer_finalize(dev);
195
196 return err;
197}
198
TOKITA Hiroshi92efbee2023-04-13 07:29:48 +0900199static int cmd_draw_rect(const struct shell *sh, size_t argc, char *argv[])
200{
201 int err;
202 struct cfb_position start, end;
203
204 if (!dev) {
205 shell_error(sh, HELP_INIT);
206 return -ENODEV;
207 }
208
209 start.x = strtol(argv[1], NULL, 10);
210 start.y = strtol(argv[2], NULL, 10);
211 end.x = strtol(argv[3], NULL, 10);
212 end.y = strtol(argv[4], NULL, 10);
213
214 err = cfb_draw_rect(dev, &start, &end);
215 if (err) {
216 shell_error(sh, "Failed rectanble drawing to Framebuffer error=%d", err);
217 return err;
218 }
219
220 err = cfb_framebuffer_finalize(dev);
221
222 return err;
223}
224
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200225static int cmd_scroll_vert(const struct shell *sh, size_t argc, char *argv[])
Diego Sueiro20e45672018-12-07 10:00:46 +0000226{
227 int err = 0;
228 int col, row;
229 int boundary;
230
231 if (!dev) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200232 shell_error(sh, HELP_INIT);
Diego Sueiro20e45672018-12-07 10:00:46 +0000233 return -ENODEV;
234 }
235
236 col = strtol(argv[1], NULL, 10);
237 if (col > cfb_get_display_parameter(dev, CFB_DISPLAY_COLS)) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200238 shell_error(sh, "Invalid col=%d position", col);
Diego Sueiro20e45672018-12-07 10:00:46 +0000239 return -EINVAL;
240 }
241
242 row = strtol(argv[2], NULL, 10);
243 if (row > cfb_get_display_parameter(dev, CFB_DISPLAY_ROWS)) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200244 shell_error(sh, "Invalid row=%d position", row);
Diego Sueiro20e45672018-12-07 10:00:46 +0000245 return -EINVAL;
246 }
247
248 boundary = cfb_get_display_parameter(dev, CFB_DISPLAY_ROWS) - row;
249
250 for (int i = 0; i < boundary; i++) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200251 err = cmd_cfb_print(sh, col, row, argv[3]);
Diego Sueiro20e45672018-12-07 10:00:46 +0000252 if (err) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200253 shell_error(sh,
Diego Sueiro20e45672018-12-07 10:00:46 +0000254 "Failed printing to Framebuffer error=%d",
255 err);
256 break;
257 }
258 row++;
259 }
260
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200261 cmd_cfb_print(sh, 0, 0, "");
Diego Sueiro20e45672018-12-07 10:00:46 +0000262
263 return err;
264}
265
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200266static int cmd_scroll_horz(const struct shell *sh, size_t argc, char *argv[])
Diego Sueiro20e45672018-12-07 10:00:46 +0000267{
268 int err = 0;
269 int col, row;
270 int boundary;
271
272 if (!dev) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200273 shell_error(sh, HELP_INIT);
Diego Sueiro20e45672018-12-07 10:00:46 +0000274 return -ENODEV;
275 }
276
277 col = strtol(argv[1], NULL, 10);
278 if (col > cfb_get_display_parameter(dev, CFB_DISPLAY_COLS)) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200279 shell_error(sh, "Invalid col=%d position", col);
Diego Sueiro20e45672018-12-07 10:00:46 +0000280 return -EINVAL;
281 }
282
283 row = strtol(argv[2], NULL, 10);
284 if (row > cfb_get_display_parameter(dev, CFB_DISPLAY_ROWS)) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200285 shell_error(sh, "Invalid row=%d position", row);
Diego Sueiro20e45672018-12-07 10:00:46 +0000286 return -EINVAL;
287 }
288
289 col++;
290 boundary = cfb_get_display_parameter(dev, CFB_DISPLAY_COLS) - col;
291
292 for (int i = 0; i < boundary; i++) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200293 err = cmd_cfb_print(sh, col, row, argv[3]);
Diego Sueiro20e45672018-12-07 10:00:46 +0000294 if (err) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200295 shell_error(sh,
Diego Sueiro20e45672018-12-07 10:00:46 +0000296 "Failed printing to Framebuffer error=%d",
297 err);
298 break;
299 }
300 col++;
301 }
302
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200303 cmd_cfb_print(sh, 0, 0, "");
Diego Sueiro20e45672018-12-07 10:00:46 +0000304
305 return err;
306}
307
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200308static int cmd_set_font(const struct shell *sh, size_t argc, char *argv[])
Diego Sueiro20e45672018-12-07 10:00:46 +0000309{
310 int err;
311 int idx;
Kumar Galaa1b77fd2020-05-27 11:26:57 -0500312 uint8_t height;
313 uint8_t width;
Diego Sueiro20e45672018-12-07 10:00:46 +0000314
315 if (!dev) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200316 shell_error(sh, HELP_INIT);
Diego Sueiro20e45672018-12-07 10:00:46 +0000317 return -ENODEV;
318 }
319
320 idx = strtol(argv[1], NULL, 10);
321
322 err = cfb_get_font_size(dev, idx, &width, &height);
323 if (err) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200324 shell_error(sh, "Invalid font idx=%d err=%d\n", idx, err);
Diego Sueiro20e45672018-12-07 10:00:46 +0000325 return err;
326 }
327
328 err = cfb_framebuffer_set_font(dev, idx);
329 if (err) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200330 shell_error(sh, "Failed setting font idx=%d err=%d", idx,
Diego Sueiro20e45672018-12-07 10:00:46 +0000331 err);
332 return err;
333 }
334
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200335 shell_print(sh, "Font idx=%d height=%d widht=%d set", idx, height,
Diego Sueiro20e45672018-12-07 10:00:46 +0000336 width);
337
338 return err;
339}
340
Simon Frank5d9db9d2023-02-28 10:02:54 +0100341static int cmd_set_kerning(const struct shell *sh, size_t argc, char *argv[])
342{
343 int err;
344 char *ep = NULL;
345 long kerning;
346
347 if (!dev) {
348 shell_error(sh, HELP_INIT);
349 return -ENODEV;
350 }
351
352 errno = 0;
353 kerning = strtol(argv[1], &ep, 10);
354 if (errno || ep == argv[1]) {
355 shell_error(sh, HELP_INIT);
356 return -EINVAL;
357 }
358
359 err = cfb_set_kerning(dev, kerning);
360 if (err) {
361 shell_error(sh, "Failed to set kerning err=%d", err);
362 return err;
363 }
364
365 return err;
366}
367
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200368static int cmd_invert(const struct shell *sh, size_t argc, char *argv[])
Diego Sueiro20e45672018-12-07 10:00:46 +0000369{
370 int err;
371
Diego Sueiro20e45672018-12-07 10:00:46 +0000372 if (!dev) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200373 shell_error(sh, HELP_INIT);
Diego Sueiro20e45672018-12-07 10:00:46 +0000374 return -ENODEV;
375 }
376
TOKITA Hiroshi47f14d62023-01-13 19:59:35 +0900377 if (argc == 1) {
TOKITA Hiroshi47f14d62023-01-13 19:59:35 +0900378 err = cfb_framebuffer_invert(dev);
379 if (err) {
TOKITA Hiroshi476a5f52023-04-11 22:09:34 +0900380 shell_error(sh, "Error inverting Framebuffer");
TOKITA Hiroshi47f14d62023-01-13 19:59:35 +0900381 return err;
382 }
383 } else if (argc == 5) {
384 int x, y, w, h;
385
386 x = strtol(argv[1], NULL, 10);
387 y = strtol(argv[2], NULL, 10);
388 w = strtol(argv[3], NULL, 10);
389 h = strtol(argv[4], NULL, 10);
390
391 err = cfb_invert_area(dev, x, y, w, h);
392 if (err) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200393 shell_error(sh, "Error invert area");
TOKITA Hiroshi47f14d62023-01-13 19:59:35 +0900394 return err;
395 }
396 } else {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200397 shell_help(sh);
TOKITA Hiroshi47f14d62023-01-13 19:59:35 +0900398 return 0;
399 }
400
TOKITA Hiroshi47f14d62023-01-13 19:59:35 +0900401 cfb_framebuffer_finalize(dev);
Diego Sueiro20e45672018-12-07 10:00:46 +0000402
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200403 shell_print(sh, "Framebuffer Inverted");
Diego Sueiro20e45672018-12-07 10:00:46 +0000404
405 return err;
406}
407
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200408static int cmd_get_fonts(const struct shell *sh, size_t argc, char *argv[])
Diego Sueiro20e45672018-12-07 10:00:46 +0000409{
410 int err = 0;
Kumar Galaa1b77fd2020-05-27 11:26:57 -0500411 uint8_t font_height;
412 uint8_t font_width;
Diego Sueiro20e45672018-12-07 10:00:46 +0000413
414 ARG_UNUSED(argc);
415 ARG_UNUSED(argv);
416
417 if (!dev) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200418 shell_error(sh, HELP_INIT);
Diego Sueiro20e45672018-12-07 10:00:46 +0000419 return -ENODEV;
420 }
421
422 for (int idx = 0; idx < cfb_get_numof_fonts(dev); idx++) {
423 if (cfb_get_font_size(dev, idx, &font_width, &font_height)) {
424 break;
425 }
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200426 shell_print(sh, "idx=%d height=%d width=%d", idx,
Diego Sueiro20e45672018-12-07 10:00:46 +0000427 font_height, font_width);
428 }
429
430 return err;
431}
432
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200433static int cmd_get_device(const struct shell *sh, size_t argc, char *argv[])
Diego Sueiro20e45672018-12-07 10:00:46 +0000434{
435 int err = 0;
436
437 ARG_UNUSED(argc);
438 ARG_UNUSED(argv);
439
440 if (!dev) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200441 shell_error(sh, HELP_INIT);
Diego Sueiro20e45672018-12-07 10:00:46 +0000442 return -ENODEV;
443 }
444
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200445 shell_print(sh, "Framebuffer Device: %s", dev->name);
Diego Sueiro20e45672018-12-07 10:00:46 +0000446
447 return err;
448}
449
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200450static int cmd_get_param_all(const struct shell *sh, size_t argc,
Diego Sueiro20e45672018-12-07 10:00:46 +0000451 char *argv[])
452{
453 ARG_UNUSED(argc);
454 ARG_UNUSED(argv);
455
456 if (!dev) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200457 shell_error(sh, HELP_INIT);
Diego Sueiro20e45672018-12-07 10:00:46 +0000458 return -ENODEV;
459 }
460
461 for (unsigned int i = 0; i <= CFB_DISPLAY_COLS; i++) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200462 shell_print(sh, "param: %s=%d", param_name[i],
Diego Sueiro20e45672018-12-07 10:00:46 +0000463 cfb_get_display_parameter(dev, i));
464
465 }
466
467 return 0;
468}
469
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200470static int cmd_get_param_height(const struct shell *sh, size_t argc,
Diego Sueiro20e45672018-12-07 10:00:46 +0000471 char *argv[])
472{
473 ARG_UNUSED(argc);
474 ARG_UNUSED(argv);
475
476 if (!dev) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200477 shell_error(sh, HELP_INIT);
Diego Sueiro20e45672018-12-07 10:00:46 +0000478 return -ENODEV;
479 }
480
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200481 shell_print(sh, "param: %s=%d", param_name[CFB_DISPLAY_HEIGH],
Diego Sueiro20e45672018-12-07 10:00:46 +0000482 cfb_get_display_parameter(dev, CFB_DISPLAY_HEIGH));
483
484 return 0;
485}
486
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200487static int cmd_get_param_width(const struct shell *sh, size_t argc,
Diego Sueiro20e45672018-12-07 10:00:46 +0000488 char *argv[])
489{
490 ARG_UNUSED(argc);
491 ARG_UNUSED(argv);
492
493 if (!dev) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200494 shell_error(sh, HELP_INIT);
Diego Sueiro20e45672018-12-07 10:00:46 +0000495 return -ENODEV;
496 }
497
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200498 shell_print(sh, "param: %s=%d", param_name[CFB_DISPLAY_WIDTH],
Diego Sueiro20e45672018-12-07 10:00:46 +0000499 cfb_get_display_parameter(dev, CFB_DISPLAY_WIDTH));
500
501 return 0;
502}
503
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200504static int cmd_get_param_ppt(const struct shell *sh, size_t argc,
Diego Sueiro20e45672018-12-07 10:00:46 +0000505 char *argv[])
506{
507 ARG_UNUSED(argc);
508 ARG_UNUSED(argv);
509
510 if (!dev) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200511 shell_error(sh, HELP_INIT);
Diego Sueiro20e45672018-12-07 10:00:46 +0000512 return -ENODEV;
513 }
514
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200515 shell_print(sh, "param: %s=%d", param_name[CFB_DISPLAY_PPT],
Diego Sueiro20e45672018-12-07 10:00:46 +0000516 cfb_get_display_parameter(dev, CFB_DISPLAY_PPT));
517
518 return 0;
519}
520
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200521static int cmd_get_param_rows(const struct shell *sh, size_t argc,
Diego Sueiro20e45672018-12-07 10:00:46 +0000522 char *argv[])
523{
524 ARG_UNUSED(argc);
525 ARG_UNUSED(argv);
526
527 if (!dev) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200528 shell_error(sh, HELP_INIT);
Diego Sueiro20e45672018-12-07 10:00:46 +0000529 return -ENODEV;
530 }
531
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200532 shell_print(sh, "param: %s=%d", param_name[CFB_DISPLAY_ROWS],
Diego Sueiro20e45672018-12-07 10:00:46 +0000533 cfb_get_display_parameter(dev, CFB_DISPLAY_ROWS));
534
535 return 0;
536}
537
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200538static int cmd_get_param_cols(const struct shell *sh, size_t argc,
Diego Sueiro20e45672018-12-07 10:00:46 +0000539 char *argv[])
540{
541 ARG_UNUSED(argc);
542 ARG_UNUSED(argv);
543
544 if (!dev) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200545 shell_error(sh, HELP_INIT);
Diego Sueiro20e45672018-12-07 10:00:46 +0000546 return -ENODEV;
547 }
548
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200549 shell_print(sh, "param: %s=%d", param_name[CFB_DISPLAY_COLS],
Diego Sueiro20e45672018-12-07 10:00:46 +0000550 cfb_get_display_parameter(dev, CFB_DISPLAY_COLS));
551
552 return 0;
553}
554
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200555static int cmd_init(const struct shell *sh, size_t argc, char *argv[])
Diego Sueiro20e45672018-12-07 10:00:46 +0000556{
557 int err;
558
Johann Fischer4541f1f2021-11-26 18:31:38 +0100559 if (!device_is_ready(dev)) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200560 shell_error(sh, "Display device not ready");
Diego Sueiro20e45672018-12-07 10:00:46 +0000561 return -ENODEV;
562 }
563
TOKITA Hiroshicccfc8f2023-02-23 09:43:26 +0900564 err = display_set_pixel_format(dev, PIXEL_FORMAT_MONO10);
565 if (err) {
566 err = display_set_pixel_format(dev, PIXEL_FORMAT_MONO01);
567 if (err) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200568 shell_error(sh, "Failed to set required pixel format: %d", err);
TOKITA Hiroshicccfc8f2023-02-23 09:43:26 +0900569 return err;
570 }
571 }
572
TOKITA Hiroshi279c7222023-02-23 09:40:09 +0900573 err = display_blanking_off(dev);
574 if (err) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200575 shell_error(sh, "Failed to turn off display blanking: %d", err);
TOKITA Hiroshi279c7222023-02-23 09:40:09 +0900576 return err;
577 }
578
Diego Sueiro20e45672018-12-07 10:00:46 +0000579 err = cfb_framebuffer_init(dev);
580 if (err) {
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200581 shell_error(sh, "Framebuffer initialization failed!");
Diego Sueiro20e45672018-12-07 10:00:46 +0000582 return err;
583 }
584
Gerard Marull-Paretas667eeb12023-04-13 18:59:37 +0200585 shell_print(sh, "Framebuffer initialized: %s", dev->name);
586 cmd_clear(sh, argc, argv);
Diego Sueiro20e45672018-12-07 10:00:46 +0000587
588 return err;
589}
590
Krzysztof Chruscinski3605e482019-02-13 14:53:29 +0100591SHELL_STATIC_SUBCMD_SET_CREATE(sub_cmd_get_param,
Diego Sueiro20e45672018-12-07 10:00:46 +0000592
593 SHELL_CMD_ARG(all, NULL, NULL, cmd_get_param_all, 1, 0),
594 SHELL_CMD_ARG(height, NULL, NULL, cmd_get_param_height, 1, 0),
595 SHELL_CMD_ARG(width, NULL, NULL, cmd_get_param_width, 1, 0),
596 SHELL_CMD_ARG(ppt, NULL, NULL, cmd_get_param_ppt, 1, 0),
597 SHELL_CMD_ARG(rows, NULL, NULL, cmd_get_param_rows, 1, 0),
598 SHELL_CMD_ARG(cols, NULL, NULL, cmd_get_param_cols, 1, 0),
599 SHELL_SUBCMD_SET_END
Krzysztof Chruscinski3605e482019-02-13 14:53:29 +0100600);
Diego Sueiro20e45672018-12-07 10:00:46 +0000601
Krzysztof Chruscinski3605e482019-02-13 14:53:29 +0100602SHELL_STATIC_SUBCMD_SET_CREATE(sub_cmd_scroll,
Diego Sueiro20e45672018-12-07 10:00:46 +0000603
604 SHELL_CMD_ARG(vertical, NULL, HELP_PRINT, cmd_scroll_vert, 4, 0),
605 SHELL_CMD_ARG(horizontal, NULL, HELP_PRINT, cmd_scroll_horz, 4, 0),
606 SHELL_SUBCMD_SET_END
Krzysztof Chruscinski3605e482019-02-13 14:53:29 +0100607);
Diego Sueiro20e45672018-12-07 10:00:46 +0000608
TOKITA Hiroshie2c94652023-01-14 16:07:05 +0900609SHELL_STATIC_SUBCMD_SET_CREATE(sub_cmd_draw,
610 SHELL_CMD_ARG(text, NULL, HELP_PRINT, cmd_draw_text, 4, 0),
TOKITA Hiroshi39c82882023-04-13 07:31:36 +0900611 SHELL_CMD_ARG(point, NULL, HELP_DRAW_POINT, cmd_draw_point, 3, 0),
TOKITA Hiroshi182c55f2023-04-13 06:43:39 +0900612 SHELL_CMD_ARG(line, NULL, HELP_DRAW_LINE, cmd_draw_line, 5, 0),
TOKITA Hiroshi92efbee2023-04-13 07:29:48 +0900613 SHELL_CMD_ARG(rect, NULL, HELP_DRAW_RECT, cmd_draw_rect, 5, 0),
TOKITA Hiroshie2c94652023-01-14 16:07:05 +0900614 SHELL_SUBCMD_SET_END
615);
616
Krzysztof Chruscinski3605e482019-02-13 14:53:29 +0100617SHELL_STATIC_SUBCMD_SET_CREATE(cfb_cmds,
Diego Sueiro20e45672018-12-07 10:00:46 +0000618 SHELL_CMD_ARG(init, NULL, HELP_NONE, cmd_init, 1, 0),
619 SHELL_CMD_ARG(get_device, NULL, HELP_NONE, cmd_get_device, 1, 0),
620 SHELL_CMD(get_param, &sub_cmd_get_param,
621 "<all, height, width, ppt, rows, cols>", NULL),
622 SHELL_CMD_ARG(get_fonts, NULL, HELP_NONE, cmd_get_fonts, 1, 0),
623 SHELL_CMD_ARG(set_font, NULL, "<idx>", cmd_set_font, 2, 0),
Simon Frank5d9db9d2023-02-28 10:02:54 +0100624 SHELL_CMD_ARG(set_kerning, NULL, "<kerning>", cmd_set_kerning, 2, 0),
TOKITA Hiroshi47f14d62023-01-13 19:59:35 +0900625 SHELL_CMD_ARG(invert, NULL, HELP_INVERT, cmd_invert, 1, 5),
Diego Sueiro20e45672018-12-07 10:00:46 +0000626 SHELL_CMD_ARG(print, NULL, HELP_PRINT, cmd_print, 4, 0),
627 SHELL_CMD(scroll, &sub_cmd_scroll, "scroll a text in vertical or "
628 "horizontal direction", NULL),
TOKITA Hiroshie2c94652023-01-14 16:07:05 +0900629 SHELL_CMD(draw, &sub_cmd_draw, "drawing text", NULL),
Diego Sueiro20e45672018-12-07 10:00:46 +0000630 SHELL_CMD_ARG(clear, NULL, HELP_NONE, cmd_clear, 1, 0),
631 SHELL_SUBCMD_SET_END
Krzysztof Chruscinski3605e482019-02-13 14:53:29 +0100632);
Diego Sueiro20e45672018-12-07 10:00:46 +0000633
634SHELL_CMD_REGISTER(cfb, &cfb_cmds, "Character Framebuffer shell commands",
635 NULL);