一、原理
uboot菜单其实就是一个uboot中的命令,和其他的命令没有什么差别。
uboot启动时,如果进入uboot命令模式,先运行这个命令,就会打印出一个菜单界面。在uboot的命令模式,通过键入“menu”命令,同样可以调出这个界面。
二、操作步骤
1、在uboot的common目录下创建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[])
{
tftp_menu_shell();
return 0;
}
然后继续完善cmd_menu.c,内容如下:
#include
#include
#ifdef CONFIG_CMD_MENU
#define USE_TFTP_DOWN 1
#define USE_USB_DOWN 2
extern char console_buffer[];
/*
* Reads and returns a character from the serial port
* - Times out after delay iterations checking for presence of character
* - Sets *error_p to UART error bits or - on timeout
* - On timeout, sets *error_p to -1 and returns 0
*/
static char awaitkey(unsigned long delay, int* error_p)
{
int i;
char c;
if (delay == -1) {
while (1) {
if (tstc()) /* we got a key press */
return getc();
}
}
else {
for (i = 0; i = 0 && s && !abortboot (bootdelay)) {
# ifdef CONFIG_AUTOBOOT_KEYED
int prev = disable_ctrlc(1); /* disable Control C checking */
# endif
# ifndef CFG_HUSH_PARSER
run_command (s, 0);
# else
parse_string_outer(s, FLAG_PARSE_SEMICOLON |
FLAG_EXIT_FROM_LOOP);
# endif
# ifdef CONFIG_AUTOBOOT_KEYED
disable_ctrlc(prev); /* restore Control C checking */
# endif
}
#ifdef CONFIG_CMD_MENU
run_command("menu", 0);
#endif
4、修改开发板相关的头文件,这里修改:include/configs/TQ2440.h
增加一行:
#define CONFIG_CMD_MENU 1
然后重新编译uboot,烧写到开发板即可看到uboot 菜单。
-THE END-
关注公众号baiwenkeji第一时间获得嵌入式干货。 技术交流加个人威信13266630429,验证:CSDN博客