uboot设置默认env


1. 背景

21x/22x从V11版本相关配置已默认切换到env双备份机制,在这个机制下还可以增加一种设置default env的方法再给ENV增加一份保护。


2. 设置方法

env分区在读写过程中,如果突然断电,有极小的概率会出现数据损坏,导致env丢失,一但数据丢失系统会启动失败,为保证系统的启动,当env分区数据CRC校验失败时,会自动从default值去启动,由于每个用户分区的设置可能不尽相同,只需要按照以下步骤,在相应地方配置好默认值即可。

以下log代表ENV CRC 校验失败:

以NAND flash为例(NOR flash请根据相关code查看)

需修改文件boot/include/configs/pioneer3.h中对应的宏定义(文件有多个MTDPARTS_DEFAULT,要确保更改到对应位置):

  1. CONFIG_BOOTARGS和uboot下bootargs后内容的保持一致

  2. CONFIG_BOOTCOMMAND和uboot下bootcmd后内容的保持一致

  3. MTDPARTS_DEFAULT和uboot下mtdparts后内容的保持一致

  4. CONFIG_EXTRA_ENV_SETTINGS填写和uboot下需要的环境变量,请注意ernel_file_size和recovery_file_size的大小,如果是fastboot版本包括rootfs_file_size的大小,平时烧写数值都是文件大小,因为默认的没有办法判断文件大小,只能默认为分区大小了!

    #define CONFIG_BOOTARGS "ubi.mtd=UBI,2048 root=/dev/mtdblock7 rootfstype=squashfs ro init=/linuxrc LX_MEM=0x3FE0000 mma_heap=mma_heap_name0,miu=0,sz=0x1E00000 cma=2M highres=off mmap_reserved=fb,miu=0,sz=0x300000,max_start_off=0x3300000,max_end_off=0x3600000 mtdparts=nand0:1664k@1280k(BOOT0),1664k(BOOT1),256k(ENV),256k(ENV1),128k(KEY_CUST),5m(KERNEL),5m(RECOVERY),6m(rootfs),640k(MISC),108800k(UBI)"
    #define CONFIG_BOOTCOMMAND \
    "nand read.e 0x22000000 KERNEL ${kernel_file_size};" \
    "dcache on ;" \
    "bootlogo 0 0 0 0;" \
    "bootm 0x22000000;" \
    "nand read.e 0x22000000 RECOVERY ${recovery_file_size};" \
    "dcache on ;" \
    "bootm 0x22000000" \
    ""
    #define MTDIDS_DEFAULT "nand0=nand0" /* "nor0=physmap-flash.0,nand0=nand" */
    /* must be different from real partition to test NAND partition function */
    #define MTDPARTS_DEFAULT "mtdparts=nand0:1664k@1280k(BOOT0),1664k(BOOT1),256k(ENV),256k(ENV1),128k(KEY_CUST),5m(KERNEL),5m(RECOVERY),6m(rootfs),640k(MISC),108800k(UBI)"
    #define CONFIG_EXTRA_ENV_SETTINGS \
    "mtdids=" MTDIDS_DEFAULT "\0" \
    "mtdparts=" MTDPARTS_DEFAULT "\0" \
    "partition=nand0,0\0" \
    "autoestart=0\0" \
    "baudrate=115200\0" \
    "bootdelay=0\0" \
    "ethact=sstar_emac\0" \
    "ethaddr=00:30:1b:ba:02:db\0" \
    "kernel_file_size=0x500000\0" \
    "mtddevname=BOOT0\0" \
    "mtddevnum=0\0" \
    "recovery_file_size=0x500000\0" \
    "sstar_bbm=off\0" \
    "stderr=serial\0" \
    "stdin=serial\0" \
    "stdout=serial\0" \
    "usb_folder=images\0" \
    ""
    

boot/include/configs/pioneer3.h设置了系统启动必须的default env之后,重编uboot并更新到板端,可以保证env数据丢失时,依旧可以正常启动到系统。