Chinaunix首页 | 论坛 | 博客
  • 博客访问: 62312
  • 博文数量: 11
  • 博客积分: 110
  • 博客等级: 民兵
  • 技术积分: 132
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-03 17:54
文章分类
文章存档

2014年(3)

2013年(1)

2012年(7)

我的朋友

分类: LINUX

2012-05-09 17:19:00

这个菜单其实就是一个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函数

实现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中就能看到菜单了
阅读(3376) | 评论(2) | 转发(13) |
给主人留下些什么吧!~~

tekkamanninja2012-05-12 18:08:06

☆彼岸★花开: menu_shell就是一个while循环,太无语了.....
本身uboot的shell也就是个循环

☆彼岸★花开2012-05-12 16:19:48

menu_shell就是一个while循环,太无语了