| #include <common.h> |
| #include <lcd.h> |
| #include <command.h> |
| #include <asm/byteorder.h> |
| #include <malloc.h> |
| #include <splash.h> |
| #include <video_fb.h> |
| #include <video.h> |
| |
| int osd_enabled = 0; |
| /* Graphic Device */ |
| static GraphicDevice *gdev = NULL; |
| |
| extern void osd_debug(void); |
| extern void osd_set_log_level(int); |
| extern void osd_test(void); |
| extern void osd_enable_hw(u32 index, u32 enable); |
| extern void osd_set_free_scale_enable_hw(u32 index, u32 enable); |
| |
| static int do_osd_open(cmd_tbl_t *cmdtp, int flag, int argc, |
| char *const argv[]) |
| { |
| gdev = video_hw_init(); |
| if (gdev == NULL) { |
| printf("Initialize video device failed!\n"); |
| return 1; |
| } |
| osd_enabled = 1; |
| return 0; |
| } |
| |
| static int do_osd_enable(cmd_tbl_t *cmdtp, int flag, int argc, |
| char *const argv[]) |
| { |
| ulong index = 0; |
| |
| index = simple_strtoul(getenv("display_layer"), NULL, 0); |
| osd_enable_hw(index, 0); |
| |
| return 0; |
| } |
| |
| static int do_osd_close(cmd_tbl_t *cmdtp, int flag, int argc, |
| char *const argv[]) |
| { |
| if (gdev == NULL) |
| return 1; |
| |
| gdev = NULL; |
| osd_enable_hw(0, 0); |
| osd_enable_hw(1, 0); |
| osd_set_free_scale_enable_hw(0, 0); |
| osd_set_free_scale_enable_hw(1, 0); |
| osd_enabled = 0; |
| return 0; |
| } |
| |
| static int do_osd_clear(cmd_tbl_t *cmdtp, int flag, int argc, |
| char *const argv[]) |
| { |
| if (gdev == NULL) { |
| printf("Please enable osd device first!\n"); |
| return 1; |
| } |
| |
| #ifdef CONFIG_OSD_SCALE_ENABLE |
| memset((void *)(long long)(gdev->frameAdrs), 0, |
| (gdev->fb_width * gdev->fb_height)*gdev->gdfBytesPP); |
| |
| flush_cache(gdev->frameAdrs, |
| ((gdev->fb_width * gdev->fb_height)*gdev->gdfBytesPP)); |
| #else |
| memset((void *)(long long)(gdev->frameAdrs), 0, |
| (gdev->winSizeX * gdev->winSizeY)*gdev->gdfBytesPP); |
| |
| flush_cache(gdev->frameAdrs, |
| ((gdev->winSizeX * gdev->winSizeY)*gdev->gdfBytesPP)); |
| #endif |
| return 0; |
| } |
| |
| static int do_osd_debug(cmd_tbl_t *cmdtp, int flag, int argc, |
| char *const argv[]) |
| { |
| int ret = 0; |
| int level = 0; |
| |
| switch (argc) { |
| case 1: |
| osd_debug(); |
| break; |
| case 2: |
| level = simple_strtoul(argv[1], NULL, 10); |
| osd_set_log_level(level); |
| break; |
| default: |
| return CMD_RET_USAGE; |
| } |
| |
| return ret; |
| } |
| |
| static int do_osd_test(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) |
| { |
| int ret = 0; |
| |
| osd_test(); |
| |
| return ret; |
| } |
| |
| static int do_osd_display(cmd_tbl_t *cmdtp, int flag, int argc, |
| char *const argv[]) |
| { |
| int ret = 0; |
| int x = 0, y = 0; |
| ulong addr; |
| |
| if (gdev == NULL) { |
| printf("do_osd_display, enable osd device first!\n"); |
| return 1; |
| } |
| |
| splash_get_pos(&x, &y); |
| |
| switch (argc) { |
| case 1: /* use load_addr as default address */ |
| addr = load_addr; |
| break; |
| case 2: /* use argument */ |
| addr = simple_strtoul(argv[1], NULL, 16); |
| break; |
| case 4: |
| addr = simple_strtoul(argv[1], NULL, 16); |
| x = simple_strtoul(argv[2], NULL, 10); |
| y = simple_strtoul(argv[3], NULL, 10); |
| break; |
| default: |
| return CMD_RET_USAGE; |
| } |
| |
| ret = video_display_bitmap((unsigned long)addr, x, y); |
| |
| return ret; |
| } |
| |
| static int do_osd_setcolor(cmd_tbl_t *cmdtp, int flag, int argc, |
| char *const argv[]) |
| { |
| ulong addr = 0; |
| int h = 0, w = 0; |
| int size = 0; |
| int i = 0; |
| ulong val = 0; |
| unsigned int *ptr = NULL; |
| |
| char *str = getenv("fb_addr"); |
| if (str == NULL) { |
| printf("failed to get fb_addr"); |
| return 1; |
| } else { |
| addr = simple_strtoul(str, NULL, 16); |
| printf("osd fb addr: 0x%lx\n", addr); |
| } |
| str = getenv("fb_height"); |
| if (str == NULL) { |
| printf("failed to get fb_heigh"); |
| h = 1080; |
| } else { |
| h = simple_strtoul(str, NULL, 16); |
| } |
| printf("osd fb addr: 0x%x\n", h); |
| |
| str = getenv("fb_width"); |
| if (str == NULL) { |
| printf("failed to get fb_width"); |
| w = 1920; |
| } else { |
| w = simple_strtoul(str, NULL, 16); |
| } |
| printf("osd fb addr: 0x%x\n", w); |
| if (gdev == NULL) { |
| printf("do_osd_display, enable osd device first!\n"); |
| return 1; |
| } |
| |
| size = ((w * h) >> 2 ); |
| |
| val = simple_strtoul(argv[1], NULL, 16); |
| ptr = (unsigned int *)addr; |
| for (i=0; i < size; i++) { |
| *ptr = val; |
| ptr++; |
| } |
| |
| return 0; |
| } |
| static cmd_tbl_t cmd_osd_sub[] = { |
| U_BOOT_CMD_MKENT(open, 2, 0, do_osd_open, "", ""), |
| U_BOOT_CMD_MKENT(enable, 2, 0, do_osd_enable, "", ""), |
| U_BOOT_CMD_MKENT(close, 2, 0, do_osd_close, "", ""), |
| U_BOOT_CMD_MKENT(clear, 2, 0, do_osd_clear, "", ""), |
| U_BOOT_CMD_MKENT(debug, 2, 0, do_osd_debug, "", ""), |
| U_BOOT_CMD_MKENT(test, 2, 0, do_osd_test, "", ""), |
| U_BOOT_CMD_MKENT(display, 5, 0, do_osd_display, "", ""), |
| U_BOOT_CMD_MKENT(setcolor, 2, 0, do_osd_setcolor, "", ""), |
| }; |
| |
| static int do_osd(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) |
| { |
| cmd_tbl_t *c; |
| |
| /* Strip off leading 'osd' command argument */ |
| argc--; |
| argv++; |
| |
| c = find_cmd_tbl(argv[0], &cmd_osd_sub[0], ARRAY_SIZE(cmd_osd_sub)); |
| |
| if (c) |
| return c->cmd(cmdtp, flag, argc, argv); |
| else |
| return CMD_RET_USAGE; |
| } |
| |
| U_BOOT_CMD( |
| osd, 5, 1, do_osd, |
| "osd sub-system", |
| "open - open osd device\n" |
| "osd enable - enable osd device\n" |
| "osd close - close osd device\n" |
| "osd clear - clear osd framebuffer\n" |
| "osd debug - debug osd device\n" |
| "osd test - test osd device\n" |
| "osd display <imageAddr> [x y] - display image\n" |
| "osd setcolor <color-rgb-value> - display color bg\n" |
| ); |
| |