在linux系统中通过fw_printenv查看和设置u-boot中的环境变量

news/2024/11/29 12:39:19/

uboot下可以通过命令访问(printenv)和修改环境变量(setenv),但是如果需要在Linux系统下访问这些数据该怎么办呢?其实uboot早就帮我们想好了。


 1、编译fw_printenv工具

source /opt/poky/environment... 

创建交叉编译环境。

更改u-boot/tools/env/Make 

添加CC

CC=aarch64-poky-linux-gcc -march=armv8-a -mtune=cortex-a57.cortex-a53 --sysroot=/opt/poky/2.4.2/sysroots/aarch64-poky-linux
override HOSTCC = $(CC)
$(warning $(HOSTCC))

编译(根据自己平台):

make ARCH=arm CROSS_COMPILE=aarch64-poky-linux- envtools

其实可以修改uboot根目录下的Makefile文件,加上如下内容:

diff --git a/Makefile b/Makefile
index ddb1a40950..c1c202e42c 100644
--- a/Makefile
+++ b/Makefile
@@ -762,6 +762,7 @@ libs-y += drivers/usb/ulpi/libs-y += cmd/libs-y += common/libs-y += env/
+libs-y += tools/env/libs-$(CONFIG_API) += api/ifdef CONFIG_POSTlibs-y += post/

然后正常编译uboot即可。
2、安装fw_printenv工具
      到/tools/env目录中,将编译好的fw_printenv拷贝到目标机的文件系统中,并通过"ln -s fw_printenv fw_setenv",创建一个fw_setenv到fw_printenv的软链。

      这个工具还需要一个配置文件,以获取uboot的ENV区域的位置信息。默认状态下,请将fw_env.config文件拷贝到目标机的文件系统的/etc目录下。然后结合uboot配置中定义的ENV区和Linux下mtd分区的情况修改配置文件。具体的修改方法见fw_env.config文件中的说明及/tools/env/README文件。

3、fw_printenv工具的使用
    其实fw_printenv使用起来和uboot下的printenv和setenv指令是一模一样的。
    打印uboot环境变量:

    fw_printenv [[ -n name ] | [ name ... ]]

   如果不指定name,fw_printenv会打印出ENV区中的所有环境变

4.当指定的环境变量大小不正确时提示,这里是imx8mm

#:/etc# fw_printenv

Warning: Bad CRC, using default environment

其中device name, Device offset,Env size应该分别对应于uboot源码目录中include/configs/imx8mm_evk.h或者u-boot.cfg相关文件中的

#define CONFIG_ENV_IS_IN_MMC 1

#define CONFIG_ENV_OFFSET (64 * SZ_64K)

#define CONFIG_ENV_SIZE 0x1000

# Block device example

device name       Device offset          Env. size

/dev/mmcblk1     0x400000                0x1000

注意:

  如果还有问题,应该是本来就没有保存环境变量,请参考《启动时出现错误:*** Warning - bad CRC or NAND》这个笔记

      

5. 设置uboot环境变量:
fw_setenv name [ value ... ]

如果不指定value,表示要删除这个name的环境变量。

6. 另外如果你想直接在你的应用程序中使用这个库文件,可以把目录下的lib.a链接到你的应用中。

导出的函数有

1

2

3

4

5

6

7

8

9

extern int   fw_printenv(int argc, char *argv[]);

extern char *fw_getenv  (char *name);

extern int fw_setenv  (int argc, char *argv[]);

extern int fw_parse_script(char *fname);

extern int fw_env_open(void);

extern int fw_env_write(char *name, char *value);

extern int fw_env_close(void);

extern unsigned long  crc32  (unsigned long, const unsigned char *, unsigned);

 根据自己需要,使用起来非常方便。

 唯一需要注意的是操作是加文件锁,防止多个进程写入,数据出错,大概流程如下,具体可以参考 fw_env_main.c

1

2

3

4

5

6

7

8

9

10

const char *lockname = "/var/lock/" CMD_PRINTENV ".lock";

int lockfd = -1;

lockfd = open(lockname, O_WRONLY | O_CREAT | O_TRUNC, 0666);

flock(lockfd, LOCK_EX);

//set or read uboot env

flock(lockfd, LOCK_UN);


http://www.ppmy.cn/news/906056.html

相关文章

Android OTG U盘文件读写

Android U盘读写要用到的三方库:https://github.com/magnusja/libaums,使用方法地那就链接了解。 最近项目需要用到OTG功能,写了一个小demo,做为自己的笔记也供大家参考。 需要用到的权限: USB插拔广播 import andro…

将openwrt软路由装进U盘中并运行

我们可以将openwrt,甚至是centos7系统装到U盘中,作为一个可移动系统. 这边,我以openwrt软路由来举个例. 准备 1.一张不小于3G的U盘或者TF存储卡 2.WinImage9.0 下载链接:https://pan.baidu.com/s/1JuQWn9A_wMtJ2LVWbzbQyQ 提取码: 28xv 3.openwrt固件的vmdk虚拟机磁盘文件 …

uboot 修改linux密码,Linux下设置u-boot环境变量----fw_setenv

打印uboot环境变量: fw_printenv [[ -n name ] | [ name ... ]] # ./fw_printenv -n baudrate 如果不指定name,fw_printenv会打印出ENV区中的所有环境变 设置uboot环境变量: fw_setenv name [ value ... ] 如果不指定value,表示要…

fw150rm刷openwrt固件_N1刷openwrt固件至eMMC详细教程,非常适合小白!!!

本帖最后由 ganlu510 于 2019-6-26 10:38 编辑 Phicomm N1刷openwrt路由固件详细笔记 提醒:该笔记只适用于通过armbian系统将openwrt固件刷入到盒子的emmc中的场景。1新N1盒子降级 只有2.18(不含)以上版本的盒子才需要降级!但是已经刷过电视系统或者OP系统的盒子就不需要再降…

linux fw_printenv fw_setenv 设置uboot环境变量

1、fw_printenv/fw_setenv u-boot提供fw_printenv/fw_setenv 为Linux访问uboot环境编译。 在uboot端编译,在Linux端使用 2、测试环境 source /opt/fsl-imx-xwayland/4.14-sumo/environment-setup-aarch64-poky-linux make envtools CC"$CC" Now, you …

fw_printenv/fw_setenv

1、编译fw_printenv工具 make ARCHxxx CROSS_COMPILExxx- env 注:生成的工具位于/tools/env/ 2、创建软链接fw_setenv "ln -s fw_printenv fw_setenv" 3、修改配置文件fw_env.config include/configs/xxx.h或者u-boot.cfg中CONFIG_ENV_OFFSET偏移CO…

Android U盘 读写

首先给予足够的读写权限&#xff1a; <uses-permission android:name"android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name"a…

海思 fw_printenv 和 fw_setenv 工具详解

目录 前言&#xff1a; 1、开发环境&#xff1a; 2、fw_printenv 和 fw_setenv 的作用 3、fw_printenv 配置方法一 3.1 工具源码路径 3.2 工具源码编译 3.2.1 编译命令及步骤 3.2.2 解决编译出现的问题&#xff08;建议先执行此步骤&#xff0c;再执行 3.2.1&#xf…