天天看点

linux 环境变量_在linux中访问uboot环境变量

使用的芯片是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验证比较困难,网上找了一圈,发现有这个设置:

linux 环境变量_在linux中访问uboot环境变量

网址是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
           

继续阅读