/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */ /* * common/cmd_ui.c * * Copyright (C) 2020 Amlogic, Inc. All rights reserved. * */ #include #include #include #include #include void set_fastboot_flag(int flag); static int ui_inited = 0; extern unsigned int ui_log_level; typedef struct { grfont *font; const char *font_name; } LIB_FONT; typedef struct { grsurface *surface; const char *pic_name; } PIC_SURFACE; LIB_FONT lib_font[] = {{NULL, "font"}}; PIC_SURFACE pic_surface[] = {{NULL, "bootup"}, {NULL, "upgrade_error"}, {NULL, "upgrade_fail"}, {NULL, "upgrade_success"}}; static int do_ui_init(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) { int i; if (!ui_inited) { set_fastboot_flag(1); screen_init(); for (i =0; i < ARRAY_SIZE(lib_font); i++) { gr_init_ext_font(lib_font[i].font_name, &lib_font[i].font); } for (i =0; i < ARRAY_SIZE(pic_surface); i++) { surface_loadbmp(&pic_surface[i].surface, pic_surface[i].pic_name); } } ui_inited = 1; return 0; } static int do_ui_pic(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) { int i; if (!ui_inited) { printf("error: ui init first\n"); return -1; } else if (argc != 6) { return -1; } else { for (i =0; i < ARRAY_SIZE(pic_surface); i++) { if (!strcmp(argv[1], pic_surface[i].pic_name)) if (pic_surface[i].surface) { surface_disaplay(pic_surface[i].surface, simple_strtoul(argv[2], NULL, 10), simple_strtoul(argv[3], NULL, 10), simple_strtoul(argv[4], NULL, 10), simple_strtoul(argv[5], NULL, 10)); break; } } } if (i == ARRAY_SIZE(pic_surface)) { printf("error: blit pic %s to framebuffer fail\n", argv[1]); return -1; } return 0; } static int do_ui_pic_addr(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) { int ret = -1; grsurface *pic_surface; long addr; if (!ui_inited) { printf("error: ui init first\n"); ret = -1; } else if (argc != 6) { ret = -1; } else { addr = simple_strtoul(argv[1], NULL, 16); ret = surface_loadbmp_from_addr(&pic_surface, addr); if (ret >= 0) if (pic_surface) surface_disaplay(pic_surface, simple_strtoul(argv[2], NULL, 10), simple_strtoul(argv[3], NULL, 10), simple_strtoul(argv[4], NULL, 10), simple_strtoul(argv[5], NULL, 10)); } return 0; } static int do_ui_setcolor(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) { if (!ui_inited) { printf("error: ui init first\n"); return -1; } else { if (argc != 2) return -1; else screen_setcolor(simple_strtoul(argv[1], NULL, 16)); } return 0; } static int do_ui_text(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) { int i; if (!ui_inited) { printf("error: ui init first\n"); return -1; } else if (argc < 5) { return -1; } else { for (i =0; i < ARRAY_SIZE(lib_font); i++) { if (!strcmp(argv[1], lib_font[i].font_name)) if (lib_font[i].font) { screen_drawtextline(lib_font[i].font, simple_strtoul(argv[3], NULL, 10), simple_strtoul(argv[4], NULL, 10), argv[2], (argc >= 6 ? (simple_strtoul(argv[5], NULL, 10) == 1 ? 1 : 0) : 0)); break; } } } if (i == ARRAY_SIZE(lib_font)) { printf("error: use external font lib %s fail, use default font lib\n", argv[1]); screen_drawtextline(gr_sys_font(), simple_strtoul(argv[3], NULL, 10), simple_strtoul(argv[4], NULL, 10), argv[2], (argc >= 6 ? (simple_strtoul(argv[5], NULL, 10) == 1 ? 1 : 0) : 0)); } return 0; } static int do_ui_rect(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) { if (!ui_inited) { printf("error: ui init first\n"); return -1; } else if (argc != 5){ return -1; } else { screen_fillrect(simple_strtoul(argv[1], NULL, 10), simple_strtoul(argv[2], NULL, 10), simple_strtoul(argv[3], NULL, 10), simple_strtoul(argv[4], NULL, 10)); } return 0; } static int do_ui_update(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) { if (!ui_inited) { printf("error: ui init first\n"); return -1; } else { screen_update(); } return 0; } static int do_ui_uinit(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) { int i; if (!ui_inited) { printf("error: ui init first\n"); return -1; } else { for (i =0; i < ARRAY_SIZE(lib_font); i++) { if (lib_font[i].font) { if (lib_font[i].font->texture) { free(lib_font[i].font->texture); lib_font[i].font->texture = NULL; } free(lib_font[i].font); lib_font[i].font = NULL; } } for (i =0; i < ARRAY_SIZE(pic_surface); i++) { if (pic_surface[i].surface) { free(pic_surface[i].surface); pic_surface[i].surface = NULL; } } set_fastboot_flag(0); screen_uninit(); ui_inited = 0; } return 0; } static int do_ui_debug(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) { if (argc != 2) return -1; else ui_log_level = simple_strtoul(argv[1], NULL, 10); return 0; } static int do_ui_demo(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) { int ret = -1; grsurface *pic_surface; long addr; int i, j; int dx, dy, time; if (!ui_inited) { printf("error: ui init first\n"); ret = -1; } else if (argc != 5) { ret = -1; } else { addr = simple_strtoul(argv[1], NULL, 16); ret = surface_loadbmp_from_addr(&pic_surface, addr); dx = simple_strtoul(argv[2], NULL, 10); dy = simple_strtoul(argv[3], NULL, 10); time = simple_strtoul(argv[4], NULL, 10); if (ret >= 0) { if (pic_surface) { for (i = 0; i < 100; i++) { for (j = 0; j < i; j++) surface_disaplay(pic_surface, 0, 0, dx + 4 * j, dy); screen_update(); mdelay(time); } res_free_surface(pic_surface); } } } return 0; } static cmd_tbl_t cmd_ui_sub[] = { U_BOOT_CMD_MKENT(init, 2, 0, do_ui_init, "", ""), U_BOOT_CMD_MKENT(pic, 9, 0, do_ui_pic, "", ""), U_BOOT_CMD_MKENT(pic_addr, 9, 0, do_ui_pic_addr, "", ""), U_BOOT_CMD_MKENT(setcolor, 3, 0, do_ui_setcolor, "", ""), U_BOOT_CMD_MKENT(text, 7, 0, do_ui_text, "", ""), U_BOOT_CMD_MKENT(rect, 6, 0, do_ui_rect, "", ""), U_BOOT_CMD_MKENT(update, 2, 0, do_ui_update, "", ""), U_BOOT_CMD_MKENT(uinit, 2, 0, do_ui_uinit, "", ""), U_BOOT_CMD_MKENT(debug, 2, 0, do_ui_debug, "", ""), U_BOOT_CMD_MKENT(demo, 2, 0, do_ui_demo, "", ""), }; static int do_ui(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_ui_sub[0], ARRAY_SIZE(cmd_ui_sub)); if (c) return c->cmd(cmdtp, flag, argc, argv); else return CMD_RET_USAGE; } U_BOOT_CMD( ui, 9, 1, do_ui, "ui sub-system", "init - init device and init default font lib\n" "ui pic - blit pic to framebuffer\n" "ui pic_addr - blit pic to framebuffer from addr\n" "ui setcolor - set color\n" "ui text [bold] - fill text to framebuffer\n" "ui rect - fill rect to framebuffer\n" "ui update - update framebuffer to screen\n" "uinit - uinit device and free space\n" "ui debug - set log level\n" "ui demo addr time - ui demo progressbar\n" );