一、原理

菜单其实就是一个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. c盘没有新建修改权限的,执行下面命令

    cmd中执行: icacls c:\ /setintegritylevel M

  2. thinkphp 获取客户端ip地址方法

    /** * 获取客户端IP地址 * @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字 * @param boolean $adv 是否进行高级模式获取(有 ...

  3. c#基础语言编程-程序集和反射

    程序集 什么是程序集? 1.程序集(assembly)是一个及一个以上托管模块,以及一些资源文件的逻辑组合. 2.程序集是组件复用,以及实施安全策略和版本策略的最小单位. 3.程序集是包含一个或者多个 ...

  4. Mina学习之IoBuffer

    IoBuffer是一个被MINA体系所使用的字节数组.它是ByteBuffer的替代品,Mina不使用NIO的ByteBuffer有两个原因: 1. ByteBuffer没有提供更多有用的api,如f ...

  5. C# WinForm 透明控件 PictureBox透明 分类: WinForm 2014-07-30 13:27 591人阅读 评论(0) 收藏

    1.要实现C# WinForm中的控件与背景的透明,可以通过设置控件的BackColor属性为Transparent,同时设置其父控件.因为在C#中,控件的透明指对父窗体透明.如果不设置Parent属 ...

  6. UIView与CALayer的区别,很详细

    研 究Core Animation已经有段时间了,关于Core Animation,网上没什么好的介绍.苹果网站上有篇专门的总结性介绍,但是似乎原理性的东西不多,看得人云山雾罩,感觉,写那篇东西的人, ...

  7. 使用PDO连接数据库 查询和插入乱码的解决方法

    问题:PDO连接数据库后,查询和插入中文到数据库,出现乱码,如图: 解决方法: 法1: try{ $opts_values = array(PDO::MYSQL_ATTR_INIT_COMMAND=& ...

  8. TFS(Team Foundation Server)介绍和入门

    在本文的两个部分中,我将介绍Team Foundation Server的一些核心特征,重点介绍在本产品的日常应用中是怎样将这些特性结合在一起使用的. 作为一名软件开发者,在我的职业生涯中,我常常会用 ...

  9. [React + Mobx] Mobx and React intro: syncing the UI with the app state using observable and observer

    Applications are driven by state. Many things, like the user interface, should always be consistent ...

  10. Android Canvas drawText实现中文垂直居中

    目标: 把中文字符绘制到目标矩形的居中位置. 问题: Android的Canvas绘图,drawText里的origin是以baseline为基准的,直接以目标矩形的bottom传进drawText, ...