I.MX6 天嵌 E9 U-boot menu hacking

/************************************************************************************
 *                      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;
        }
    }
}

 

时间: 2024-07-30 21:57:35

I.MX6 天嵌 E9 U-boot menu hacking的相关文章

G400笔记本如何找到Boot Menu

  解决方案: 进入Boot Menu的方法有两种: 方法一 1. 计算机处于关机的状态下,按笔记本开机键右侧的一键恢复按钮(位置如下图红圈中的6); 2. 按完一键恢复按键后,屏幕出现如下图界面,选择Boot Menu选项,按Enter按键; 3. 选择完Boot Menu选项就会出现如下图的Boot Menu界面. 方法二 1. 点开机键刚启动过程或者重启计算机的过程,不停的敲击F12或者FN+F12键,直接会出现Boot Menu界面.

启动计算节点时boot menu只有两项。

问题描述 解决方案 解决方案二:很好,很强大,不错解决方案三: 解决方案四:就是用fuel6.0安装openstack中出现的问题bootmenu按理来说应该有四项,现在只有两项,没有bootstrap这一项.有没有会的呀~

I.MX6 Manufacturing Tool V2 (MFGTool2) ucl2.xml hacking

<!-- * Copyright (C) 2010-2013, Freescale Semiconductor, Inc. All Rights Reserved. * The CFG element contains a list of recognized usb devices. * DEV elements provide a name, class, vid and pid for each device. * * Each LIST element contains a list o

Linux系统/boot目录破损无法启动怎么办

linux系统中的/boot目录存放着系统开机所需要的各种文件,其中包含内核.开机菜单及所需配置文件等等. 但是当不小心删除了/boot目录里的某些文件或者干脆整个/boot目录都不见了的情况下,该如何恢复系统并重启系统呢? 以下通过加载磁盘镜像文件以重装内核与grub2加载器的方式可解决这个问题,只是过程有点复杂. 实验环境:KVM中的rhel7系统. 1.模拟删除/boot目录,使系统无法启动 2.reboot尝试重新启动,确认系统已故障 3.强制关闭系统 4.进入虚拟机配置页面,通过以下点

Boot Repair Tool: 可以修复与启动相关的大部分问题

我们都碰到过启动相关的问题,并且大部分时候都是简单的 GRUB 上的问题. 有时候很多人会觉得.输入一段很长的命令或在论坛中搜索来找到解决方法太麻烦了.今天我要告诉你如何使用一个简单而轻巧的软件来解决大部分的启动相关的问题.这个工具就是著名的 Boot Repair Tool.好了,话不多说,让我们开始吧. 如何在 Linux 中安装和使用启动修复工具 你需要一个你所安装的操作系统的现场版的 USB 棒或 DVD,这是安装这个应用并使用它的前提条件. 引导到操作系统17[1] 并打开终端并输入以

I.MX6 eMMC 中启动U-boot存放的首地址

/************************************************************************************ * I.MX6 eMMC 中启动U-boot存放的首地址 * 声明: * 本文是解读<I.MX6 Manufacturing Tool V2 (MFGTool2) ucl2.xml hacking>之后对 * U-boot存放于eMMC 1K地址有疑惑,希望能找到确切的说法. * * 2015-10-14 晴 深圳 南山平山

I.MX6 Linux U-boot 环境变量解析

/********************************************************************************** * I.MX6 Linux U-boot 环境变量解析 * 声明: * 在分析完I.MX6 Manufacturing Tool V2 (MFGTool2)中一些内容之后,这里仅仅是 * 为了验证其中的一些想法: * 1. 如何读取不在分区中的uImage,而是在emmc中1M地址上的uImage: * 2. U-boot的loa

windows2003系统无盘终端网组建详细教程(1/3)

本文将介绍Windows.NET Server无盘终端网的组建,无盘部分采用PXE(Preboot eXecutionEnvironment,远程引导技术)或RPL(Remote Initial Program Load,远程启动服务)技术来实现,终端部分则采用Windows.NET Server Standard Server build 3607简体中文版(以下简称Windows.NET Server)中自带的终端服务来实现,带你一步步达成在最低档无盘工作站(CPU可为486级或更低)上流畅

m495怎么调出光驱启动

  解决方案: M495笔记本进入光驱引导界面的方法有两种: 方法一 点开机键刚启动过程或者重启计算机的过程,不停的敲击F12键,直接会出现Boot Menu界面(如下图),选择第一行"ATAPI CD1:"即可实现光盘引导. 方法二 1. 点开机键刚启动过程或者重启计算机的过程,不停的敲击Enter键,会出现如下图界面: 2. 上图界面点击F12键,则会出现Boot Menu界面(如下图),选择第一行"ATAPI CD1:"即可实现光盘引导.