YOCTO Dunfell下fw_printenv/fw_setenv无法读写SPI Flash中U-Boot环境变量
解决fw_printenv/fw_setenv读写SPI Flash U-Boot环境变量问题
核心问题分析
当前问题的根源是fw_env.config配置与U-Boot环境分区定义、MTD设备逻辑不匹配:
- 偏移地址错误:fw_env.config中填写的是SPI Flash全局偏移,但实际应为对应MTD分区的相对偏移
- 环境区大小错误:配置中写的
0x010000(64KiB)与U-Boot定义的SZ_128K(0x20000,128KiB)不匹配 - 可能存在MTD设备与U-Boot环境分区的对应关系错误
分步修复
1. 修正fw_env.config配置
首先确认/dev/mtd2和/dev/mtd3对应U-Boot的两个环境分区:
/dev/mtd2→ 第一个环境分区(0x0A0000 - 0x0BFFFF,128KiB)/dev/mtd3→ 第二个环境分区(0x0C0000 - 0x0DFFFF,128KiB)
修改/etc/fw_env.config为:
/dev/mtd2 0x000000 0x020000 /dev/mtd3 0x000000 0x020000
- 第二列
0x000000:MTD分区内的相对偏移(环境变量从分区起始位置开始) - 第三列
0x020000:对应U-Boot中CONFIG_SYS_SPI_ARGS_SIZE = SZ_128K的环境区大小
2. 验证MTD设备与分区的对应关系
执行以下命令查看MTD分区信息:
cat /proc/mtd
确认输出中mtd2和mtd3的大小为0x20000(128KiB),且名称对应U-Boot环境分区(类似u-boot-env)。如果对应关系错误,需调整fw_env.config中的MTD设备号。
3. 检查设备权限
fw_printenv/fw_setenv需要读写MTD设备的权限,执行以下命令确保权限正确:
# 临时赋予权限(重启后失效) chmod 666 /dev/mtd2 /dev/mtd3 # 永久生效:将当前用户加入disk组 usermod -aG disk $USER
之后重新登录或执行newgrp disk使权限生效。
4. 验证修复效果
执行fw_printenv测试:
fw_printenv
如果成功读取到U-Boot命令行中看到的环境变量,说明配置正确。再测试设置变量:
fw_setenv test_var "hello" fw_printenv test_var
重启进入U-Boot命令行,执行printenv test_var确认变量已同步。
5. 额外检查(若仍有问题)
- 确认Yocto编译libubootenv时启用了冗余环境支持(对应U-Boot的
CONFIG_SYS_REDUNDAND_ENVIRONMENT) - 检查U-Boot中
CONFIG_ENV_SECT_SIZE(4KiB)与SPI Flash的扇区大小是否一致,libubootenv编译时可通过--with-env-sector-size=4096指定匹配参数
内容的提问来源于stack exchange,提问作者sethu
相关产品推荐
相关产品推荐

