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


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);

在linux系统中通过fw_printenv查看和设置u-boot中的环境变量的更多相关文章

  1. Linux系统采用netstat命令查看DDOS攻击的方法

    Linux系统采用netstat命令查看DDOS攻击的方法 来源:互联网 作者:佚名 时间:07-05 15:10:21 [大 中 小] 这篇文章主要为大家介绍了Linux系统采用netstat命令查 ...

  2. Linux系统使用ss命令查看端口状态

    Linux系统使用ss命令查看端口状态 目录 1.可用工具 2.ss帮助 2.1 选项分类说明 2.2 过滤选项family 2.3 过滤选项state 2.4 状态之间的关系 3.ss的使用 3.1 ...

  3. 如何在cmd命令行中查看、修改、删除与添加环境变量,语法格式例子:set path;echo %APPDATA%

    如何在cmd命令行中查看.修改.删除与添加环境变量 首先明确一点: 所有的在cmd命令行下对环境变量的修改只对当前窗口有效,不是永久性的修改.也就是说当关闭此cmd命令行窗口后,将不再起作用.永久性修 ...

  4. Linux 系统下10个查看网络与监听的命令

    下面列出来的10个基础的每个linux用户都应该知道的网络和监控命令.网络和监控命令类似于这些: hostname, ping, ifconfig, iwconfig, netstat, nslook ...

  5. linux 系统 解决php -v查看到版本于phpinfo()打印的版本不一致问题

    发现问题的原因: 安装zip扩展后,配置成功,但是使用gitlab合并的时候发生错误,经检查,使用phpinfo打印出来的php版本为7.1,而使用linux度服务器 运行 php -v的版本却是5. ...

  6. Linux系统:centos7下安装Jdk8、Tomcat8、MySQL5.7环境

    一.JDK1.8 环境搭建 1.上传文件解压 [root@localhost mysoft]# tar -zxvf jdk-8u161-linux-x64.tar.gz [root@localhost ...

  7. Windows 如何在cmd命令行中查看、修改、删除与添加环境变量

    转自:http://www.cnblogs.com/saptechnique/archive/2013/02/17/2914222.html 首先明确一点: 所有的在cmd命令行下对环境变量的修改只对 ...

  8. Linux系统如何将某一程序设置为开机自启动

    文章来源:百度知道. Linux开机启动程序详解 我们假设大家已经熟悉其它操作系统的引导过程,了解硬件的自检引导步骤,就只从Linux操作系统的引导加载程序(对个人电脑而言通常是LILO)开始,介绍L ...

  9. 如何在 cmd 命令行中查看、修改、删除与添加环境变量

    Windows 和 linux 区别 一.查看所有环境变量的名称和值:Linux下:exportWindows下:set二.根据名称查该环境变量的值:Linux下:echo $环境变量名比如:echo ...

随机推荐

  1. Microsoft.Extensions.DependencyInjection中的Transient依赖注入关系,使用不当会造成内存泄漏

    Microsoft.Extensions.DependencyInjection中(下面简称DI)的Transient依赖注入关系,表示每次DI获取一个全新的注入对象.但是使用Transient依赖注 ...

  2. cgdb安装

    cgdb官网:http://cgdb.github.io/ 一.cgdb安装 可使用wget命令下载,wget  http://cgdb.me/files/cgdb-0.7.0.tar.gz 之后解压 ...

  3. 源码安装中./configure的使用

    在linux中安装源码,在源码目录下使用 ./configure --prefix=xxx  --with=xxx 其中configure是一个可执行脚本, --prefix 选项就是配置安装的路径, ...

  4. 预编译 - Js三部曲

    预编译前奏 imply global - 暗示全局变量, window - 全局域 任何变量未经声明即赋值,该变量为全局所有 window 一切声明的 "全局" 变量,归windo ...

  5. zookeeper Cli的常用命令

    zookeeper Cli的常用命令 服务管理 启动ZK服务: zkServer.sh start 查看ZK状态: zkServer.sh status 停止ZK服务: zkServer.sh sto ...

  6. 对精致码农大佬的 [理解 volatile 关键字] 文章结论的思考和寻找真相

    一:背景 1. 讲故事 昨天在园里的编辑头条看到 精致码农大佬 写的一篇题为:[C#.NET 拾遗补漏]10:理解 volatile 关键字 (https://www.cnblogs.com/will ...

  7. 分四个阶段学习python并找到一份好工作

    第一阶段 关注公众号"轻松学编程"了解更多. 详细学习资料 需要时间一个月. 1.python概念 ​ python是一种解释型.面向对象.动态数据类型的高级程序语言. ​ 理解: ...

  8. DP百题练索引

    就是一篇还在咕的文章 DP百题练(一) DP百题练(二) DP百题练(三)

  9. c#方法 最大值我最小值

    static void Main(string[] args) { int[] a = { 6, 8, 9, 5, 2, 165, 58966 }; Console.WriteLine("最 ...

  10. 对hadoop之RPC的理解

    因为公司hadoop集群出现了一些瓶颈,在机器不增加的情况下需要进行优化,不管是存储还是处理性能,更合理的利用现有集群的资源,所以来学习了一波hadoop的rpc相关的知识和hdfs方面的知识,以及y ...