在这之前先说一个环境变量bootdelay这个是时间的,也就是我们的倒数计时在这个时间没有按下空格键时将进入菜单模式(进去不同的模式可以自己设置这里是进入菜单模式,这是我自己加进去的),下面说说实现过程。
首先进入main.c(u-boot-1.1.6# vim common/main.c);定位到bootdelay这里
402 #endif
403 s = getenv ("bootcmd");//获取一个命令
404
405 debug ("### main_loop: bootcmd=\"%s\"\n", s ? s : "<UNDEFINED>");
407 if (bootdelay >= 0 && s && !abortboot (bootdelay)) {
408 # ifdef CONFIG_AUTOBOOT_KEYED
409 int prev = disable_ctrlc(1);
410 # endif
411
412 # ifndef CFG_HUSH_PARSER //这个宏是在头文件那里定义为1的了(应该有的了)
413 // run_command (s, 0);//这个是原来的意思是执行bootcmd这个命令,这个s对应上面那个s
414
415 # else
448 # endif
449 }
450 }
451 #endif
452 #endif
453
454 #ifdef CONFIG_AMIGAONEG3SE
455 {
456 extern void video_banner(void);
457 video_banner();
458 }
459 #endif
460 run_command ("menu", 0);而这个menu就是我们要加进来的,用来实现一个菜单选择。。(在这里加就可以了,原本的u-boot里这里是没有东西的)
接下来就是menu命令的添加了,在common目录里加一个文件cmd_menu.c用来menu命令实现,cmd_menu.c代码如下:
#include <common.h>
#include <command.h>
#include <def.h>
#include <nand.h>
#ifdef CONFIG_SURPORT_WINCE
#include "../wince/loader.h"
#endif
extern char awaitkey2(unsigned long delay, int* error_p);
void main_menu_usage(void)
{
if (bBootFrmNORFlash()) //判断一下是在nor还是nand flash中
printf("\r\n##### Boot for Nor Flash Main Menu cgy #####\r\n");
else
printf("\r\n##### Boot for Nand Flash Main Menu cgy #####\r\n");
printf("[1] Download u-boot(u-boot.bin) or STEPLDR.nb1 or other bootloader to Nand Flash\r\n");
printf("[2] Download Linux Kernel(zImage) to Nand Flash\r\n");
printf("[3] Download CRAMFS(root) image to Nand Flash\r\n");
printf("[4] Download YAFFS image(root) to Nand Flash\r\n");
printf("[5] Boot the system\r\n");
printf("[6] Download Program ( TQ2440.bin) to Nand flash and Run it\r\n");
printf("[7] Download u-boot to Nor Flash\r\n");
printf("[q] quit from menu\r\n");
printf("Enter your cgytq2440: ");
}
void menu_shell(void)
{
char c;
char cmd_buf[200];
char *p=NULL;
unsigned long size;
unsigned long offset;
struct mtd_info *mtd=&nand_info[nand_curr_device];
while(1)
{
main_menu_usage();//调用菜单显示函数
c = awaitkey2(-1,NULL);//获取按键输入
printf("%c\n",c);//换行
switch(c)
{
case '1' :
{
strcpy(cmd_buf,"tftp 0x30000000 u-boot.bin; nand erase bios; nand write.jffs2 0x30000000 0x0 $(filesize)"); //是一行的bios说明在后面
run_command(cmd_buf,0);//运行命令
break;
}
case '2' :
{
strcpy(cmd_buf,"tftp 0x30000000 kernel; nand erase kernel; nand write.jffs2 0x30000000 ZImage $(filesize)");//和上面一样是一行的,kernel在头文件里有定义
run_command(cmd_buf,0);
break;
}
case '3' :
{
strcpy(cmd_buf,"tftp 0x30000000 root;nand erase root;nand.write.jffs2 0x30000000 root $(filesize)");//用jffs2文件系统不要求叶对齐,不用管那么多
run_command(cmd_buf,0);
break;
}
case '4':
{
strcpy(cmd_buf,"tftp 0x30000000 root; nand erase root;nand write.yaffs 0x30000000 root $(filesize)");//$(filesize)是文件大少u-boot会自动更新
run_command(cmd_buf,0);
break;
}
case '5':
{
printf("Start linux ...\n");
strcpy(cmd_buf, "go 0x0");//从0开始执行也就是从新起动u-boot
run_command(cmd_buf, 0);
break;
}
case '6':
{
strcpy(cmd_buf, "tftp 0x30000000 TQ2440.bin; nand erase 0x0 $(filesize+1); nand write.jffs2 0x30000000 0x0 $(filesize+1)");
run_command(cmd_buf, 0);
break;
}
case '7':
{
if (bBootFrmNORFlash())
{
strcpy(cmd_buf, "tftp 0x30000000 u-boot.bin; protect off all; erase 0 +$(filesize); cp.b 0x30000000 0 $(filesize)");//下载u-boot到nod flash命令protect off all解除所有NOR Flash的写保护 run_command(cmd_buf, 0);
}
break;
}
case 'Q':
case 'q'://推出菜单模式
{
return;
break;
}
}
}
}
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,
"menu - display a menu, to select the items to do something\n",
" - display a menu, to select the items to do something"
);
上面命令中的kernel是在头文件里定义的,其实也可以自己根据虽要改
88
89 #define MTDPARTS_DEFAULT "mtdparts=nandflash0:256k@0(bios)," \//意思是flash前面256k给bios(bootloadr)
90 "128k(params)," \ //接下来128k是用来存启动参数的
91 "2m(kernel)," \//接下来2M是内核用的
92 "-(root)" //剩下的给root
93 //nand erase root 这个命令的意思是擦去root在分区的内容前面的并没有影响
最后在Makefile里加进menu这个命令如下
30 COBJS = main.o ACEX1K.o altera.o bedbug.o circbuf.o \
31 cmd_ace.o cmd_autoscript.o \
32 cmd_bdinfo.o cmd_bedbug.o cmd_bmp.o cmd_boot.o cmd_bootm.o \
33 cmd_cache.o cmd_console.o \
34 cmd_date.o cmd_dcr.o cmd_diag.o cmd_display.o cmd_doc.o cmd_dtt.o \
35 cmd_eeprom.o cmd_elf.o cmd_ext2.o \
36 cmd_fat.o cmd_fdc.o cmd_fdos.o cmd_flash.o cmd_fpga.o \
37 cmd_i2c.o cmd_ide.o cmd_immap.o cmd_itest.o cmd_jffs2.o \
38 cmd_load.o cmd_log.o \
39 cmd_mem.o cmd_mii.o cmd_misc.o cmd_mmc.o \
40 cmd_nand.o cmd_net.o cmd_nvedit.o \
41 cmd_pci.o cmd_pcmcia.o cmd_portio.o \
42 cmd_reginfo.o cmd_reiser.o cmd_scsi.o cmd_spi.o cmd_universe.o \
43 cmd_usb.o cmd_vfd.o \
44 command.o console.o devices.o dlmalloc.o docecc.o \
45 environment.o env_common.o \
46 env_nand.o env_dataflash.o env_flash.o env_eeprom.o \
47 env_nvram.o env_nowhere.o \
48 exports.o \
49 flash.o fpga.o ft_build.o \
50 hush.o kgdb.o lcd.o lists.o lynxkdi.o \
51 memsize.o miiphybb.o miiphyutil.o \
52 s_record.o serial.o soft_i2c.o soft_spi.o spartan2.o spartan3.o \
53 usb.o usb_kbd.o usb_storage.o \
54 virtex2.o xilinx.o crc16.o xyzModem.o cmd_mac.o cmd_menu.o
从新make clean
make
这样就把菜单加进去了,不过前提是你的tftp已经弄好了,才能运用上面菜单,菜单利用的是tftp来实现各种命令的。。。。。。。。。。。。。。。
弄好了如下
U-Boot 1.1.6 (Apr 29 2012 - 21:21:42)
DRAM: 64 MB
Flash: 2 MB
NAND: 256 MiB
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Hit any key to stop autoboot: 0
##### Boot for Nor Flash Main Menu cgy #####
[1] Download u-boot(u-boot.bin) or STEPLDR.nb1 or other bootloader to Nand Flash
[2] Download Linux Kernel(zImage) to Nand Flash
[3] Download CRAMFS(root) image to Nand Flash
[4] Download YAFFS image(root) to Nand Flash
[5] Boot the system
[6] Download Program ( TQ2440.bin) to Nand flash and Run it
[7] Download u-boot to Nor Flash
[q] quit from menu
Enter your cgytq2440:
原文地址:http://blog.sina.com.cn/s/blog_95268f5001013czl.html
这个博主 的文章很好,很值得学习