从零开始学习 sg200x 多核开发之 uboot saveenv 功能使能

前文 sophpi uboot 网络功能使能 中介绍了 sophpi 开启网络功能,该文中最后提到了不能通过 saveenv 保存修改完成的 IP 地址相关环境变量。本文介绍如何使用 u-boot 的 saveenv 命令保存环境变量。

当设置完环境变量之后,如果执行了saveenv 命令,则下次重新运行的时候环境变量则会被保存为上次保存的值,如果不保存,只会在设置好时还没重启之前生效,重启之后设置值会恢复成原来的值。

sophpi# saveenv
Unknown command 'saveenv' - try 'help'

原因定位

由于 build/boards/cv181x/sg2002_wevb_riscv64_sd/u-boot/cvitek_sg2002_wevb_riscv64_sd_defconfig 文件未配置相关存储地址,或者开启了 CONFIG_ENV_IS_NOWHERE=y,导致 u-boot 环境变量没有存储在任何地方,所以无法使用 saveenv 命令。

在 u-boot-2021.10/env/Kconfig 中定义了 “ENV_IS_NOWHERE” 这个宏,被默认选中。

config ENV_IS_NOWHEREbool "Environment is not stored"default y if !ENV_IS_IN_EEPROM && !ENV_IS_IN_EXT4 && \!ENV_IS_IN_FAT && !ENV_IS_IN_FLASH && \!ENV_IS_IN_MMC && !ENV_IS_IN_NAND && \!ENV_IS_IN_NVRAM && !ENV_IS_IN_ONENAND && \!ENV_IS_IN_REMOTE && !ENV_IS_IN_SPI_FLASH && \!ENV_IS_IN_UBIhelpDefine this if you don't want to or can't have an environment storedon a storage medium. In this case the environment will still existwhile U-Boot is running, but once U-Boot exits it will not bestored. U-Boot will therefore always start up with a defaultenvironment.

u-boot 在 u-boot-2021.10/build/sg2002_wevb_riscv64_sd/include/generated/autoconf.h 中自动生成了以下配置:

#define CONFIG_ENV_IS_NOWHERE 1

ENV_IS_NOWHERE 含义是 u-boot 环境变量没有存储在任何地方。

使能 saveenv

  1. 新增 build/boards/cv181x/sg2002_wevb_riscv64_sd/u-boot/cvitek_sg2002_wevb_riscv64_sd_defconfig 配置
CONFIG_ENV_IS_IN_FAT=y
CONFIG_ENV_FAT_INTERFACE="mmc"
CONFIG_ENV_FAT_DEVICE_AND_PART="0"
CONFIG_ENV_FAT_FILE="uboot.env"
  1. 修改 u-boot-2021.10/include/cvipart.h
    在 u-boot-2021.10/include/configs/cv181x-asic.h 文件中调用了 cvipart.h,在该文件中定义了 CONFIG_ENV_IS_NOWHERE,导致 u-boot 中使能 saveenv 失效,需要注释掉。
// #ifndef CONFIG_ENV_IS_NOWHERE
// #define CONFIG_ENV_IS_NOWHERE
// #endif

完成以上修改后,重新编译 u-boot,即可执行 saveenv 命令保存环境变量。

u-boot 环境变量保存

在 u-boot 启动后,通过以下命令保存环境变量:

soph# saveenv
Saving Environment to FAT... OK

进入 u-boot 命令行,运行 setenv 修改对应的环境变量后,运行 saveenv,会在 SD 卡第一个分区创建 uboot.env 文件。重启后再次进入 u-boot 命令行,运行 printenv,可以看到环境变量已经保存成功。

源代码

config ENV_FAT_DEVICE_AND_PART
string “Device and partition for where to store the environemt in FAT”
depends on ENV_IS_IN_FAT
default “0:1” if TI_COMMON_CMD_OPTIONS
default “0:auto” if ARCH_ZYNQ || ARCH_ZYNQMP || ARCH_VERSAL
default “:auto” if ARCH_SUNXI
default “0” if ARCH_AT91
help
Define this to a string to specify the partition of the device. It can
be as following:

    "D:P", "D:0", "D", "D:" or "D:auto" (D, P are integers. And P >= 1)- "D:P": device D partition P. Error occurs if device D has nopartition table.- "D:0": device D.- "D" or "D:": device D partition 1 if device D has partitiontable, or the whole device D if has no partitiontable.- "D:auto": first partition in device D with bootable flag set.If none, first valid partition in device D. If nopartition table then means device D.If ENV_FAT_INTERFACE is set to "mmc" then device 'D' can be omitted,leaving the string starting with a colon, and the boot device willbe used.

config ENV_FAT_FILE
string “Name of the FAT file to use for the environment”
depends on ENV_IS_IN_FAT
default “uboot.env”
help
It’s a string of the FAT file name. This file use to store the
environment.

config ENV_FAT_FILE_REDUND
string “Name of the FAT file to use for the environment”
depends on ENV_IS_IN_FAT && SYS_REDUNDAND_ENVIRONMENT
default “uboot-redund.env”
help
It’s a string of the FAT file name. This file use to store the
redundant environment.

源码分析

saveenv命令调用env/env.c --env_save()函数

函数内部会去调用注册的save函数,save()由各个存储介质的env操作文件注册,这里以flash为例, 未定义其他存储介质的话,则为nowhere;

参考

https://blog.csdn.net/qq_27087571/article/details/117411663

问题 :如何找到saveenv,这个环境变量的数据是保存在那里的
1. uboot 下搜索 saveenv
./common/env_eeprom.c:int saveenv(void)
./common/env_nand.c:int nand_saveenv(void)
./common/env_flash.c:int saveenv(void)
./common/env_flash.c:int saveenv(void)2. 在uboot/common 目录下找,Makefile中加载了那个.c文件
48 obj-$(CONFIG_ENV_IS_IN_MMC) += env_mmc.o
49 obj-$(CONFIG_ENV_IS_IN_UFS) += env_ufs.o
50 obj-$(CONFIG_ENV_IS_IN_FAT) += env_fat.o
51 obj-$(CONFIG_ENV_IS_IN_EXT4) += env_ext4.o
52 obj-$(CONFIG_ENV_IS_IN_NAND) += env_nand.o
53 obj-$(CONFIG_ENV_IS_IN_NVRAM) += env_nvram.o3. 可以看到这里有很多的宏定义,搜索宏定义在哪里定义的
./include/configs/hi3516dv200.h:#define CONFIG_ENV_IS_IN_NAND
./include/configs/hi3516dv200.h:#define CONFIG_ENV_IS_IN_NAND
./include/configs/iconnect.h:#define CONFIG_ENV_IS_IN_NAND
./include/configs/spear6xx_evb.h:#define CONFIG_ENV_IS_IN_NAND
./include/configs/hi3516ev300.h:#define CONFIG_ENV_IS_IN_NAND
./include/configs/hi3516ev300.h:#define CONFIG_ENV_IS_IN_NAND

https://blog.csdn.net/qq_40897531/article/details/106155218 (具体介绍了)

https://blog.csdn.net/ITdadada/article/details/105421719
https://blog.csdn.net/lqqtwo/article/details/126542569

为了从用户空间修改 U-Boot 环境变量,需要名为“mkenvimage”的程序,该程序可以从 U-Boot 源生成,按照 tools/env/README 文件中的说明进行操作。
make env
这将得到程序 “mkenvimage”
需要描述环境的文本文件 “uboot-env.txt” 如下:

git-bash
bootargs=console=ttyS0,115200
bootcmd=tftp 22000000 Image
[…]

然后按如下方式使用 mkenvimage:

./mkenvimage -s 0x40000 -o uboot-env.bin uboot-env.txt

-s 选项允许指定要创建的映像的大小。它必须与为 U-Boot 环境保留的闪存区域的大小相匹配。

echo “/boot/uboot.env 0x0000 0x20000” > /etc/fw_env.config
mkenvimage -s 0x20000 -o /boot/uboot.env /etc/u-boot-initial-env

在最后面有这样两句话:

/* 16k Total Size of Environment Sector */
#define CONFIG_ENV_SIZE 0x4000

这里定义了环境变量的空间大小,改成

/* 64k Total Size of Environment Sector */
#define CONFIG_ENV_SIZE 0x10000

改成一整个sector就可以了。
————————————————

                        版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/chenqiai0/article/details/8821348

u-boot根目录下make menuconfig
存储配置:
Environment —>
Select the location of the environment
(X) Environment in a block device

build/boards/cv181x/sg2002_wevb_riscv64_sd/u-boot/cvitek_sg2002_wevb_riscv64_sd_defconfig

  1. CONFIG_ENV_IS_NOWHERE=y
    soph# saveenv
    Unknown command ‘saveenv’ - try ‘help’

/home/share/samba/risc-v/sophpi/u-boot-2021.10/build/sg2002_wevb_riscv64_sd
make menuconfig

CONFIG_ENV_IS_NOWHERE=y

CONFIG_ENV_IS_IN_FAT=y

soph# saveenv
Saving Environment to nowhere… not possible

错误解决:

/home/share/samba/risc-v/sophpi/u-boot-2021.10 is not clean, please run ‘make mrproper’

cd u-boot-2021.10
make mrproper

make mrproper命令会删除所有的编译生成文件、内核配置文件(.config文件)和各种备份文件

int env_save(void)
{
struct env_driver *drv;

drv = env_driver_lookup(ENVOP_SAVE, gd->env_load_prio);
if (drv) {int ret;printf("Saving Environment to %s... ", drv->name);if (!drv->save) {printf("not possible\n");return -ENODEV;}if (!env_has_inited(drv->location)) {printf("not initialized\n");return -ENODEV;}ret = drv->save();if (ret)printf("Failed (%d)\n", ret);elseprintf("OK\n");if (!ret)return 0;
}return -ENODEV;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/473161.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式硬件杂谈(二)-芯片输入接入0.1uf电容的本质(退耦电容)

引言:对于嵌入式硬件这个庞大的知识体系而言,太多离散的知识点很容易疏漏,因此对于这些容易忘记甚至不明白的知识点做成一个梳理,供大家参考以及学习,本文主要针对芯片输入接入0.1uf电容的本质的知识点的进行学习。 目…

树莓派4B Qt+FFMPEG 多线程录制USB相机mjpeg数据流“h264_omx“硬件编码的MP4文件

文章目录 1 前言2 一些问题说明2.0 树莓派4b系统版本2.1 Qt2.2 FFMPEG2.3 图像格式 3 核心代码3.0 代码逻辑3.1 pro文件3.2 avframequeue.cpp3.3 decodethread.cpp 4 资源下载 1 前言 本项目为在树莓派4B开发板上,通过QtFFMPEG以多线程分别解码、编码USB摄像头视频数…

Cartographer激光雷达slam -20241116

Cartographer Cartographer代码结构 cartographer:负责处理来自雷达、IMU和里程计的数据并基于这些数据进行地图的构建,是cartographer理论的底层实现cartographer_ros:基于ros的通信机制获取传感器的数据并将它们转换成cartographer中定义…

Scratch 014生日贺卡(上)

知识回顾: 1、“面向鼠标指针”积木块 2、“重复执行直到”积木块 本次分享制作生日贺卡引入广播模块 案列效果: 生日贺卡上案例效果-CSDN直播 步骤拆解: 1、添加背景和角色 2、编辑贺卡造型添加名字 3、流程图的组成和画法 4、…

外网访问 WebDav 服务

从外部网络环境(比如异地和家中网络)来访问公司内网的 WebDav 服务(基于 IIS )并映射成本地虚拟磁盘。 步骤如下 第一步 在公司内网的电脑上设置 webDav。 1,找到【控制面板】,双击进入。 2&#xff0c…

渑池县中药材产业党委莅临河南广宇企业管理集团有限公司参观交流

11月14日,渑池县人大副主任、工商联主席杨航率县中药材产业党委代表团一行13人,莅临河南广宇集团参观交流。河南广宇集团总经理王峰、副总经理王培等领导热情接待并陪同参观、座谈。 代表团一行首先参观了集团旗下郑州美信中医院(庚贤堂中医药…

WP网站如何增加文章/页面的自定义模板

通过Wordpress我们后台在发布文章或者页面的时候其实可以看到有些主题 他有选择使用的页面模板,可以自定义模板,但是有些主题却没有选择主题这个功能,那这个自定义模板的功能是如何实现的呢?以下分两种情况:Page页面和…

FFmpeg 4.3 音视频-多路H265监控录放C++开发十四,总结编码过程,从摄像头获得数据后,转成AVFrame,然后再次转成AVPacket,

也就是将摄像头采集到的YUV 的数据换成 AVFrame,然后再次转成 AVPacket,那么这AVPakcet数据要怎么办呢?分为三种情况: 一种是将AVPacket存储成h264文件,由于h264编码器在将avframe变成avpacket的时候就是按照h264的格…

SQL Server 查询设置 - LIKE/DISTINCT/HAVING/排序

目录 背景 一、LIKE - 模糊查询 1. 通配符 % 2. 占位符 _ 3. 指定集合 [] 3.1 表示否定 ^ 3.2 表示范围 - 4. 否定 NOT 二、DISTINCT - 去重查询 三、HAVING - 过滤查询 四、小的查询设置 1. ASC|DESC - 排序 2. TOP - 限制 3. 子查询 4. not in - 取补集&…

动态规划-完全背包问题——322.零钱兑换

1.题目解析 题目来源 322.零钱兑换——力扣 测试用例 2.算法原理 1.状态表示 这里需要寻找硬币使总面值等于一个值求出所需硬币的最小个数,所以不妨设置一个二维dp表,即dp[i][j]:在[1,i]个硬币中选择的硬币总面值完全等于j时所需要的最小硬…

从零到一:利用 AI 开发 iOS App 《震感》的编程之旅

在网上看到一篇关于使用AI开发的编程经历,分享给大家 作者是如何在没有 iOS 开发经验的情况下,借助 AI(如 Claude 3 模型)成功开发并发布《震感》iOS 应用。 正文开始 2022 年 11 月,ChatGPT 诞生并迅速引发全球关注。…

【Linux庖丁解牛】—Linux基本指令(下)!

目录 1、grep指令 2、zip/unzip指令 3、sz/rz指令 4、tar指令 ​编辑 5、scp指令 6、bc指令 7、uname –r指令 8、重要的几个热键 9、关机 10、完结撒花 1、grep指令 grep是文本过滤器,其作用是在指定的文件中过滤出包含你指定字符串的内容,…

小程序19-微信小程序的样式和组件介绍

在小程序中不能使用 HTML 标签,也就没有 DOM 和 BOM,CSS 也仅支持部分选择器 小程序提供了 WXML 进行页面结构的编写,WXSS 进行页面的样式编写 WXML 提供了 view、text、image、navigator等标签构建页面结构,小程序中标签称为组件…

VMD + CEEMDAN 二次分解,CNN-LSTM预测模型

往期精彩内容: 时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较 全是干货 | 数据集、学习资料、建模资源分享! EMD变体分解效果最好算法——CEEMDAN(五)-CSDN博客 拒绝信息泄露!VMD滚动分…

《生成式 AI》课程 第3講 CODE TASK 任务3:自定义任务的机器人

课程 《生成式 AI》课程 第3講:訓練不了人工智慧嗎?你可以訓練你自己-CSDN博客 我们希望你创建一个定制的服务机器人。 您可以想出任何您希望机器人执行的任务,例如,一个可以解决简单的数学问题的机器人0 一个机器人&#xff0c…

SOLIDWORKS Toolbox:一键自动化,让紧固件与零部件管理更高效

紧固件广泛应用于从手机到火箭的各种产品中。在SOLIDWORKS设计时,通过使用实际的CAD模型来包含和跟踪紧固件是最简便和全面的方法,这有助于理解设计的整体,并自动管理零件数据和设计文档,如工程图和物料清单(BOM)。 在SOLIDWORKS…

串口DMA接收不定长数据

STM32F767—>串口通信接收不定长数据的处理方法_stm32串口超时中断-CSDN博客 STM32-HAL库串口DMA空闲中断的正确使用方式解析SBUS信号_stm32 hal usart2 dma-CSDN博客 #define USART1_RxBuffSize 100 extern DMA_HandleTypeDef hdma_usart1_rx; //此处声明的变量在…

git简介和本地仓库创建,并提交修改。git config init status add commit

一、Git简介和本地仓库组成 1.1 git简介 视频教程在这 git简介,版本控制系统,工作区,暂存区,本地仓库_哔哩哔哩_bilibili 如下图,比如我们写毕业论文,要经常修改和完善,得靠自己保存&#x…

鸿蒙学习生态应用开发能力全景图-赋能套件(1)

文章目录 赋能套件鸿蒙生态应用开发能力全景图 赋能套件 鸿蒙生态白皮书: 全面阐释了鸿蒙生态下应用开发核心理念、关键能力以及创新体验,旨在帮助开发者快速、准确、全面的了解鸿蒙开发套件给开发者提供的能力全景和未来的愿景。 视频课程: 基于真实的开发场景,提供向导式…

vue+svg圆形进度条组件

vuesvg圆形进度条组件 一、实现思路二、ProgressCircle.vue三、父组件使用四、实现效果 一、实现思路 使用svg的circle元素画两个圆形&#xff0c;一个圆形控制进度&#xff0c;一个绘制底色 二、ProgressCircle.vue 代码示例&#xff1a; <template><!-- 圆形进度…