分享

TQ2440u-boot1.1.6中添加菜单选择

 败败0619 2012-09-12

在这之前先说一个环境变量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:  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多