1 /*
2 * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 *
17 */
18
19 #include <common.h>
20 #include <command.h>
21 #include "hi3559av100_vo.h"
22
23 #define CMD_VO_ARGS_BASE10 10
24 #define CMD_VO_ARGS_BASE16 16
25 #define CMD_VO_ARGS_BASE_ALL 0
26
27 extern int set_vobg(unsigned int dev, unsigned int rgb);
28 extern int start_vo(unsigned int dev, unsigned int type, unsigned int sync);
29 extern int stop_vo(unsigned int dev);
30 extern int start_gx(unsigned int layer, unsigned long addr, unsigned int strd, hi_vo_rect gx_rect);
31 extern int stop_gx(unsigned int layer);
32 extern int start_videolayer(unsigned int layer, unsigned long addr, unsigned int strd, hi_vo_rect layer_rect);
33 extern int stop_videolayer(unsigned int layer);
34
35 #if CONFIG_HI_HDMI_SUPPORT
36 extern int hdmi_display(unsigned int vosync, unsigned int input, unsigned int output);
37 extern void hdmi_stop(void);
38 #endif
39
40 extern int mipi_tx_display(unsigned int vosync);
41 extern int mipi_tx_stop(void);
42
43 #define VO_DEV_MAX_NUM 3
44 static unsigned int g_a_interface_type[VO_DEV_MAX_NUM] = {[0 ... (VO_DEV_MAX_NUM - 1)] = 0};
45
vo_is_lcd_intf(unsigned int intf_type)46 static int vo_is_lcd_intf(unsigned int intf_type)
47 {
48 if (VO_INTF_LCD & intf_type ||
49 VO_INTF_LCD_8BIT & intf_type ||
50 VO_INTF_LCD_6BIT & intf_type ||
51 VO_INTF_LCD_16BIT & intf_type ||
52 VO_INTF_LCD_18BIT & intf_type ||
53 VO_INTF_LCD_24BIT & intf_type) {
54 return 1;
55 }
56 return 0;
57 }
58
vou_drv_check_lcd_sync(vo_dev dev,unsigned int intf_type,unsigned int intf_sync)59 static int vou_drv_check_lcd_sync(vo_dev dev, unsigned int intf_type, unsigned int intf_sync)
60 {
61 if (dev == VO_DEV_DHD0) {
62 if (intf_sync != VO_OUTPUT_USER) {
63 printf("DHD0 only support VO_OUTPUT_USER when intf is LCD!\n");
64 return -1;
65 }
66 }
67
68 if (VO_INTF_LCD_8BIT & intf_type) {
69 if (intf_sync != VO_OUTPUT_320x240_60) {
70 printf("for LCD 8bit intface,vo%u's intfsync %u illegal!\n", dev, intf_sync);
71 return -1;
72 }
73 }
74
75 if (VO_INTF_LCD_6BIT & intf_type) {
76 if ((intf_sync < VO_OUTPUT_320x240_50) || (intf_sync > VO_OUTPUT_240x320_50)) {
77 printf("for LCD 6bit intface,vo%u's intfsync %u illegal!\n", dev, intf_sync);
78 return -1;
79 }
80 }
81
82 if (VO_INTF_LCD_16BIT & intf_type) {
83 if (intf_sync != VO_OUTPUT_240x320_60) {
84 printf("for LCD 16bit intface,vo%u's intfsync %u illegal!\n", dev, intf_sync);
85 return -1;
86 }
87 }
88
89 if (VO_INTF_LCD_18BIT & intf_type) {
90 if (intf_sync != VO_OUTPUT_240x320_60) {
91 printf("for LCD 18bit intface,vo%u's intfsync %u illegal!\n", dev, intf_sync);
92 return -1;
93 }
94 }
95
96 if (VO_INTF_LCD_24BIT & intf_type) {
97 if (intf_sync != VO_OUTPUT_800x600_50) {
98 printf("for LCD 24bit intface,vo%u's intfsync %u illegal!\n", dev, intf_sync);
99 return -1;
100 }
101 }
102
103 return 0;
104 }
105
check_vo_support(unsigned int dev,unsigned int type,unsigned int sync)106 static int check_vo_support(unsigned int dev, unsigned int type, unsigned int sync)
107 {
108 /* check interface type, ONLY VGA & HDMI interface is supported. */
109 if (dev == VO_DEV_DHD0) {
110 if ((type & ~(VO_INTF_MIPI | VO_INTF_HDMI | VO_INTF_BT656 |
111 VO_INTF_BT1120 | VO_INTF_LCD_8BIT | VO_INTF_LCD_6BIT |
112 VO_INTF_LCD_16BIT | VO_INTF_LCD_18BIT | VO_INTF_LCD_24BIT)) ||
113 (type == 0)) {
114 printf("hd%u only supports HDMI,BT.656,BT.1120,mipi_tx,lcd intftype, intf %u is illegal!\n", dev, type);
115 return -1;
116 }
117 /* just one interface at the the time for a dev. */
118 if ((type & ~(VO_INTF_HDMI | VO_INTF_MIPI)) &&
119 (type & ~VO_INTF_BT656) &&
120 (type & ~VO_INTF_LCD_8BIT) &&
121 (type & ~VO_INTF_LCD_6BIT) &&
122 (type & ~VO_INTF_LCD_18BIT) &&
123 (type & ~VO_INTF_LCD_16BIT) &&
124 (type & ~VO_INTF_LCD_24BIT)) {
125 printf("for VO %u, only HDMI+MIPI can be used at the same time!\n",
126 dev);
127 return -1;
128 }
129 } else if (dev == VO_DEV_DHD1) {
130 if ((type & ~(VO_INTF_BT1120 | VO_INTF_BT656 | VO_INTF_MIPI |
131 VO_INTF_LCD_6BIT | VO_INTF_LCD_8BIT | VO_INTF_LCD_16BIT |
132 VO_INTF_LCD_18BIT | VO_INTF_LCD_24BIT)) || (type == 0)) {
133 printf("hd%u only supports BT.656,BT.1120,mipi_tx,LCD intftype, intf %u is illegal!\n", dev, type);
134 return -1;
135 }
136 /* just one interface at the the time for a dev. */
137 if ((type & ~VO_INTF_BT1120) && (type & ~VO_INTF_BT656) && (type & ~VO_INTF_MIPI) &&
138 (type & ~VO_INTF_LCD_6BIT) && (type & ~VO_INTF_LCD_8BIT) &&
139 (type & ~VO_INTF_LCD_16BIT) && (type & ~VO_INTF_LCD_18BIT) && (type & ~VO_INTF_LCD_24BIT)) {
140 printf("vo(%u), none of (BT.1120,BT.656,MIPI,LCD) can use at the same time!\n",
141 dev);
142 return -1;
143 }
144
145 } else {
146 printf("unknow dev(%u)!\n", dev);
147 return -1;
148 }
149
150 if (sync == VO_OUTPUT_USER) {
151 return 0;
152 }
153
154 /* check interface sync. */
155 if (VO_INTF_HDMI & type) {
156 if ((sync < VO_OUTPUT_1080P24) ||
157 (VO_OUTPUT_1080I50 == sync) ||
158 (VO_OUTPUT_1080I60 == sync) ||
159 (VO_OUTPUT_960H_PAL == sync) ||
160 (VO_OUTPUT_960H_NTSC == sync) ||
161 ((sync >= VO_OUTPUT_320x240_60) && (sync <= VO_OUTPUT_1080x1920_60)) ||
162 (sync == VO_OUTPUT_7680x4320_30) ||
163 (sync >= VO_OUTPUT_USER)) {
164 printf("vo%u's intfsync %u illegal!\n", dev, sync);
165 return -1;
166 }
167 }
168
169 if (VO_INTF_BT1120 & type) {
170 if (dev == VO_DEV_DHD0) {
171 if ((sync < VO_OUTPUT_1080P24) ||
172 (VO_OUTPUT_1080I60 == sync) ||
173 (VO_OUTPUT_1080I50 == sync) ||
174 (sync > VO_OUTPUT_640x480_60)) {
175 printf("vo%u's intfsync %u illegal!\n", dev, sync);
176 return -1;
177 }
178 } else if (dev == VO_DEV_DHD1) {
179 if ((sync < VO_OUTPUT_1080P24) ||
180 (sync > VO_OUTPUT_480P60)) {
181 printf("vo%u's intfsync %u illegal!\n", dev, sync);
182 return -1;
183 }
184 }
185 }
186
187 if (VO_INTF_MIPI & type) {
188 if (dev == VO_DEV_DHD0) {
189 if ((sync != VO_OUTPUT_576P50) &&
190 (sync != VO_OUTPUT_720P50) &&
191 (sync != VO_OUTPUT_720P60) &&
192 (sync != VO_OUTPUT_1024x768_60) &&
193 (sync != VO_OUTPUT_1280x1024_60) &&
194 (sync != VO_OUTPUT_720x1280_60) &&
195 (sync != VO_OUTPUT_1080x1920_60) &&
196 (sync != VO_OUTPUT_1080P60)) {
197 printf("vo%u's intfsync %u illegal!\n", dev, sync);
198 return -1;
199 }
200 } else if (dev == VO_DEV_DHD1) {
201 if ((sync != VO_OUTPUT_576P50) &&
202 (sync != VO_OUTPUT_720P50) &&
203 (sync != VO_OUTPUT_720P60) &&
204 (sync != VO_OUTPUT_1024x768_60) &&
205 (sync != VO_OUTPUT_1280x1024_60) &&
206 (sync != VO_OUTPUT_720x1280_60) &&
207 (sync != VO_OUTPUT_1080x1920_60) &&
208 (sync != VO_OUTPUT_1080P60)) {
209 printf("vo%u's intfsync %u illegal!\n", dev, sync);
210 return -1;
211 }
212 }
213 }
214
215 if (vo_is_lcd_intf(type)) {
216 if (vou_drv_check_lcd_sync(dev, type, sync) != 0) {
217 return -1;
218 }
219 }
220
221 return 0;
222 }
223
do_vobg(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])224 static int do_vobg(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
225 {
226 unsigned int dev, rgb;
227
228 if (argc < 3) {
229 printf("insufficient parameter!\n");
230 printf("usage:\n%s\n", cmdtp->usage);
231 return -1;
232 }
233
234 dev = (unsigned int)simple_strtoul(argv[1], NULL, CMD_VO_ARGS_BASE10);
235 rgb = (unsigned int)simple_strtoul(argv[2], NULL, CMD_VO_ARGS_BASE_ALL);
236 if (dev >= VO_DEV_BUTT) {
237 printf("invalid parameter!\n");
238 return -1;
239 }
240
241 set_vobg(dev, rgb);
242
243 printf("dev %u set background color!\n", dev);
244
245 return 0;
246 }
247
do_startvo(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])248 static int do_startvo(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
249 {
250 unsigned int dev, intftype, sync;
251
252 if (argc < 4) {
253 printf("insufficient parameter!\n");
254 printf("usage:\n%s\n", cmdtp->usage);
255 return -1;
256 }
257
258 dev = (unsigned int)simple_strtoul(argv[1], NULL, CMD_VO_ARGS_BASE10);
259 intftype = (unsigned int)simple_strtoul(argv[2], NULL, CMD_VO_ARGS_BASE10);
260 sync = (unsigned int)simple_strtoul(argv[3], NULL, CMD_VO_ARGS_BASE10);
261 if ((dev >= VO_DEV_BUTT) || (sync >= VO_OUTPUT_BUTT)) {
262 printf("invalid parameter!\n");
263 return -1;
264 }
265
266 if (check_vo_support(dev, intftype, sync)) {
267 printf("unsupport parameter!\n");
268 return -1;
269 }
270
271 start_vo(dev, intftype, sync);
272
273 g_a_interface_type[dev] = intftype;
274
275 #if CONFIG_HI_HDMI_SUPPORT
276 if (intftype & VO_INTF_HDMI) {
277 if (intftype == (VO_INTF_HDMI | VO_INTF_MIPI)) {
278 hdmi_display(sync, 0, 2);
279 } else {
280 hdmi_display(sync, 2, 2);
281 }
282 }
283 #endif
284
285 if (intftype & VO_INTF_MIPI) {
286 // to call mipi_display.
287 mipi_tx_display(sync);
288 }
289
290 if (vo_is_lcd_intf(intftype)) {
291 g_a_interface_type[dev] = intftype;
292 }
293
294 printf("dev %u opened!\n", dev);
295
296 return 0;
297 }
298
do_stopvo(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])299 static int do_stopvo(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
300 {
301 unsigned int dev;
302 if (argc < 2) {
303 printf("insufficient parameter!\n");
304 printf("usage:\n%s\n", cmdtp->usage);
305 return -1;
306 }
307
308 dev = (unsigned int)simple_strtoul(argv[1], NULL, CMD_VO_ARGS_BASE10);
309 if (dev >= VO_DEV_BUTT) {
310 printf("invalid parameter!\n");
311 return -1;
312 }
313 #if CONFIG_HI_HDMI_SUPPORT
314 if (g_a_interface_type[dev] & VO_INTF_HDMI) {
315 g_a_interface_type[dev] = 0;
316 hdmi_stop();
317 }
318 #endif
319
320 if (g_a_interface_type[dev] & VO_INTF_MIPI) {
321 g_a_interface_type[dev] = 0;
322 mipi_tx_stop();
323 }
324
325 if (vo_is_lcd_intf(g_a_interface_type[dev])) {
326 g_a_interface_type[dev] = 0;
327 }
328
329 stop_vo(dev);
330
331 printf("dev %u closed!\n", dev);
332
333 return 0;
334 }
335
do_startgx(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])336 static int do_startgx(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
337 {
338 unsigned int layer, strd, x, y, w, h;
339 unsigned long addr;
340 hi_vo_rect gx_rect;
341 int max_x, max_y, layer_max_w, layer_max_h;
342 if (argc < 8) {
343 printf("insufficient parameter!\n");
344 printf("usage:\n%s\n", cmdtp->usage);
345 return -1;
346 }
347
348 layer = (unsigned int)simple_strtoul(argv[1], NULL, CMD_VO_ARGS_BASE10);
349 addr = (unsigned long)simple_strtoul(argv[2], NULL, CMD_VO_ARGS_BASE16);
350 strd = (unsigned int)simple_strtoul(argv[3], NULL, CMD_VO_ARGS_BASE10);
351 x = (unsigned int)simple_strtoul(argv[4], NULL, CMD_VO_ARGS_BASE10);
352 y = (unsigned int)simple_strtoul(argv[5], NULL, CMD_VO_ARGS_BASE10);
353 w = (unsigned int)simple_strtoul(argv[6], NULL, CMD_VO_ARGS_BASE10);
354 h = (unsigned int)simple_strtoul(argv[7], NULL, CMD_VO_ARGS_BASE10);
355
356 if (layer == VO_GRAPHC_G0) {
357 max_x = PIC_MAX_WIDTH;
358 max_y = PIC_MAX_HEIGHT;
359 layer_max_w = GFX0_PIC_MAX_WIDTH;
360 layer_max_h = GFX0_PIC_MAX_HEIGHT;
361 } else if (layer == VO_GRAPHC_G1) {
362 max_x =GFX1_PIC_MAX_WIDTH;
363 max_y = GFX1_PIC_MAX_HEIGHT;
364 layer_max_w = GFX1_PIC_MAX_WIDTH;
365 layer_max_h = GFX1_PIC_MAX_HEIGHT;
366 } else {
367 printf("invalid parameter!\n");
368 return -1;
369 }
370
371 if((strd > (layer_max_w * 2)) ||
372 (x > max_x) || (x & 0x1) ||
373 (y > max_y) || (y & 0x1) ||
374 (w > layer_max_w) || (w & 0x1) || (w < PIC_MIN_LENTH) ||
375 (h > layer_max_h) || (h & 0x1) || (h < PIC_MIN_LENTH)) {
376 printf("invalid parameter!\n");
377 return -1;
378 }
379
380 gx_rect.x = x;
381 gx_rect.y = y;
382 gx_rect.w = w;
383 gx_rect.h = h;
384
385 start_gx(layer, addr, strd, gx_rect);
386
387 printf("graphic layer %u opened!\n", layer);
388
389 return 0;
390 }
391
do_stopgx(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])392 static int do_stopgx(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
393 {
394 unsigned int layer;
395
396 if (argc < 2) {
397 printf("insufficient parameter!\n");
398 printf("usage:\n%s\n", cmdtp->usage);
399 return -1;
400 }
401
402 layer = (unsigned int)simple_strtoul(argv[1], NULL, CMD_VO_ARGS_BASE10);
403
404 if (layer >= VO_GRAPHC_BUTT) {
405 printf("invalid parameter!\n");
406 return -1;
407 }
408
409 stop_gx(layer);
410
411 printf("graphic layer %u closed!\n", layer);
412
413 return 0;
414 }
415
do_startvl(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])416 static int do_startvl(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
417 {
418 unsigned int layer, strd, x, y, w, h;
419 unsigned long addr;
420 hi_vo_rect layer_rect;
421 int max_x, max_y, layer_max_w, layer_max_h;
422
423 if (argc < 8) {
424 printf("insufficient parameter!\n");
425 printf("usage:\n%s\n", cmdtp->usage);
426 return -1;
427 }
428
429 layer = (unsigned int)simple_strtoul(argv[1], NULL, CMD_VO_ARGS_BASE10);
430 addr = (unsigned long)simple_strtoul(argv[2], NULL, CMD_VO_ARGS_BASE16);
431 strd = (unsigned int)simple_strtoul(argv[3], NULL, CMD_VO_ARGS_BASE10);
432 x = (unsigned int)simple_strtoul(argv[4], NULL, CMD_VO_ARGS_BASE10);
433 y = (unsigned int)simple_strtoul(argv[5], NULL, CMD_VO_ARGS_BASE10);
434 w = (unsigned int)simple_strtoul(argv[6], NULL, CMD_VO_ARGS_BASE10);
435 h = (unsigned int)simple_strtoul(argv[7], NULL, CMD_VO_ARGS_BASE10);
436
437 if (layer == VO_LAYER_VHD0) {
438 max_x = VHD0_PIC_MAX_WIDTH;
439 max_y = VHD0_PIC_MAX_HEIGHT;
440 layer_max_w = VHD0_PIC_MAX_WIDTH;
441 layer_max_h = VHD0_PIC_MAX_HEIGHT;
442 } else if (layer == VO_LAYER_VHD1) {
443 max_x =VHD1_PIC_MAX_WIDTH;
444 max_y = VHD1_PIC_MAX_HEIGHT;
445 layer_max_w = VHD1_PIC_MAX_WIDTH;
446 layer_max_h = VHD1_PIC_MAX_HEIGHT;
447 } else {
448 printf("invalid parameter!\n");
449 return -1;
450 }
451
452 if((strd > (layer_max_w * 2)) ||
453 (x > max_x) || (x & 0x1) ||
454 (y > max_y) || (y & 0x1) ||
455 (w > layer_max_w) || (w & 0x1) || (w < PIC_MIN_LENTH) ||
456 (h > layer_max_h) || (h & 0x1) || (h < PIC_MIN_LENTH)) {
457 printf("invalid parameter!\n");
458 return -1;
459 }
460
461 layer_rect.x = x;
462 layer_rect.y = y;
463 layer_rect.w = w;
464 layer_rect.h = h;
465
466 start_videolayer(layer, addr, strd, layer_rect);
467
468 printf("video layer %u opened!\n", layer);
469
470 return 0;
471 }
472
do_stopvl(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])473 static int do_stopvl(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
474 {
475 unsigned int layer;
476
477 if (argc < 2) {
478 printf("insufficient parameter!\n");
479 printf("usage:\n%s\n", cmdtp->usage);
480 return -1;
481 }
482
483 layer = (unsigned int)simple_strtoul(argv[1], NULL, CMD_VO_ARGS_BASE10);
484
485 if ((layer > VO_LAYER_VSD0) || (layer == VO_LAYER_VP)) {
486 printf("invalid parameter!\n");
487 return -1;
488 }
489
490 stop_videolayer(layer);
491
492 printf("video layer %u closed!\n", layer);
493
494 return 0;
495 }
496
497 U_BOOT_CMD(startvo, CFG_MAXARGS, 1, do_startvo,
498 "startvo - open vo device with a certain output interface.\n"
499 "\t- startvo [dev intftype sync]",
500 "\nargs: [dev, intftype, sync]\n"
501 "\t-<dev> : 0: DHD0,1: DHD1\n"
502 "\t-<intftype>: 8(BT.656),16(BT.1120),32(HDMI),64(LCD),1024(LCD_8BIT),16384(mipi_tx)\n"
503 "\t-<sync>:\n"
504 "\t\t0(PAL), 1(NTSC), 2(1080P24), 3(1080P25)\n"
505 "\t\t4(1080P30), 5(720P50), 6(720P60), 7(1080I50)\n"
506 "\t\t8(1080I60), 9(1080P50), 10(1080P60), 11(576P50)\n"
507 "\t\t12(480P60), 13(800x600), 14(1024x768), 15(1280x1024)\n"
508 "\t\t16(1366x768), 17(1440x900), 18(1280x800), 19(1600x1200)\n"
509 "\t\t20(1680x1050), 21(1920x1200), 22(640x480), 23(960H_PAL)\n"
510 "\t\t24(960H_NTSC), 25(1920x2160), 26(2560x1440_30),27(2560x1440_60)\n"
511 "\t\t28(2560x1600_60),29(3840x2160_24),30(3840x2160_25),31(3840x2160_30)\n"
512 "\t\t32(3840x2160_50),33(3840x2160_60),34(4096x2160_24),35(4096x2160_25)\n"
513 "\t\t36(4096x2160_30),37(4096x2160_50),38(4096x2160_60),39(320x240_60)\n"
514 "\t\t40(320x240_50), 41(240x320_50), 42(240x320_60), 43(800x600_50)\n"
515 "\t\t44(720x1280_60), 45(1080x1920_60),46(7680x4320_30),47(user)\n");
516
517 U_BOOT_CMD(stopvo, CFG_MAXARGS, 1, do_stopvo,
518 "stopvo - close interface of vo device.\n"
519 "\t- stopvo [dev]",
520 "\nargs: [dev]\n"
521 "\t-<dev> : 0~1(HD0~1)\n");
522
523 U_BOOT_CMD(startgx, CFG_MAXARGS, 1, do_startgx,
524 "startgx - open graphics layer.\n"
525 "\t- startgx [layer addr stride x y w h]\n",
526 "\nargs: [layer, addr, stride, x, y, w, h]\n"
527 "\t-<layer> : 0(G0), 1(G1)\n"
528 "\t-<addr> : picture address\n"
529 "\t-<stride> : picture stride\n"
530 "\t-<x,y,w,h> : display area\n");
531
532 U_BOOT_CMD(stopgx, CFG_MAXARGS, 1, do_stopgx,
533 "stopgx - close graphics layer.\n"
534 "\t- stopgx [layer]",
535 "\nargs: [layer]\n"
536 "\t-<layer> : 0(G0), 1(G1)\n");
537
538 U_BOOT_CMD(startvl, CFG_MAXARGS, 1, do_startvl,
539 "startvl - open video layer.\n"
540 "\t- startvl [layer addr stride x y w h]\n",
541 "\nargs: [layer, addr, stride, x, y, w, h]\n"
542 "\t-<layer> : 0(V0), 1(V1)\n"
543 "\t-<addr> : picture address\n"
544 "\t-<stride> : picture stride\n"
545 "\t-<x,y,w,h> : display area\n");
546
547 U_BOOT_CMD(stopvl, CFG_MAXARGS, 1, do_stopvl,
548 "stopvl - close video layer.\n"
549 "\t- stopvl [layer]",
550 "\nargs: [layer]\n"
551 "\t-<layer> : 0(V0), 1(V1)\n");
552
553 U_BOOT_CMD(setvobg, CFG_MAXARGS, 1, do_vobg,
554 "setvobg - set vo backgroud color.\n"
555 "\t- setvobg [dev color]",
556 "\nargs: [dev, color]\n"
557 "\t-<dev> : 0~1(HD0~1)\n"
558 "\t-<color>: rgb color space\n");
559