如何修改uboot的环境变量env的值来指定uImage的名字

来源:互联网 发布:金蝶软件经销商 编辑:程序博客网 时间:2024/04/30 15:15

今天继续玩基于uboot的nfs。昨天总算是基本搞清了make zImage和make uImage的区别,那么今天就来实际编译几个玩一玩。

不过,在利用mkimage工具对zImage镜像文件加工完、生成了符合uboot格式的uImage镜像文件之后,我突然意识到,此时的镜像文件,已经完完全全是名副其实的uboot格式了,那么此时再将其称为zImage.img,其实已经是不合适的,应该改名为uImage.img才对。也就是说,我在(make zImage和make uImage的区别和mkimage工具的使用)博客中引用的tekkaman前辈的下面这条命令:

mkimage -n 'tekkaman' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage zImage.img

其实应该是有瑕疵的。应该要将其中的zImage.img改为uImage.img才对。如下:

mkimage -n 'tekkaman' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage uImage.img

于是,我将镜像文件改名,复制到nfs目录下,然后启动开发板。却发现,开发板中的uboot不认uImage.img的名字,它只认zImage.img,引导内核失败,要修改一下。

一开始我尝试通过修改uboot的源代码的方法来做,修改mini2440.h头文件中的相关宏的定义:

#define CONFIG_BOOTCOMMAND  "nfs 0x30008000 192.168.100.120:/opt/FriendlyARM/mini2440/rootfs/uImage.img;bootm"

修改完后使用super-vivi将uboot烧录进去,重启开发板,却发现问题仍然存在。这是为什么呢?

经过一番思索,我找到原因了。这是因为uboot已经将zImage.img这个名字写入了它的环境变量中。光修改上面的宏是没有用的,必须修改它的环境变量,否则它不会接受这个新的名字。

可是,要如何来修改它的环境变量呢?网上百度,也没度到什么对应的资料,看来还得自己去摸索。好在uboot提供了一整套方便使用的命令。直接在uboot启动时,敲击键盘进入它的命令行模式,输入help命令便可以看到,如下所示:

[u-boot@MINI2440]# help?       - alias for 'help'askenv  - get environment variables from stdinbase    - print or set address offsetbdinfo  - print Board Info structurebmp     - manipulate BMP image databoot    - boot default, i.e., run 'bootcmd'bootd   - boot default, i.e., run 'bootcmd'bootelf - Boot from an ELF image in memorybootm   - boot application image from memorybootp   - boot image via network using BOOTP/TFTP protocolbootvx  - Boot vxWorks from an ELF imagecmp     - memory compareconinfo - print console devices and informationcp      - memory copycrc32   - checksum calculationdate    - get/set/reset date & timedcache  - enable or disable data cachedhcp    - boot image via network using DHCP/TFTP protocolecho    - echo args to consoleeditenv - edit environment variableeeprom  - EEPROM sub-systemerase   - erase FLASH memoryexit    - exit scriptfalse   - do nothing, unsuccessfullyfatinfo - print information about filesystemfatload - load binary file from a dos filesystemfatls   - list files in a directory (default /)flinfo  - print FLASH memory informationfsinfo  - print information about filesystemsfsload  - load binary file from a filesystem imagego      - start application at address 'addr'help    - print command description/usagei2c     - I2C sub-systemicache  - enable or disable instruction cacheiminfo  - print header information for application imageimls    - list all images found in flashimxtract- extract a part of a multi-imageitest   - return true/false on integer compareloadb   - load binary file over serial line (kermit mode)loads   - load S-Record file over serial lineloadx   - load binary file over serial line (xmodem mode)loady   - load binary file over serial line (ymodem mode)loop    - infinite loop on address rangels      - list files in a directory (default /)md      - memory displaymm      - memory modify (auto-incrementing address)mmc     - MMC sub-systemmtest   - simple RAM read/write testmw      - memory write (fill)nand    - NAND sub-systemnboot   - boot from NAND devicenfs     - boot image via network using NFS protocolnm      - memory modify (constant address)ping    - send ICMP ECHO_REQUEST to network hostprintenv- print environment variablesprotect - enable or disable FLASH write protectionrarpboot- boot image via network using RARP/TFTP protocolreginfo - print register informationreset   - Perform RESET of the CPUrun     - run commands in an environment variablesaveenv - save environment variables to persistent storagesetenv  - set environment variablesshowvar - print local hushshell variablessleep   - delay execution for some timesource  - run script from memorytest    - minimal test like /bin/shtftpboot- boot image via network using TFTP protocoltrue    - do nothing, successfullyunzip   - unzip a memory regionusb     - USB sub-systemusbboot - boot from USB deviceusbslave- usbslave - get file from host(PC)version - print monitor version

找到其中与环境变量env相关的命令。一个是打印当前的环境变量的命令printenv,一个是修改环境变量的命令editenv,还有一个是保存环境变量到存储器的命令saveenv。一个一个的用起来吧。

1、首先把当前的环境变量env的值打印出来。如下:

[u-boot@MINI2440]# printenvbootargs=noinitrd root=/dev/nfs rw nfsroot=192.168.100.120:/opt/FriendlyARM/mini2440/rootfs ip=192.168.100.230:192.168.100.120:192.168.100.1:255.255.255.0 console=ttySAC0,115200 init=/linuxrc mem=64Mbootcmd=nfs 0x30008000 192.168.100.120:/opt/FriendlyARM/mini2440/rootfs/zImage.img;bootmbootdelay=10baudrate=115200ethaddr=08:08:11:18:12:27ipaddr=192.168.100.230serverip=192.168.100.120gatewayip=192.168.100.1netmask=255.255.255.0tekkaman=bmp d 70000 stdin=serialstdout=serialstderr=serialethact=dm9000Environment size: 515/131068 bytes

可以看到,变量bootcmd的值,确实是zImage.img。那么接下来我们就要修改这个参数就好。使用editenv这个命令,如下:

[u-boot@MINI2440]# editenv bootcmdedit: nfs 0x30008000 192.168.100.120:/opt/FriendlyARM/mini2440/rootfs/uImage.img;bootm

修改完后记得手动保存一下,否则uboot是不会自动将你的修改动作存入存储器的,一重启就丢失了,白弄了。如下:

[u-boot@MINI2440]# saveenv Saving Environment to NAND...Erasing Nand...Erasing at 0x7c00000000002 --   0% complete.Writing to Nand... done

OK,修改完成了。如果不太放心有没有修改成功,那么我们再将此刻最新的环境变量值打印出来看看吧,如下:

[u-boot@MINI2440]# printenvbootargs=noinitrd root=/dev/nfs rw nfsroot=192.168.100.120:/opt/FriendlyARM/mini2440/rootfs ip=192.168.100.230:192.168.100.120:192.168.100.1:255.255.255.0 console=ttySAC0,115200 init=/linuxrc mem=64Mbootdelay=10baudrate=115200ethaddr=08:08:11:18:12:27ipaddr=192.168.100.230serverip=192.168.100.120gatewayip=192.168.100.1netmask=255.255.255.0tekkaman=bmp d 70000 stdin=serialstdout=serialstderr=serialethact=dm9000bootcmd=nfs 0x30008000 192.168.100.120:/opt/FriendlyARM/mini2440/rootfs/uImage.img;bootmEnvironment size: 515/131068 bytes

可以看到,变量bootcmd的值,已经成功修改为了uImage.img。OK,此时可以放心的重启了,输入reset命令就好!

uboot重启完后,可以看到,顺利的按照新的路径和文件名定位到内核文件,成功的引导了系统启动!

搞定,收工!

0 0