源码在uboot根目录tools/env下面。
编译前需要配置一下分区信息。
修改文件tools/env/fw_env.h
单环境变量分区:
//单环境变量分区需要注释下面这个宏
//#define HAVE_REDUND
#define DEVICE1_NAME "/dev/mtd1" //设备名字
#define DEVICE1_OFFSET 0x000000 //注意这是分区内偏移地址,不是分区偏移地址
#define ENV1_SIZE 0x100000 //在该分区分多少空间用作存储环境变量
#define DEVICE1_ESIZE 0x100000 //扇区大小
#define DEVICE1_ENVSECTORS 1 //扇区数量
双环境变量分区:
//双环境变量分区需要定义下面这个宏
#define HAVE_REDUND
#define DEVICE1_NAME "/dev/mtd1" //设备名字
#define DEVICE1_OFFSET 0x000000 //注意这是分区内偏移地址,不是分区偏移地址
#define ENV1_SIZE 0x100000 //分区大小
#define DEVICE1_ESIZE 0x100000 //这个不知道干嘛,和分区一样就行了
#define DEVICE1_ENVSECTORS 2
#define DEVICE2_NAME "/dev/mtd2" //设备名字
#define DEVICE2_OFFSET 0x000000 //注意这是分区内偏移地址,不是分区偏移地址
#define ENV2_SIZE 0x200000 //分区大小
#define DEVICE2_ESIZE 0x200000 //扇区大小
#define DEVICE2_ENVSECTORS 2 //这个也不知道干嘛的
上面的环境分区大小信息可以在你的配置.h中获得
include/configs/***.h
ENV1_SIZE = CONFIG_ENV_SIZE //这两个值一样就行
DEVICE1_ESIZE = CONFIG_ENV_SECT_SIZE
如果这两个不一样获取环境变量时会报错:
Warning: Bad CRC, using default environment
配置完就可以开始编译了。
在uboot根目录下执行以下指令进行编译
make CROSS_COMPILE=<你的交叉编译器的绝对路径> env
#例如
make CROSS_COMPILE=/bin/arm-linux- env
注意交叉编译器只能在make时通过CROSS_COMPILE传进去,否则无效。
最好传绝对路径,不然可能会出现找不到编译器的错误信息。
编译完后,tools/env下面就有fw_printenv,把它拷到板子上就行了。
fw_setenv和fw_printenv共用一个文件,只是通过程序名来区分不同功能,所以我们在开发板创建一个fw_setenv的软连接就可以了。
ln -s fw_printenv setenv
得到fw_printenv和fw_setenv后还不能正常使用,还需要把tools/env/fw_env.config拷到板子/etc目录下
需要做以下修改
# Configuration file for fw_(printenv/setenv) utility.
# Up to two entries are valid, in this case the redundant
# environment sector is assumed present.
# Notice, that the "Number of sectors" is not required on NOR and SPI-dataflash.
# Futhermore, if the Flash sector size is ommitted, this value is assumed to
# be the same as the Environment size, which is valid for NOR and SPI-dataflash
# NOR example
# MTD device name Device offset Env. size Flash sector size Number of sectors
#/dev/mtd1 0x0000 0x4000 0x4000
#/dev/mtd2 0x0000 0x4000 0x4000
# MTD SPI-dataflash example
# MTD device name Device offset Env. size Flash sector size Number of sectors
#/dev/mtd5 0x4200 0x4200
#/dev/mtd6 0x4200 0x4200
# NAND example
/dev/mtd1 0x000000 0x100000 0x100000 1
# Block device example
#/dev/mmcblk0 0xc0000 0x20000
# VFAT example
#/boot/uboot.env 0x0000 0x4000
我的时nand flash,所以就按nand flash填充分区信息。
注意offset也是分区内偏移地址,设为0就好了。
后面两项填分区大小即可。
fw_env.config与fw_env.h对应关系。
设备名 环境变量在分区内偏移 环境变量占用大小 扇区大小 扇区数
MTD device name Device offset Env. size Flash sector size Number of sectors
DEVICE1_NAME DEVICE1_OFFSET ENV1_SIZE DEVICE1_ESIZE DEVICE1_ENVSECTORS
这些都配置对了之后就可以使用fw_printenv和fw_setenv进行读取和修改uboot环境变量分区的变量了。
使用方法和uboot命令行中的printenv和setenv命令一样。
注意如果你仔细核对过配置文件都是一样的但是还是报“Warning: Bad CRC, using default environment”错误,可以尝试先进uboot命令行执行saveenv,将默认环境变量保存到nand flash中,然后再进行读写操作。