一、原理

菜单其实就是一个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. poj 1328贪心

    Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea i ...

  2. 数据库的发展现状与前景——NewSQL界的佼佼者,如Couchbase、Aerospike、Marklogic和 SequoiaDB,NewSQL的许多厂商,如:MemSQL、VoltDB、ScaleDB和CitusDB

    转自:http://news.sequoiadb.com/cn/Detail-id-42 2015-03-20   Strata+Hadoop World(SHW)大会是全世界最大的大数据大会之一. ...

  3. grunt个人理解

    最近在学习grunt的内容,也希望能将grunt使用在新的项目中,本文是对grunt的相关概念的个人理解,仅供与道友们交流和学习,如有疑义,欢迎道友们指点. 首先,grunt是基于nodejs的,那就 ...

  4. android 加载图片防止内存溢出

    图片资源: private int fore[]; private int back[]; fore = new int[]{R.drawable.a0, R.drawable.a1, R.drawa ...

  5. OMCS的语音视频带宽占用

    OMCS的语音.视频.电子白板.远程桌面等功能对网络带宽的要求分别如何了? 我们先假设一种常见的场景:假设N个在线用户同时进行1对1的多媒体沟通(即分为N/2组),在不考虑P2P通道的情况下,带宽的大 ...

  6. DB2 数据库绑定用户授权命令

    1.1  数据库绑定用户授权命令 db2 connect to opca db2 grant dbadm,createtab,bindadd,connect,create_not_fenced_rou ...

  7. 关于setLayoutParams报错

    有两个可能的原因  1.内部view没有用其parent的LayoutParams在继承BaseAdapter的时候,用getView返回View的时候,用代码控制布局,需要用到View.setLay ...

  8. docker-compose 工具安装

    centos 7 安装 之前测试过相关安装方法 pip python 安装不行 还是用下面这个办法搞定 curl -L https://github.com/docker/compose/releas ...

  9. [Angular 2] 9. Replace ng-modle with #ref & events

    Let's say you want to write a simple data bing app. when you type in a text box, somewhere in the ap ...

  10. linux下的僵尸进程处理SIGCHLD信号

    什么是僵尸进程? 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打开的文件等,但内核为每一个终止子进程保存了一定量的信息.这些信息至少包括进程ID,进程的终止状态,以及该 ...