uboot中的快捷菜单的制作说明


uboot中的快捷菜单的制作说明

转载:http://blog.chinaunix.net/uid-22030783-id-366971.html




这个菜单其实就是一个uboot中的命令,uboot启动时,如果进入下载模式,就先运行这个命令。命令的执行内容就是通过串口打印出一个菜单,等待输入数字,再执行相应的动作。

第一步
新建一个名为:cmd_menu.c的文件,放到common目录下,修改同目录下的Makefile文件,加入编译选项:
COBJS-$(CONFIG_CMD_MENU) += cmd_menu.o

编写cmd_menu.c的内容:
定义一个uboot cmd:
  1. U_BOOT_CMD(
  2.     menu, 3, 0, do_menu,
  3.     "menu - display a menu, to select the items to do something\n",
  4.     " - display a menu, to select the items to do something"
  5. );

cmd的名为 menu     执行的动作是do_menu函数


U_BOOT_CMD(name,maxargs,rep,cmd,usage,help)参数含义如下: 

name:命令名[非字符串]但在U_BOOT_CMD中用”#”符号转化为字符串; 

maxargs:命令的最大参数个数; 
rep:是否自动重复(按Enter键是否会重复执行);

 cmd:该命令对应的响应函数; 

usage:简短的使用说明(字符串);

 help:较详细的使用说明(字符串); 

在内存中保存命令的help字段会占用一定的内存,通过配置U-Boot可以选择是否保存help字段。

若在include/configs/mini2440.h中定义了CONFIG_SYS_LONGHELP宏,

则在U-Boot中使用help命令查看某个命令的帮助信息时将显示usage和help字段的内容,

否则就只显示usage字段的内容。 

U_BOOT_CMD宏在include/command.h中定义: 
#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \ 
cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage, help}  

“##”与“#”都是预编译操作符,“##”有字符串连接的功能,“#”表示后面紧接着的是一个字符串。[cmd_tbl_t在include/command.h中定义]

第二步:

实现do_menu

  1. int do_menu (cmd_tbl_t *cmdtp,int flag,int argc, char*argv[])
  2. {
  3.     menu_shell();
  4.     return 0;
  5. }

 

这里调用menu_shell函数

第三步:

  1. void menu_shell(void)
  2. {
  3.     char cmd_buf[200];
  4.     while (1)
  5.     {
  6.           main_menu_usage();//打印菜单
  7.           c = awaitkey(-1,NULL);//等待按键的输入
  8.           printf("%c\n", c);
  9.           switch (c)
  10.           {
  11.                 case '1'://输入‘1’执行的动作
  12.                 {
  13.                     .....
  14.                     break;
  15.                 }

  16.                 case '2'://输入‘2’执行的动作
  17.                 {
  18.                     .....
  19.                     break;
  20.                 }

  21.                 case '3'://输入‘3’执行的动作
  22.                 {
  23.                     .....
  24.                     break;
  25.                 }
  26.                 .....
  27.                 ....
  28.           }
  29.     }
  30. }

 

menu_shell就是一个while循环,调用main_menu_usage打印菜单,然后awaitkey,再switch输入的键值,
执行相应的case

我的main_menu_usage如下:

  1. void main_menu_usage(void)
  2. {
  3.     printf("[1] 烧写bootloader到nandflash\r\n");
  4.     printf("[2] 烧写Linux Kernel到nandflash\r\n");
  5.     printf("[3] 烧写yaffs2文件系统到nandflash\r\n");
  6.     printf("[4] 下载程序在SDRAM中运行\r\n");
  7.     printf("[5] 设置uboot参数\r\n");
  8.     printf("[6] 格式化Nandflash\r\n");
  9.     printf("[7] 启动Linux系统\r\n");
  10.     printf("[8] 进入Shell模式\r\n");
  11.     printf("[9] 重启uboot\r\n");
  12.     if (bBootFrmNORFlash == 1)
  13.         printf("[0] 下载bootloader到NorFlash\r\n");
  14.     printf("Enter your selection: ");
  15. }

 

以烧写uboot到nandflash为例,case 1:中的内容为:

  1. strcpy(cmd_buf,"usbslave 1 0x30000000; nand erase bios; nand write.jffs2 0x30000000 bios 0x100000");
  2. run_command(cmd_buf, 0);
  3. break;

 

按照这个依次写每个case

main.c中调用menu命令:
main_loop函数中在abortboot (bootdelay) 结束后加入:

  1. #ifdef CONFIG_CMD_MENU
  2.     run_command("menu", 0);
  3. #endif

 

编译uboot下载到FLASH中就能看到菜单了


//========================================================================================

//=======下面的关键代码:waitconsoleinput        =====================================

//========================================================================================


(1)、在common目录下新增cmd_menu.c文件,代码如下:


#include <common.h>


#include <command.h>
static char waitconsoleinput(unsigned long delay)
{
    int i;
    if (-1 == delay) {
        while (1) {
            if(tstc()){
                return getc();
            }
        }
    }
    else {      
        for (i = 0; i < delay; i++) {
            if(tstc()){
                return getc();
            }
            udelay(10*1000);/*时间快的话自己调整下*/
        }
    }


    return 0;
}
void menu_usage(void)
{
    printf("\r\n=========Menu for XXX=========\r\n");
    printf("\r\n");
    printf("[1] download Linux(zImage) and boot kernel \r\n");
    printf("[2] Reset\r\n");
    printf("[q] Exit\r\n");
    printf("\r\n");
    printf("Please Input: ");
}


void menu_shell(void)
{
    char c;
    char cmdbuf[128];


    while (1)
    {
        menu_usage();
        c = waitconsoleinput(-1);
        switch (c)
        {
        case '1':
            strcpy(cmdbuf, "tftp 0x20008000 zImage; go 0x20008000");
            run_command(cmdbuf, 0);
            break;
        case 'r':
            strcpy(cmdbuf, "reset");
            run_command(cmdbuf, 0);
            break;
        case 'q':
            return;  
        };
    };
}


int do_menu (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
    menu_shell();
    return 0;
}


U_BOOT_CMD(
    bootmenu, 1, 0, do_menu,
    "Boot Menu",
    "U-boot Boot Menu\n"
);


(2)、修改common目录下的Makefile文件
添加如下:
COBJS-y += bootmenu.o


本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2012-12/76091.htm




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值