海思 fw_printenv 和 fw_setenv 工具详解
迪丽瓦拉
2025-05-29 05:29:59
0

目录

前言:

1、开发环境: 

2、fw_printenv 和 fw_setenv 的作用

3、fw_printenv 工具开发流程

3.1 工具源码路径

3.2  工具源码编译

3.2.1 编译命令及步骤

3.2.2 解决编译出现的问题(建议先执行此步骤,再执行 3.2.1)

3.2.3 对 include/linux/types.h 相关参数的使用声明

3.3  修改工具的配置文件 fw_env.config 

3.4  对 fw_printenv 工具进行压缩 

3.5 移植 fw_env.config 和 fw_printenv 文件

3.5.1  将 fw_env.config 和 fw_printenv 移植到目标机

3.5.2  创建 fw_setenv 工具

4、fw_printenv 工具测试 

5、彩蛋篇幅 

6、总结


前言:

1:编译前请先自行安装所需的交叉编译器(参考SDK里文档: readme.txt)
2:本文介绍的env工具的配置使用,适合所有的嵌入式平台参考开发
3:本文将以 Hi3536_SDK_V2.0.7.0 和 u-boot-2010.06 为例

1、开发环境: 

windows10电脑 + 虚拟机15 Pro + Ubuntu18.0.4 

2、fw_printenv 和 fw_setenv 的作用

  • 如果做过 uboot 移植/开发的,或者熟悉 uboot 命令行操作的,相信大家对于 printenv 和 setenv 并不陌生。在 uboot 命令行中,printenv 的作用是查看保存在环境变量中的默认参数,setenv 的作用是对环境变量的默认参数做出临时的修改(还需要调用 saveenv 才能更新保存)。
  • 那么  fw_printenv 和 fw_setenv 有什么作用呢?它们的作用基本是等同于 printenv 和 setenv 的,只不过 printenv 和 setenv 只能在 uboot 命令行使用,而 fw_printenv 和 fw_setenv 则可以在应用层上对 uboot 环境变量的参数做出修改。
  • 特别声明, fw_setenv 除了能修改 uboot 环境变量参数外,还自带了保存功能,在这一点上它是跟 setenv 有区别的。
  • fw_setenv 仅仅是 fw_printenv 创建的一个软链接,基本不占内存空间(下面的篇幅将会有相关的介绍)。

3、fw_printenv 工具开发流程

3.1 工具源码路径

  • 由于本文以 Hi3536 为例对功能进行介绍,所以在此文中只列举相关 SDK 的 uboot 源码
  • uboot 源码路径:Hi3536_SDK_V2.0.7.0/osdrv/opensource/uboot/u-boot-2010.06/ 
  • fw_printenv 源码路径:u-boot-2010.06/tools/env/  

3.2  工具源码编译

3.2.1 编译命令及步骤

# 进入 uboot 源码目录
cd Hi3536_SDK_V2.0.7.0/osdrv/opensource/uboot/u-boot-2010.06# 如果是首次编译,建议先整体编译一次uboot源码,否则可跳过此步骤
make ARCH=arm CROSS_COMPILE=arm-hisiv400-linux- hi3536_config
make ARCH=arm CROSS_COMPILE=arm-hisiv400-linux- -j8# 开始编译 fw_printenv 工具
make ARCH=arm CROSS_COMPILE=arm-hisiv400-linux- env

源码编译成功后会在 tools/env 目录下,生成  fw_env.config 和 fw_printenv 两个文件:  

3.2.2 解决编译出现的问题(建议先执行此步骤,再执行 3.2.1)

  • 需要屏蔽 include/linux/types.h 中的 uintmax_t 和 intmax_t 这两个参数:
# 进入 uboot 源码目录
cd Hi3536_SDK_V2.0.7.0/osdrv/opensource/uboot/u-boot-2010.06# 屏蔽以下的变量声明(因为在 arm-hisiv500-linux/target/usr/include/stdint.h 已经定已过了)
vi include/linux/types.h +154//typedef u_int32_t                  uintmax_t;
//typedef int32_t                    intmax_t;

3.2.3 对 include/linux/types.h 相关参数的使用声明

特别声明:执行完 3.2.2 后,建议把刚才在 include/linux/types.h 屏蔽的参数重新打开,否则当你需要编译 uboot.bin 时会有参数未定义的报错:

3.3  修改工具的配置文件 fw_env.config 

  • 配置 fw_env.config 文件,以获取 uboot 的 env 区域的位置信息
  • 具体的修改方法见 fw_env.config 文件中的说明及 u-boot-2010.06/tools/env/README 文件。其中需要注意的是 nor flash 可以忽略  “Number of sectors” 这个扇区的配置,只有 nand flash 才会用到。
  • 那么 nand flash 配置 Number of sectors 为 1 或者 2,分别是什么意思呢?其实,1 表示当前使用的 uboot 只配置了一个 env 环境变量区,而 2 则表示有 2 个 env 环境变量区。大家在配置参数时可根据实际情况来配置。
  • 下面我们将以 uboot/hi3536.h(nor flash)1个env环境变量扇区为例,配置 fw_env.config 文件具体实现如下:

1)查看 hi3536c.h 环境变量配置:
     #define CONFIG_ENV_OFFSET    0x80000      /* environment starts here */
     #define CONFIG_ENV_SIZE        0x40000         /* include ENV_HEADER_SIZE */
     #define CONFIG_ENV_SECT_SIZE    CONFIG_ENV_SIZE
           
2)修改 fw_env.config 文件配置:
    # MTD device name    Device offset    Env. size    Flash sector size    Number of sectors
       /dev/mtd0                 0x80000           0x40000     0x40000 

  • 如何确定  fw_env.config 文件中 uboot 环境变量使用了哪个设备节点,可通过如下命令查看:
cat /proc/mtd

3.4  对 fw_printenv 工具进行压缩 

  • 为了节省 Flash 内存空间,可通过如下命令去掉工具中相应的符号和调试信息: 
# 进入工具生成路径
cd Hi3536_SDK_V2.0.7.0/osdrv/opensource/uboot/u-boot-2010.06/tools/env# 对工具进行压缩处理
arm-hisiv500-linux-strip fw_printenv

3.5 移植 fw_env.config 和 fw_printenv 文件

3.5.1  将 fw_env.config 和 fw_printenv 移植到目标机

  • 将 fw_env.config 和 fw_printenv 文件,分别拷贝到目标机文件系统(rootfs)的 /etc 和 /bin 目录下:
cd Hi3536_SDK_V2.0.7.0/osdrv/opensource/uboot/u-boot-2010.06/tools/env
cp fw_env.config rootfs/etc
cp fw_printenv rootfs/bin

3.5.2  创建 fw_setenv 工具

  • 进入目标机文件系统(rootfs)的 /bin 目录下,通过软链接创建一个 fw_setenv 工具:
cd rootfs/bin
ln -s fw_printenv fw_setenv

4、fw_printenv 工具测试 

  • 经过上边一些步骤的编译与移植之后,现在我们可以开始测试一下工具在目标机上是否可用了。
  • 那么如何测试呢?我们可以直接进入目标机的任意路径,只需输入 fw_printenv 然后回车,即可查看到 uboot 环境变量保存的默认参数了:
fw_printenv

  • 那么有没有更直观的使用方法呢?这不就来了吗,且看我们在目标机上对 uboot 开机延时 bootdelay 做些修改,将 bootdelay 从等待 1s 变为等待 3s:

  • bootdelay 参数修改后,reboot 重启目标机后,可以看到 uboot 开机延时时间确实改为了 3s 的等待:

5、彩蛋篇幅 

  • 本章内容到这里已经接近尾声了,希望以上内容能对大家有所帮助。
  • 不过再补充一点,本章到这里为止都只是围绕着 fw_printenv 配置 fw_env.config 的方法来实现功能的而已。
  • 其实,fw_printenv 还有另外一种方法是不需要配置 fw_env.config 也可实现的,就是直接修改源码来配置。接下来我们可以来看下这个工具的源码(fw_env.c 和 fw_env.h),再结合 u-boot-2010.06/tools/env/README 文件,看看它实现的原理是怎样的?
  • 这里我就不卖关子了,直接看源码实现:

  • 看过源码后,相信大家心中对于 fw_printenv 这个工具也有一定的了解了,就是可以直接修改 fw_env.h 这个头文件来配置 env 分区信息。
  • 在这里我就不展示修改 fw_env.h 参数后的运行效果了,其效果跟 fw_env.config 是一样的。
  • 只不过,修改 fw_env.h 参数的方法是有一个很明显的缺点的,就是当 uboot 的 env 分区信息发生变化后,我们必须要重新编译 fw_printenv 工具才行,否则使用 fw_printenv 时会报“Warning: Bad CRC, using default environment” 错误。原因是 env 参数信息与 fw_printenv 工具配置的信息不一致了。

6、总结

  • 上边总共介绍了两种 fw_printenv 工具的配置方法,分别是 fw_env.config 和 fw_env.h 配置。
  • 本人推荐优先使用 fw_env.config 配置的方法,为什么呢?因为这样的使用灵活很多。
  • 好了,本章内容到此结束了,感谢大家的支持与鼓励。

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...