linux下使用fw_printenv读取、fw_setenv修改uboot环境变量

文章目录

  • linux下使用fw_printenv读取、fw_setenv修改uboot环境变量
    • 编译
      • 配置
      • fw_printenv
      • fw_setenv
    • 配置

linux下使用fw_printenv读取、fw_setenv修改uboot环境变量

编译

配置

源码在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

配置完就可以开始编译了。

fw_printenv

在uboot根目录下执行以下指令进行编译

make CROSS_COMPILE=<你的交叉编译器的绝对路径> env

#例如
make CROSS_COMPILE=/bin/arm-linux- env

注意交叉编译器只能在make时通过CROSS_COMPILE传进去,否则无效。

最好传绝对路径,不然可能会出现找不到编译器的错误信息。

编译完后,tools/env下面就有fw_printenv,把它拷到板子上就行了。

fw_setenv

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中,然后再进行读写操作。

你可能感兴趣的:(linux,uboot,工具移植,linux)