打印

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

[复制链接]
1690|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ferenc2|  楼主 | 2012-2-20 18:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
                    uboot中的快捷菜单的制作说明
      在uboot中加入快捷操作菜单的方法非常简单,在论坛发布的uboot201003V1.1的源码包里已经包含了菜单的源码
http://www.xcembed.com/bbs/viewthread.php?tid=19&page=1&extra=#pid32

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

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

编写cmd_menu.c的内容:
定义一个uboot cmd:

  • U_BOOT_CMD(
  •     menu, 3, 0, do_menu,
  •     "menu - display a menu, to select the items to do something\n",
  •     " - display a menu, to select the items to do something"
  • );


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

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


这里调用menu_shell函数
  • void menu_shell(void)
  • {
  •     char cmd_buf[200];
  •     while (1)
  •     {
  •           main_menu_usage(); //打印菜单
  •           c = awaitkey(-1, NULL);
  •           printf("%c\n", c);
  •           switch (c)
  •           {
  •                 case '1': //输入‘1’执行的动作
  •                 {
  •                     .....
  •                     break;
  •                 }
  •                 case '2': //输入‘2’执行的动作
  •                 {
  •                     .....
  •                     break;
  •                 }
  •                 case '3': //输入‘3’执行的动作
  •                 {
  •                     .....
  •                     break;
  •                 }
  •                 .....
  •                 ....
  •           }
  •     }
  • }


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

我的main_menu_usage如下:

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


以烧写uboot到nandflash为例,case 1:中的内容为:
  • strcpy(cmd_buf, "usbslave 1 0x30000000; nand erase bios; nand write.jffs2 0x30000000 bios 0x100000");
  • run_command(cmd_buf, 0);
  • break;


按照这个依次写每个case

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

  • #ifdef CONFIG_CMD_MENU
  •     run_command("menu", 0);
  • #endif


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

相关帖子

沙发
shell.albert| | 2012-2-20 21:20 | 只看该作者
楼主高手,看来把uboot的source code 已经阅读了不止一遍了,可以写bootloader了!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

134

主题

207

帖子

3

粉丝