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

本文介绍如何在Linux环境下利用fw_printenv和fw_setenv工具读取及修改U-Boot环境变量。主要内容包括编译配置过程、分区信息设置、环境变量分区大小配置等关键技术点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

### 解决 `fw_printenv` 命令出现 BAD 错误 当遇到 `fw_printenv` 出现 BAD 错误的情况时,通常意味着环境变量存储区域存在读取或校验问题。具体表现为坏的循环冗余校验 (CRC),这会阻止正确加载环境变量。 #### 可能原因分析 - **坏的 CRC 校验**:如果环境中保存的数据损坏,则会出现 "bad CRC, using default environment" 的警告[^2]。 #### 解决策略 为了修复此问题,可以尝试以下方法: 1. **重置 U-Boot 环境变量** 使用 `fw_setenv` 工具来清除并重新设置必要的环境变量。通过删除现有配置文件 `/etc/fw_env.config` 或者直接修改该文件中的路径指向新的未受损分区。 2. **手动修正环境数据** 如果知道确切哪些变量被破坏,可以直接编辑对应的二进制文件(通常是 MTD 设备上的特定偏移位置),但这需要非常谨慎的操作以及对设备内部结构的理解。 3. **更新固件版本** 某些情况下,旧版U-Boot可能存在缺陷,在这种情形下升级到最新稳定版本可能解决问题。 4. **硬件层面排查** 对于某些嵌入式平台来说,Flash芯片本身可能出现物理损伤或者连接不良等问题,特别是对于AMD Flash而言,DQ5引脚用于检测操作状态异常,而其他品牌如SST则不具备相同机制,因此可能导致擦除失败进而影响参数写入准确性。 ```bash # 清理当前环境变量至默认值 sudo fw_setenv -s /path/to/default.env ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

omnibots

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值