uEnv.txt的使用

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=6M
  uBoot的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就不生效