转自:http://blog.csdn.net/qq_21792169/article/details/50041365
新建一个名为:cmd_menu.c的文件,放到common目录下,修改同目录下的Makefile文件,加入编译选项:
COBJS-$(CONFIG_CMD_MENU) += cmd_menu.o
编写cmd_menu.c的内容:
定义一个uboot cmd:
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
",
-
" - 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
", 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
");
-
printf("[2] 烧写Linux Kernel到nandflash
");
-
printf("[3] 烧写yaffs2文件系统到nandflash
");
-
printf("[4] 下载程序在SDRAM中运行
");
-
printf("[5] 设置uboot参数
");
-
printf("[6] 格式化Nandflash
");
-
printf("[7] 启动Linux系统
");
-
printf("[8] 进入Shell模式
");
-
printf("[9] 重启uboot
");
-
if (bBootFrmNORFlash == 1)
-
printf("[0] 下载bootloader到NorFlash
");
-
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