/************************************************************************************ * I.MX6 天嵌 E9 U-boot menu hacking * 说明: * 天嵌在U-boot中添加了自己的选择menu,想看一下怎么实现的。 * * 2016-8-5 深圳 南山平山村 曽剑锋 ***********************************************************************************/ void start_armboot (void) { ...... /* main_loop() can return to retry autoboot, if so just run it again. */ e9_board_lcd_poweron(0); for (;;) { main_loop (); ---------------------------------------------+ } | | /* NOTREACHED - no way out of command loop except booting */ | } | | void main_loop (void) <------------------------------------------+ { ...... /* * Main Loop for Monitor Command Processing */ #ifdef CONFIG_CMD_MENU run_command("menu", 0); ----------+ #endif | ...... | } | | U_BOOT_CMD( | menu, 3, 0, do_menu, <---------+-----------------+ "display a menu, to select the items to do something", | "\n" | "\tdisplay a menu, to select the items to do something" | ); | | int do_menu (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) <-----+ { ---------+ menu_shell(); | return 0; | } | | void menu_shell(void) <--------+ { char keyselect; char cmd_buf[512]; char *ptmp; do { printf("\r\n##### Boot for IMX6 Main Menu #####\r\n"); printf("[1]boot from emmc\n"); printf("[2]boot from sdcard\n"); printf("[3]boot from tftp\n"); printf("[5]download from sdcard\n"); printf("[0]setting boot args\n"); printf("[q]exit to command mode\n"); printf("Enter your selection: "); keyselect = getc(); printf("%c\n", keyselect); switch (keyselect) { #if 0 case '1': if(refresh_bootargs("emmc")==0) run_command("booti mmc3",0); break; case '2': if(refresh_bootargs("sdcard")==0) run_command("booti mmc1",0); break; case '3': if(refresh_bootargs("tftp_nfs")==0) { ptmp = getenv("kernelimgname"); sprintf(cmd_buf,"tftp 0x10800000 %s;bootm 0x10800000",ptmp); run_command(cmd_buf,0); } break; case '0': do_boot_para_setting(NULL); break; case '5': sprintf(cmd_buf,"booti mmc1 recovery",ptmp); run_command(cmd_buf,0); break; #endif case '1': ptmp = getenv("bootcmd"); if(strcmp(ptmp,"run bootcmd_mmc_ubuntu") == 0) run_command("run bootcmd_mmc_ubuntu", 0); else if (strcmp(ptmp,"run bootcmd_mmc_android") == 0) run_command("run bootcmd_mmc_android", 0); else run_command("run bootcmd_mmc_linux", 0); break; case '2': break; case '3': run_command("run bootcmd_net", 0); break; case '0': do_boot_para_setting(NULL); -------------+ break; | case '5': | sprintf(cmd_buf,"run bootargs_base_andorid; | booti mmc1 recovery",ptmp); | run_command(cmd_buf,0); | break; | | } | | } | while ((keyselect != 'q') && (keyselect != 'Q')); | } | | static int do_boot_para_setting(char *pbuf) <------------+ { int i; char c; do { printf("\r\n##### param setting #####\r\n"); printf("[1]setting nfs args\n"); printf("[2]setting tftp args\n"); printf("[3]setting display args\n"); printf("[4]setting default boot\n"); printf("[s]save setting\n"); printf("[q]quit\n"); printf("Enter your selection: "); c = getc(); printf("%c\n", c); switch (c) { case '1': do_nfs_para_setting(NULL); break; case '2': do_tftp_para_setting(NULL); break; case '3': do_disp_para_setting(NULL); -------------+ break; | case '4': | do_media_para_setting(NULL); | break; | case 's': | run_command("saveenv", 0); | break; | } | } | while (c != 'q'); | } | | static int do_disp_para_setting(char *pbuf) <------------+ { lcd_menu_shell(); -----------+ return 0; | } | | void lcd_menu_shell() <----------+ { char c; char cmd_buf[256]; char cmd_buf_all[256]; int need_renew = 0; while (1) { lcd_menu_usage(); c = getc(); printf("%c\n", c); if ((c == '1')) { sprintf(cmd_buf, " video=mxcfb0:"); if (lcd_setting(&cmd_buf[strlen(cmd_buf)]) != 0) { strcat(cmd_buf, " video=mxcfb1:off video=mxcfb2:off fbmem=48M"); sprintf(cmd_buf_all, "setenv displayArgs %s", cmd_buf); run_command(cmd_buf_all, 0); } } else if (c == '2') { for (;;) { printf("\r\n##### display select for android #####\r\n"); printf("[1] 800*600 for LVDS->VGA \r\n"); printf("[2] 1024*768 for FPC->VGA \r\n"); // video=mxcfb0:dev=lcd,if=RGB24,TQ-VGA_1024768,bpp=32 video=mxcfb1:dev=hdmi,1280x720M@60,if=RGB24,bpp=32 video=mxcfb2:off fbmem=28M,48M printf("[3] 1280*768 for FPC->VGA\r\n"); //video=mxcfb1:dev=lcd,if=RGB24,TQ-VGA_1280768,bpp=32 video=mxcfb0:dev=hdmi,1280x720M@60,if=RGB2em4,bpp=32 video=mxcfb2:off fbmem=28M,48M printf("[4] 1360*768 for FPC->VGA\r\n"); //video=mxcfb1:dev=lcd,if=RGB24,TQ-VGA_1360768,bpp=32 video=mxcfb0:dev=hdmi,1280x720M@60,if=RGB2em4,bpp=32 video=mxcfb2:off fbmem=28M,48M printf("[5] 1920*1080 for FPC->VGA\r\n"); //video=mxcfb1:dev=lcd,if=RGB24,TQ printf("[6] 1366*768 for LVDS->VGA \r\n"); printf("[7] 1920*1080 for LVDS (need 2 lvds ports) \r\n"); printf("[q] quit \r\n"); printf("Enter your selection: "); c = getc(); printf("%c\n", c); if (c == '1') { sprintf(cmd_buf_all, "dev=ldb,TQ-ldb_800600,if=RGB666,bpp=32 ldb=dul0"); sprintf(cmd_buf_all, "setenv displayArgs %s", cmd_buf); run_command(cmd_buf_all, 0); break; } else if (c == '2') { sprintf(cmd_buf_all, "setenv displayArgs video=mxcfb0:dev=lcd,if=RGB24,TQ-VGA_1024768,bpp=32 video=mxcfb1:dev=hdmi,1280x720M@60,if=RGB24,bpp=32 video=mxcfb2:off fbmem=28M,48M"); run_command(cmd_buf_all, 0); break; } else if (c == '3') { sprintf(cmd_buf_all, "setenv displayArgs video=mxcfb1:dev=lcd,if=RGB24,TQ-VGA_1280768,bpp=32 video=mxcfb0:dev=hdmi,1280x720M@60,if=RGB24,bpp=32 video=mxcfb2:off fbmem=28M,48M"); run_command(cmd_buf_all, 0); break; } else if (c == '4') { sprintf(cmd_buf_all, "setenv displayArgs video=mxcfb1:dev=lcd,if=RGB24,TQ-VGA_1360768,bpp=32 video=mxcfb0:dev=hdmi,1280x720M@60,if=RGB24,bpp=32 video=mxcfb2:off fbmem=28M,48M"); run_command(cmd_buf_all, 0); break; } else if (c == '5') { sprintf(cmd_buf_all, "setenv displayArgs video=mxcfb1:dev=lcd,if=RGB24,TQ-VGA_19201080,bpp=32 video=mxcfb0:dev=hdmi,1280x720M@60,if=RGB24,bpp=32 video=mxcfb2:off fbmem=28M,48M"); run_command(cmd_buf_all, 0); break; } else if (c == '6') { sprintf(cmd_buf_all, "setenv displayArgs video=mxcfb0:dev=ldb,LDB-XGA,if=RGB666,bpp=32 ldb=dul0 video=mxcfb1:dev=hdmi,1280x720M@60,if=RGB24,bpp=32 video=mxcfb2:off fbmem=28M,48M"); run_command(cmd_buf_all, 0); break; } else if (c == '7') { sprintf(cmd_buf_all, "setenv displayArgs video=mxcfb0:dev=ldb,LDB-1080P60,if=RGB24,bpp=32 ldb=spl0 video=mxcfb1:dev=hdmi,1280x720M@60,if=RGB24,bpp=32 video=mxcfb2:off fbmem=28M,48M"); run_command(cmd_buf_all, 0); break; } else if (c == 'q') { break; } printf("ill param\n"); } } else if(c == '3') {//video=mxcfb0:dev=ldb,TQ-ldb_1024768,if=RGB666 ldb=sep1 sprintf(cmd_buf_all, "setenv displayArgs video=mxcfb0:dev=ldb,TQ-ldb_1024768,if=RGB666 ldb=sep1"); run_command(cmd_buf_all, 0); } else if(c == 's') { run_command("saveenv", 0); } else if (c == 'q') { break; } } }