一、原理

菜单其实就是一个uboot中的命令,和其他的命令没有什么差别。

  uboot启动时,如果进入uboot命令模式,先运行这个命令,就会打印出一个菜单界面。

在uboot的命令模式,通过键入“menu”命令,同样可以调出这个界面。

二、操作步骤

1、在common目录下创建cmd_menu.c

内容如下:

#include <common.h>
#include <command.h> #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 == -) {
while () {
if (tstc()) /* we got a key press */
return getc();
}
}
else {
for (i = ; i < delay; i++) {
if (tstc()) /* we got a key press */
return getc();
udelay (*);
}
} if (error_p)
*error_p = -;
return ;
} static int bBootFrmNORFlash(void)
{
volatile unsigned int *pdw = (volatile unsigned int *);
unsigned int dwVal; dwVal = *pdw;
*pdw = 0x12345678;
if (*pdw != 0x12345678)
{
return ;
}
else
{
*pdw = dwVal;
return ;
}
} void main_menu_usage(char menu_type)
{ if (bBootFrmNORFlash())
printf("\r\n##### Boot for Nor Flash Main Menu #####\r\n");
else
printf("\r\n##### Boot for Nand Flash Main Menu #####\r\n"); if( menu_type == USE_USB_DOWN)
{
printf("##### EmbedSky USB download mode #####\r\n\n");
}
else if( menu_type == USE_TFTP_DOWN)
{
printf("##### EmbedSky TFTP download mode #####\r\n\n");
} if( menu_type == USE_USB_DOWN)
{
printf("[1] Download u-boot or STEPLDR.nb1 or other bootloader to Nand Flash\r\n");
}
else if( menu_type == USE_TFTP_DOWN)
{
printf("[1] Download u-boot.bin to Nand Flash\r\n");
}
printf("[2] Download Eboot (eboot.nb0) to Nand Flash\r\n");
printf("[3] Download Linux Kernel (zImage.bin) to Nand Flash\r\n");
if( menu_type == USE_USB_DOWN)
{
#ifdef CONFIG_SURPORT_WINCE
printf("[4] Download WinCE NK.bin to Nand Flash\r\n");
#endif
printf("[5] Download CRAMFS image to Nand Flash\r\n");
}
else if( menu_type == USE_TFTP_DOWN)
{
printf("[4] Download stepldr.nb1 to Nand Flash\r\n");
printf("[5] Set TFTP parameters(PC IP,TQ2440 IP,Mask IP...)\r\n");
}
printf("[6] Download YAFFS image (root.bin) to Nand Flash\r\n");
printf("[7] Download Program (uCOS-II or TQ2440_Test) to SDRAM and Run it\r\n"); printf("[8] Boot the system\r\n");
printf("[9] Format the Nand Flash\r\n");
printf("[0] Set the boot parameters\r\n");
printf("[a] Download User Program (eg: uCOS-II or TQ2440_Test)\r\n");
printf("[b] Download LOGO Picture (.bin) to Nand Flash \r\n");
printf("[l] Set LCD Parameters \r\n");
if( menu_type == USE_USB_DOWN)
{
printf("[n] Enter TFTP download mode menu \r\n");
} if (bBootFrmNORFlash())
printf("[o] Download u-boot to Nor Flash\r\n");
if( menu_type == USE_TFTP_DOWN)
printf("[p] Test network (TQ2440 Ping PC's IP) \r\n"); printf("[r] Reboot u-boot\r\n");
printf("[t] Test Linux Image (zImage)\r\n");
if( menu_type == USE_USB_DOWN)
{
printf("[q] quit from menu\r\n");
}
else if( menu_type == USE_TFTP_DOWN)
{
printf("[q] Return main Menu \r\n");
} printf("Enter your selection: ");
} void tftp_menu_shell(void)
{
char c;
char cmd_buf[]; while ()
{
main_menu_usage(USE_TFTP_DOWN);
c = awaitkey(-, NULL);
printf("%c\n", c);
switch (c)
{
case '':
{
strcpy(cmd_buf, "tftp 0x30000000 u-boot.bin; nand erase bios; nand write.jffs2 0x30000000 bios $(filesize)");
run_command(cmd_buf, );
break;
} case '':
{
sprintf(cmd_buf, "tftp 0x30000000 eboot.nb0; nand erase eboot; nand write.jffs2 0x30000000 eboot $(filesize)");
run_command(cmd_buf, );
break;
} case '':
{
strcpy(cmd_buf, "tftp 0x30000000 zImage.bin; nand erase kernel; nand write.jffs2 0x30000000 kernel $(filesize)");
run_command(cmd_buf, );
break;
} case '':
{
strcpy(cmd_buf, "tftp 0x30000000 stepldr.nb1; nand erase kernel; nand write.jffs2 0x30000000 kernel $(filesize)");
run_command(cmd_buf, );
break;
} case '':
{
char param_buf1[];
char param_buf2[];
char param_buf3[]; printf("Enter the TFTP Server(PC) IP address:(xxx.xxx.xxx.xxx)\n");
readline(NULL);
strcpy(param_buf1,console_buffer);
sprintf(cmd_buf, "setenv serverip %s",param_buf1);
run_command(cmd_buf, ); printf("Enter the SKY2440/TQ2440 IP address:(xxx.xxx.xxx.xxx)\n");
readline(NULL);
strcpy(param_buf2,console_buffer);
sprintf(cmd_buf, "setenv ipaddr %s",param_buf2);
run_command(cmd_buf, ); printf("Enter the Mask IP address:(xxx.xxx.xxx.xxx)\n");
readline(NULL);
strcpy(param_buf3,console_buffer);
sprintf(cmd_buf, "setenv netmask %s",param_buf3);
run_command(cmd_buf, ); printf("Save TFTP IP parameters?(y/n)\n");
if (getc() == 'y' )
{
printf("y");
getc() == '\r';
printf("\n");
sprintf(cmd_buf, "saveenv");
run_command(cmd_buf, );
}
else
{
printf("Not Save it!!!\n");
}
break;
} case '':
{
strcpy(cmd_buf, "tftp 0x30000000 root.bin; nand erase root; nand write.yaffs 0x30000000 root $(filesize)");
run_command(cmd_buf, );
break;
} case '':
{
char tftpaddress[];
char filename[]; printf("Enter downloads to SDRAM address:\n");
readline(NULL);
strcpy(tftpaddress, console_buffer); printf("Enter program name:\n");
readline(NULL);
strcpy(filename, console_buffer); sprintf(cmd_buf, "tftp %s %s", tftpaddress, filename);
printf("tftp %s %s\n", tftpaddress, filename);
run_command(cmd_buf, ); sprintf(cmd_buf, "go %s", tftpaddress);
run_command(cmd_buf, );
break;
} case '':
{
printf("Start Linux ...\n");
strcpy(cmd_buf, "boot_zImage");
run_command(cmd_buf, );
break;
} case '':
{
strcpy(cmd_buf, "nand scrub ");
run_command(cmd_buf, );
// erase_menu_shell();
break;
} case 'A':
case 'a':
{
char filename[]; printf("Enter program name:\n");
readline(NULL);
strcpy(filename, console_buffer); sprintf(cmd_buf, "tftp 0x30000000 %s; nand erase 0x0 $(filesize+1); nand write.jffs2 0x30000000 0x0 $(filesize+1)", filename);
run_command(cmd_buf, );
break;
} case 'B':
case 'b':
{
strcpy(cmd_buf, "tftp 0x30000000 logo.bin; nand erase logo; nand write.jffs2 0x30000000 logo $(filesize)");
run_command(cmd_buf, );
break;
} case 'O':
case 'o':
{
if (bBootFrmNORFlash())
{
strcpy(cmd_buf, "tftp 0x30000000 uboot.bin; protect off all; erase 0 +$(filesize); cp.b 0x30000000 0 $(filesize)");
run_command(cmd_buf, );
}
break;
} case 'P':
case 'p':
{
char *serverip;
serverip=getenv("serverip");
printf("TQ2440 ping PC IP:ping %s\n",serverip);
sprintf(cmd_buf, "ping %s",serverip);
run_command(cmd_buf, );
break;
} case 'R':
case 'r':
{
strcpy(cmd_buf, "reset");
run_command(cmd_buf, );
break;
} case 'T':
case 't':
{
strcpy(cmd_buf, "tftp 0x30008000 zImage.bin; test_zImage");
run_command(cmd_buf, );
break;
} case 'Q':
case 'q':
{
return;
break;
}
default: ;
}
} } int do_menu (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
tftp_menu_shell();
return 0;
} 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"
); #endif /* #ifdef CONFIG_CMD_MENU */

2、修改common/Makefile

COBJS    = main.o ACEX1K.o altera.o bedbug.o circbuf.o \
cmd_ace.o cmd_autoscript.o \
......
virtex2.o xilinx.o crc16.o xyzModem.o cmd_mac.o cmd_menu.o

3、修改common/main.c,调用菜单命令(menu)

    if (bootdelay >=  && s && !abortboot (bootdelay)) {
# ifdef CONFIG_AUTOBOOT_KEYED
int prev = disable_ctrlc(); /* disable Control C checking */
# endif # ifndef CFG_HUSH_PARSER
run_command (s, );
# 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

/***********************************************************
* Command definition
***********************************************************/
#define CONFIG_COMMANDS \
(CONFIG_CMD_DFL | \
CFG_CMD_CACHE | \
CFG_CMD_NAND | \
/*CFG_CMD_EEPROM |*/ \
/*CFG_CMD_I2C |*/ \
/*CFG_CMD_USB |*/ \
CFG_CMD_REGINFO | \
CFG_CMD_DATE | \
CFG_CMD_REGINFO | \
CFG_CMD_PING | \
CFG_CMD_ELF) #define CONFIG_CMD_MENU 1

参考网页:uboot中的快捷菜单的制作说明

在uboot上创建菜单的更多相关文章

  1. Oracle 11G R2 在windows server 2008 64位安装时提示:无法在windows "开始"菜单或桌面上创建项

    错误代码及解释:  在windows server 2008 64 位操作系统中安装 oracle 11G R2 64位 版本时提示:无法在windows "开始"菜单或桌面上创建 ...

  2. ASP.NET实现微信功能(1)(创建菜单,验证,给菜单添加事件)

    LZ实在 不知道怎么起名字了,索性就取了这个名字,开始吧,说实在的,想给自己的平常的学习做一个总结,总是忘了总结.也只能给工作做一个总结了. 我打算用2篇文章来写,第一篇是关于订阅号的,就是这个号,另 ...

  3. Force.com微信开发系列(四)申请Access Token及自定义菜单之创建菜单

    在微信接口开发中,许多服务的使用都离不开Access Token,Access Token相当于打开这些服务的钥匙,正常情况下会在7200秒内失效,重复获取将导致上次获取的Token失效,本文将首先介 ...

  4. 使用Select命令创建菜单

    创建文本菜单的一半功夫都花在了创建菜单布局和获取输入的字符上.bash shell提供了一个很容易上手的小工具来自动完成这些工作select命令允许从单个命令行创建菜单,然后在提取输入的答案并自动处理 ...

  5. IE8“开发人员工具”使用详解上(各级菜单详解)

    来源: http://www.cnblogs.com/JustinYoung/archive/2009/03/24/kaifarenyuangongju.html IE8“开发人员工具”使用详解上(各 ...

  6. 微信公众号_订阅号_access_token_创建菜单_菜单name+表情

    全局唯一接口调用凭据 access_token 用于接口调用的一个必要参数 有了 access_token 就能实现所有的接口 特点:  1. 有效期为 2 小时,所以 2 小时要更新一次,提前 5 ...

  7. python3中 tkinter模块创建window窗体、添加按钮、事务处理、创建菜单等的使用

    开始接触桌面图形界面编程,你可以到安装路径  \lib\tkinter 打开__init__.py 文件了解tkinter 1    tkinter 模块创建窗体,代码如下截图: 运行结果,如有右图显 ...

  8. 在 Linux 上创建第一个 Service Fabric Java 应用程序

    先决条件 开始之前,请安装 Service Fabric SDK.Azure CLI,并在 Linux 开发环境中设置开发群集. 如果使用 Mac OS X,则可使用 Vagrant 在虚拟机中设置 ...

  9. 如何在Linux的桌面上创建快捷方式或启动器

    如果在Linux桌面系统中你经常使用一个程序,你可能想去创建一个“桌面快捷方式”,以便于你在桌面只要点击一下快捷方式就可以启动它.虽然不少带有图形界面的程序会在安装时自动在桌面上创建快捷方式,还有一些 ...

随机推荐

  1. 【基础】多线程更新窗体UI的若干方法

    一.前言 在单线程中设置窗体某个控件的值很简单的事,只需要设置控件文本的值就可以了,但是有的业务场景很是复杂,界面上的控件也很多,这种情况下当数据量比较多的时候,在单线程中更新UI不可避免地会发生假死 ...

  2. thinkphp 重定向redirect

    /** * URL重定向 * @param string $url 重定向的URL地址 * @param integer $time 重定向的等待时间(秒) * @param string $msg ...

  3. Pencil-一个开源免费的UI原型工具,自带ios和android模板

    Pencil是一个开源免费的UI原型工具,自带ios和android模板,可以很方便的做mockup. 下图是一个官方展示的模板:         

  4. Docker的基本操作

    容器基本操作 1.启动容器 $docker run image [COMMAND] [ARG…] run在新容器中执行命令 2.启动交互式容器 $docker run -i -t IMAGE /bin ...

  5. Windows 服务卸载之后 重新安装提示 “指定的服务已标记为删除”

    背景:        将一个项目做成一个windows服务,在调试的时候,需要卸载.安装该服务,但提示下面的错误:“指定的服务已标记为删除”,进入服务管理界面,启动自己注册的服务,无法手动更改成启用模 ...

  6. Java和JavaScript中使用Json方法大全

    林炳文Evankaka原创作品. 转载请注明出处http://blog.csdn.net/evankaka   摘要:JSON(JavaScript Object Notation) 是一种轻量级的数 ...

  7. 执行游戏时出现0xc000007b错误的解决方法

    如图,这个错误使无数玩家烦恼. 出现这个错误,可能是硬件的问题,也可能是软件的问题.可是,因为硬件引起该问题的概率非常小,而且除了更换硬件之外没有更好的解决方法,因此本文将具体介绍怎样通过软件解决此问 ...

  8. 实战DeviceIoControl 之中的一个:通过API訪问设备驱动程序

    P.bhw98 { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 9pt; PADDING-BOTTOM: 0px; MARGIN: 10px 0 ...

  9. android 43 SQLite数据库

    SQLite数据库很小,占用内存只有几百K,安卓和IOS都是用的SQLite数据库. 页面: <LinearLayout xmlns:android="http://schemas.a ...

  10. linux共享windows资料

    linux 只有NTFS格式不能访问,其的都可以.1.用fdisk -l 查看分区表.2.然后用mount -t vfat /mnt/hda1 /dev/hda1 就可以了./mnt/hda1是一普通 ...