当uboot启动过程中可以按任意键中断uboot的启动,进入uboot命令行模式,这里是添加进入命令行之前的菜单,实现简易的菜单选择。启动菜单的设置所有文件都在uboot/common目录下。
第一步,在uboot/common目录下创建名为cmd_menu.c的文件,并添加如下代码:
/*
* add uboot cmd_menu by sn02241
*/
#include <common.h>
#include <command.h>
#ifdef CONFIG_CMD_MENU
void menu_shell(void)
{
char keyselect;
do
{
printf("\r\n\n\n------Boot Main Menu ('q' to quit)------\r\n");
printf("[0] boot menu test\n");
printf("Enter your selection: ");
keyselect = getc();
printf("%c\n", keyselect);
switch (keyselect)
{
case '0':
printf("'0' pressed, enter 'q' to quit");
break;
case 'q':
printf("'q' pressed, quit...\n\n");
break;
default :
printf("error pressed");
break;
}
}
while ((keyselect != 'q') && (keyselect != 'Q'));
}
int do_menu (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
menu_shell();
return 0;
}
U_BOOT_CMD(
menu, 3, 0, do_menu,
"显示菜单用于启动设置\n",
"\t显示菜单用于启动设置"
);
#endif
其中U_BOOT_CMD是一个宏定义,作用是将一个名为menu的命令与do_menu函数绑定,方便在其他文件(函数)中调用menu时直接关联do_menu函数。其他的函数就是实现基础的输出功能和bootArgs的赋值。说明一下U_BOOT_CMD的几个参数含义
#define U_BOOT_CMD(_name, _maxargs, _rep, _cmd, _usage, _help) \
U_BOOT_CMD_COMPLETE(_name, _maxargs, _rep, _cmd, _usage, _help, NULL)
name 命令名字(不需要双引号)
maxargs 最大参数的个数
rep 命令是否可重复,下一次按回车时是否需要再执行,为1时可重复
cmd 绑定的函数指针
usage 字符串,简要说明
help 字符串,详细说明
第二步,在uboot/common目录下的Makefile文件添加如下语句,功能是在编译内核时将刚刚新建的cmd_menu文件编译进内核。
########## szd add ##################
obj-$(CONFIG_CMD_MENU) += cmd_menu.o
#####################################
CONFIG_CMD_MENU是一个宏定义,当实现该宏定义时,就可以将cmd_menu.c编译进内核了。截图显示如下:
第三步,在uboot/common/main.c的main_loop函数中添加如下语句,以实现对menu命令的调用:
/****************************************************/
// szd add
#ifdef CONFIG_CMD_MENU
run_command("menu", 0);
#endif
/***************************************************/
其中,run_command函数可以实现,调用声明的命令menu。截图效果如下:
第四步,万事俱备,只差声明CONFIG_CMD_MENU宏了,我把它添加在板子对应的头文件中,即uboot/include/configs/mx6dl_sabreauto.h文件中。如下:
/******************* szd add ***************/
#define CONFIG_CMD_MENU
/*******************************************/
截图如下:
OK!至此uboot启动时的选择菜单已经添加结束(这里只实现了简单的功能,具体的内容根据需要添加即可)。
编译测试一下吧,显示如下图所示说明编译成功: