Yocto 添加自定义 UBoot 环境变量

2024-03-13

我正在尝试通过 Yocto 构建过程添加两个新的 u-boot 环境变量。

My file u-boot-imx_2021.04.bbappend包含

FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
SRC_URI += " file://uboot.patch"

My file uboot.patch包含

--- a/configs/mx6ull_14x14_evk_emmc_defconfig   2023-02-23 10:49:03.969189476 -0600
+++ a/configs/mx6ull_14x14_evk_emmc_defconfig   2023-02-23 10:50:06.401233950 -0600
@@ -91,3 +91,14 @@
 CONFIG_FASTBOOT_BUF_SIZE=0x40000000
 CONFIG_FASTBOOT_FLASH=y
 CONFIG_EFI_PARTITION=y
+
+CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
+CONFIG_ENV_OFFSET_REDUND=0xE2000
+CONFIG_BOOTCOUNT_BOOTLIMIT=3
+CONFIG_SYS_MALLOC_F_LEN=0xF000
+CONFIG_CMD_SAVEENV=y
+CONFIG_CMD_LOADENV=y
+
+CONFIG_SWUPDATE_BOOTCMD="setenv bootargs console=ttymxc0,115200 root=/dev/ram0 rootfstype=ext4 rw;load mmc 1:3 0x83000000 /swupdate-image-imx6ull14x14evk.ext4.gz.u-boot;load mmc 1 0x82a00000 imx6ull-14x14-evk.dtb;load mmc 1 0x80800000 zImage;load mmc 1 0x83000000 300000 100000;setenv root /dev/ram0;setenv rootfstype ext4;setenv fw_env_config /etc/fw_env.config;bootz 0x80800000 0x83000000 0x82a00000;"
+CONFIG_SWUPDATE_KERNEL=0
+

这个补丁已应用,例如我可以看到CONFIG_SYS_REDUNDAND_ENVIRONMENT, and CONFIG_SYS_MALLOC_F_LEN值已设定。

当我审视build-fb/tmp/work/imx6ull14x14evk-poky-linux-gnueabi/u-boot-imx/2021.04-r0/build/mx6ull_14x14_evk_emmc_config/include/autoconf.mk我看到以下内容:

CONFIG_SWUPDATE_BOOTCMD="setenv swupdate_bootcmd; setenv bootargs console=ttymxc0,115200 root=/dev/ram0 rootfstype=ext4 rw;load mmc 1:3 0x83000000 /swupdate-image-imx6ull14x14evk.ext4.gz.u-boot;load mmc 1 0x82a00000 imx6ull-14x14-evk.dtb;load mmc 1 0x80800000 zImage;load mmc 1 0x83000000 300000 100000;setenv root /dev/ram0;setenv rootfstype ext4;setenv fw_env_config /etc/fw_env.config;bootz 0x80800000 0x83000000 0x82a00000;"
CONFIG_SWUPDATE_KERNEL="setenv swupdate_kernel 0"

当我启动设备并进入 U-Boot 时,我运行printenv我的两个新变量不存在。我错过了什么小步骤?


我正在尝试添加两个新的 u-boot 环境变量
...
当我启动设备并进入 U-Boot 时,我运行 printenv 并且我的两个新变量不存在。我错过了什么小步骤?

配置选项(例如 CONFIG_XXX)和环境变量之间的关系并不像您想象的那样相关。仅使用一组已知的配置选项(在将它们转换为预处理器宏之后)来组成默认环境。 (由于配置选项(在.config)和宏(在包含/生成/autoconf.h)看起来相同,一些开发人员忘记或不知道有一个转换过程。)因此您根本无法通过新的配置选项(或宏)创建自己的环境变量。

要查看使用哪些配置选项来组成默认环境,请参阅包含/env_default.h https://elixir.bootlin.com/u-boot/v2021.04/source/include/env_default.h.


U-Boot 实际上有几组环境变量,具体来说是默认值、活动值和保存值。

  • 默认环境是一组环境变量 在构建时定义,并保留在二进制映像中。

  • 保存的环境是一组环境变量 保留在持久存储中。它们必须使用saveenv命令,并使用 CRC32 校验字进行验证。

  • 活动环境是一组环境变量 U-Boot 执行时保存在 RAM 中。

启动时,U-Boot 尝试使用已保存的环境填充(空)活动环境,但前提是 CRC32 校验字确认已保存环境的完整性。
验证成功后,持久存储中的环境变量(静默)将成为活动环境。
当验证失败时,会显示一条通知“警告:错误的 CRC,使用默认环境”,并且默认环境中的环境变量将变为活动环境。

The printenv命令(仅)显示活动环境变量集。
构建 U-Boot 时,定义了一组默认环境变量。也可以选择创建一组已保存的环境变量(例如,预先构建的u-boot.env可以与新版本一起安装的文件u-boot.bin可执行文件)使用mkenv图像 https://elixir.bootlin.com/u-boot/latest/source/tools/mkenvimage.c tool.



将新环境变量添加到默认环境的一种方法是使用 CONFIG_EXTRA_ENV_SETTINGS。来自READMEU-Boot 源文件中:

CONFIG_EXTRA_ENV_SETTINGS

Define this to contain any number of null terminated
strings (variable = value pairs) that will be part of
the default environment compiled into the boot image.

For example, place something like this in your
board's config file:

    #define CONFIG_EXTRA_ENV_SETTINGS \
        "myvar1=value1\0" \
        "myvar2=value2\0"

Warning: This method is based on knowledge about the
internal format how the environment is stored by the
U-Boot code. This is NOT an official, exported
interface! Although it is unlikely that this format
will change soon, there is no guarantee either.
You better know what you are doing here.

Note: overly (ab)use of the default environment is
discouraged. Make sure to check other ways to preset
the environment like the "source" command or the
boot command first.

请注意,CONFIG_EXTRA_ENV_SETTINGS 通常仅定义为宏,而不用作配置选项。例如参考包括/配置/mx6ullevk.h https://elixir.bootlin.com/u-boot/v2021.04/source/include/configs/mx6ullevk.h#L46.

将新环境变量添加到默认环境的另一种方法是使用 CONFIG_USE_DEFAULT_ENV_FILE (这是一个配置选项)。其Kconfig描述为:

 CONFIG_USE_DEFAULT_ENV_FILE:
 
 Normally, the default environment is automatically generated
 based on the settings of various CONFIG_* options, as well
 as the CONFIG_EXTRA_ENV_SETTINGS. By selecting this option,
 you can instead define the entire default environment in an 
 external file.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Yocto 添加自定义 UBoot 环境变量 的相关文章

  • 启用 DMA 的 UART Tx 模式

    我已经为 UART 在传输模式下编写了一个简单的设备驱动程序 并启用了 DMA 和中断 我使用的硬件是 omap 4460 pandaboard 其中加载了 Linux 3 4 下面我分享一下相关部分的代码 在开放阶段 dma map io
  • Spidev 不使用 ioctl 同时写入/读取

    我希望找到一些帮助 即使这个问题可能更多地与硬件相关而不是与软件相关 我们将会看到 我正在开发基于 Freescales P1021 处理器 ppc e500v2 内核 的定制板 将连接外部 PCB 并可通过 SPI 进行配置 该外部 PC
  • u-boot 可以支持多个以太网端口吗?

    我想从多个以太网端口执行 ping 操作 u boot 仅支持单个以太网端口是否存在固有限制 u boot 可以支持多个以太网端口吗 是的 在最近版本的 U Boot 中 至少可以追溯到 2012 10 突出的代码是eth current
  • 如何在 do_deploy() 之后添加任务?

    我写了一个食谱 我想在之后执行任务do deploy inherit deploy do deploy echo do deploy has been called addtask deploy after do compile do af
  • 在u-boot中,kernel_entry指向哪个函数?

    这是 u boot 的函数 static void boot jump linux bootm headers t images int flag ifdef CONFIG ARM64 void kernel entry void fdt
  • P1010 MAC到交换机端口直连,无需PHY

    我有一个带有飞思卡尔 P1010 处理器的定制板 其中 P1010 的 eTSEC2 增强型 3 速以太网控制器 端口在 SGMII 模式下直接连接到 Marvell 88E6046 以太网交换机端口 9 Linux 3 17 DSA 驱动
  • 如何使用 yocto 构建简单的 qt 应用程序?

    I have yocto开发环境设置 我可以在其中进行 bitbake 并在目标中运行一个简单的 C 应用程序 现在我想尝试使用简单的 Qt 应用程序 当我执行时bitbake layers 显示层它在列表中显示meta qt5 meta
  • bitbake中SRC_URI和FILESEXTRAPATHS_prepend的区别

    为什么我们需要给出文件路径SRC URI即使我们将文件路径包含在FILESEXTRAPATHS prepend多变的 例如 SUMMARY Simple Hello application LICENSE MIT LIC FILES CHK
  • Yocto Bitbake Glibc 构建失败

    我正在尝试构建 Yocto 映像 但编译 glibc 时构建失败 如果我只跑 bitbake glibc c compile 我收到编译错误如下 usr src debug glibc 2 27 r0 git nptl pthread at
  • 在嵌入式linux中使用mono作为硬件

    我正在一家公司实习做研究 我在使用 Mono Net 平台的跨平台实现 时遇到一些问题 我的公司设计硬件和软件 我对使用嵌入式linux的了解非常有限 我实习的公司非常注重 NET 但是 Mono 的新发展 他们问自己是否可以将 Linux
  • Qt - 模块“QtQuick.Controls”未安装

    我尝试部署一个在 PC 上运行良好的 QT 应用程序 该应用程序部署在基于 ASEM 的 yocto 安装映像中 版本为 morty 我收到错误消息 qml 加载组件时出错 qrc GUI InputDialog qml 3模块 QtQui
  • 如何指定使用 bitbake/yocto 构建哪个内核

    我正在努力使用 yocto daisy 生成新的 BSP 当我构建图像时 我收到以下警告 NOTE Resolving any missing task queue dependencies NOTE multiple providers
  • 添加条目到task_struct并初始化为默认值

    我想添加一个条目到进程控制块结构 task struct 让我们说一种标记某些进程的方法 我想将除 一些特殊进程 之外的所有进程的该字段初始化为 0 稍后通过调用sched setscheduler 我将为 特殊进程 设置此标志 有谁知道如
  • Yocto 构建上的 JAVA 安装错误

    我在 Poky Linux 系统上安装 Java 时遇到了很多麻烦 我正在使用 Yocto 构建我的系统 配置如下 本地配置文件 MACHINE intel corei7 64 DISTRO poky PACKAGE CLASSES pac
  • 基于 BBB DT 的方法

    我已经使用平台设备模型成功为我的自定义协议实现了基于 GPIO 的驱动程序 我想使用设备树方法升级它 因此 对于初学者来说 我有一个 beaglebone black 并且我使用在 uboot 控制台消息显示期间启用和验证的设备树配置交叉编
  • Yocto/Bitbake 向 rootfs 嵌入式 Linux 添加空目录的方法

    是否有任何方法可以向 rootfs 添加新的空目录 我尝试将其添加到我的 bbappend 文件之一中 do install install d D tmp myNewDir FILES PN tmp myNewDir 但我遇到了非描述性错
  • Linux 上的 mpc / mpd:如何播放本地 wav 文件

    我正在尝试将本地文件添加到 mpd 通过 mpc 并播放它 我的平台是OpenWRT嵌入式linux 因此 从手册页来看 它指出 mpc add
  • 使用 U-boot 将 Coral Dev Kit EMMC 安装为 USB

    我按照这个答案的说明进行操作 备份和恢复eMMC https stackoverflow com questions 64176284 backing up and restoring the emmc也在这里描述 https develo
  • 如何编写需要内核源头文件的 BitBake 驱动程序配方?

    介绍 我有一个do install我为驱动程序编写的 BitBake 配方中的任务 我在其中执行自定义install脚本 任务失败 因为安装脚本无法在其中找到内核源头文件
  • Alsa 带有来自调制解调器的 PCM 接口

    我有一个基于 imx28 CPU 的定制板 CPU 的串行端口连接到调制解调器的 PCM 输出 我必须为调制解调器的 PCM 接口开发一个驱动程序 使其成为 ALSA SoC 的一部分 您能指出内核树 中与我的设置重新组合的一些驱动程序吗

随机推荐