Cubieboard2 A20制作SD启动卡时使用了boot.cmd,然后生成boot.scr拷贝至sd卡第一个分区,这种方法有个坏处就是每次更改boot参数都需要重新生成一次boot.scr,比较麻烦,其实uBoot提供了uEnv.txt,可以直接在里面添加参数,启动时会先读取uEnv.txt,然后再执行boot.scr
在为Cubieboard添加小米wifi支持时,就可以利用uEnv.txt添加一个额外参数coherent_pool=6M,而不用重新生成boot.scr
boot.cmd内容如下:
$ cat boot.cmd setenv bootargs console=ttyS0,115200 noinitrd disp.screen0_output_mode=EDID:1280x1024p60 init=/sbin/init root=/dev/mmcblk0p2 rootfstype=ext4 rootwait panic=10 ${extraargs} fatload mmc 0 0x43000000 boot/script.bin fatload mmc 0 0x48000000 boot/uImage bootm 0x48000000特别注意${extraargs}不能省略,否则uEnv.txt中通过extraargs设置的参数就不起作用了 uEnv.txt内容如下:
$ cat uEnv.txt extraargs=coherent_pool=6MuBoot的WiKi中提到default environment如下:
baudrate=115200 scriptaddr=0x44000000 bootscr=boot.scr bootenv=uEnv.txt loadbootscr=fatload mmc 0 ${scriptaddr} ${bootscr} || ext2load mmc 0 ${scriptaddr} ${bootscr} || ext2load mmc 0 ${scriptaddr} boot/${bootscr} loadbootenv=fatload mmc 0 ${scriptaddr} ${bootenv} || ext2load mmc 0 ${scriptaddr} ${bootenv} || ext2load mmc 0 ${scriptaddr} boot/${bootenv} boot_mmc=fatload mmc 0 0x43000000 script.bin && fatload mmc 0 0x48000000 ${kernel} && watchdog 0 && bootm 0x48000000 bootcmd="if run loadbootenv; then \ echo Loaded environment from ${bootenv}; \ env import -t ${scriptaddr} ${filesize}; \ fi; \ if test -n ${uenvcmd}; then \ echo Running uenvcmd ...; \ run uenvcmd; \ fi; \ if run loadbootscr; then \ echo Jumping to ${bootscr}; \ source ${scriptaddr}; \ fi; \ run setargs boot_mmc;" bootdelay=3 console=ttyS0,115200 kernel=uImage loglevel=8 panicarg=panic=10 root=/dev/mmcblk0p2 setargs=setenv bootargs console=${console} root=${root} loglevel=${loglevel} ${panicarg} ${extraargs} stderr=serial stdin=serial stdout=serial
可以看到运行bootcmd时,通过run loadbootenv把uEnv.txt加载到scriptaddr处,然后env import加载uEnv.txt中定义的变量
如果uEnv.txt中定义了uenvcmd,它会被run
然后run loadbootscr加载boot.scr到scriptaddr处,并source执行该脚本,此时会执行我们在boot.cmd中设置的setenv bootargs
最后run setargs boot_mmc
更多内容参考:uBoot WiKi
从u-boot的源代码看,u-boot-sunxi/include/configs/sunxi-common.h中定义了CONFIG_BOOTCOMMAND
#define CONFIG_BOOTCOMMAND \
RUN_BOOT_RAM \
“if run loadbootenv; then “ \
“echo Loaded environment from ${bootenv};” \
“env import -t ${scriptaddr} ${filesize};” \
“fi;” \
“if test -n \\”${uenvcmd}\\”; then “ \
“echo Running uenvcmd …;” \
“run uenvcmd;” \
“fi;” \
“if run loadbootscr; then “\
“echo Jumping to ${bootscr};” \
“source ${scriptaddr};” \
“fi;” \
“run autoboot;” \
“”
u-boot-sunxi/include/env_default.h生成default config
sunxi的default config中bootcmd的最后一行应该是run autoboot,而不是前面所说的run setargs boot_mmc
这也是为什么如果boot.cmd中不添加extraargs,uEnv.txt就不生效