使用的芯片是tda2x,开发环境是TI提供的Process-SDK-VISION。
使用的是fw_printenv工具,这个工具是在Linux下使用的,该工具相当于uboot中的printenv和setenv,命令的使用方法也是一样的。
fw_printenv编译
fw_printenv的源码在uboot中,首先需要编译出来fw_printenv。
在uboot源码路径tools/env中是fw_printenv的源码,tools/env/README中有关于fw_printenv的编译和配置介绍。
编译的方法是在uboot源码路径下,执行
对应我的板子则是:
在uboot源码路径tools/env目录下生成了fw_printenv可执行文件。
将该文件放到Linux文件系统的/usr/bin路径下。
fw_printenv配置
在uboot源码路径tools/env目录下,fw_env.config文件是fw_printenv的配置文件,需要拷贝到Linux文件系统的/etc目录下,fw_printenv需要通过该文件确定uboot的环境变量烧录在什么地方。
fw_env.config中的内容如下:
因为我的板子上环境变量是烧在emmc上,所以我将/dev/mmcblkX相关的注释给打开了。后面的两个参数分别表示在块设备上的偏移地址和专用的大小。
我的板子上有一个SD卡和一个emmc,在Linux上SD卡被识别为mmcblk0,emmc被识别为mmcblk1。
uboot的环境变量烧写位置配置是在uboot源码文件include/configs/dra7xx_evm.h中定义的:
#ifndef CONFIG_QSPI_BOOT
/* MMC ENV related defines */
#define CONFIG_SYS_MMC_ENV_DEV 1 /* SLOT2: eMMC(1) */
#define CONFIG_ENV_SIZE (128 <#define CONFIG_ENV_OFFSET 0x260000#define CONFIG_ENV_OFFSET_REDUND (CONFIG_ENV_OFFSET + CONFIG_ENV_SIZE)#define CONFIG_SYS_REDUNDAND_ENVIRONMENT#endif
这些宏定义可以参考uboot目录下env/Kconfig中的说明。
.config文件中没有定义CONFIG_QSPI_BOOT,所以已经可以确定环境变量的烧写位置了,修改fw_env.config中相关内容为:
我当前使用的启动介质是SD卡,所以不需要担心emmc中的东西被擦除。
启动板子,uboot启动的时候停一下,使用saveenv命令将uboot环境变量保存到emmc中
继续启动Linux系统,使用fw_printenv:
打印了很多环境变量,但是第一句Bad CRC告诉我翻车了
查找原因
可能的原因
1、环境变量没有被写入/dev/mmcblk1的偏移地址0x260000处
2、fw_printenv没有到/dev/mmcblk1的偏移地址0x260000处寻找环境变量
3、前两个都对,但是这两个操作之间有其他操作修改了环境变量内容
对于原因1,
先在uboot下设置一个环境变量,然后保存,从emmc中读出环境变量:
很明显,环境变量aaa已经写入emmc中了。
在Linux下执行
查看/dev/mmcblk1中的内容,部分内容如下:
说明Linux起来之后,环境变量也是存在的。
原因2和原因2验证比较困难,网上找了一圈,发现有这个设置:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SMkRTO1M2M5IDM0MGOkhTZygTOhNjZhhjMzMGO4gTN28CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
网址是https://e2e.ti.com/support/legacy_forums/embedded/linux/f/354/t/425207?How-to-make-Uboot-envtools-work-on-eMMC-Beaglebone-black
看来必须提供一个备份地址,于是更新fw_env.config中内容为:
重新执行fw_printenv,问题消失:
尝试在Linux中修改uboot环境变量,在uboot中读取。
aaa被改成了ccc。
重启进入uboot,查看变量:
=> printenv
aaa=ccc
arch=arm
args_mmc=run finduuid;setenv bootargs console=${console} ${optargs} root=PARTUUID=${uuid} rw rootfstype=${mmcrootfstype}
baudrate=115200
board=dra7xx