uBoot编译时无法设置环境变量
Posted
技术标签:
【中文标题】uBoot编译时无法设置环境变量【英文标题】:Unable to set environment variable in compile time of uBoot 【发布时间】:2022-01-14 00:04:18 【问题描述】:我正在尝试在 uboot 中引入 net-console。为此,我首先在“uboot-imx/include/configs/imx8mm_evk.h”中添加了“ncip”,如下所示。稍后,在 CONFIG_EXTRA_ENV_SETTINGS 的末尾调用 DFMC_SWUG。
#define DFMC_SWUG \
"setenv ncip 192.168.100.98 \0" \
"ethaddr=00:80:A3:CA:B5:77 \0" \
"swugip=192.168.100.16 \0" \
"ipaddr=192.168.100.2 \0" \
"serverip=192.168.100.16 \0" \
"bootdelay=3\0" \
#define CONFIG_EXTRA_ENV_SETTINGS \
CONFIG_MFG_ENV_SETTINGS \
JAILHOUSE_ENV \
"script=boot.scr\0" \
--
--
--
"fi;\0" \
DFMC_SWUG
有趣的是,我能够设置“ethaddr”、“swugip”和除“ncip”之外的其他变量。我想,我在行中做了一些格式错误 --> "setenv ncip 192.168.100.98 \0" \
后来我尝试设置一些名为 dummy_var_1、dummy_var_2、dummy_var_3 的虚拟变量。甚至他们都没有准备好。
有人可以在这里指导我吗?
【问题讨论】:
所有工作值似乎在名称和值之间都有一个等号,而 ncip 没有。 嗨 Joachim,我确实尝试过“ncip=192.168.100.98”,但效果不佳。什么理解是(我可能错了)“ncip”尚未由uboot设置,因此它需要我们使用“setenv ncip;
:"setenv ncip 192.168.100.98; \0" \
也试过了 :( 不行!!
您必须检查您的引导分区中是否存在boot.scr
文件,因为在您的情况下,Uboot 将首先尝试加载它。或者尝试在开头添加您的环境变量,在 JAILHOUSE_ENV
之前
【参考方案1】:
U-Boot 环境由 <env_var>=<string value><null>
形式的字符串组成(前面有一个 CRC32 字)。
因此,环境变量的字符串在使用 CONFIG_EXTRA_ENV_SETTINGS 在代码中预定义它们时必须符合该模板。
这也意味着您无法在"setenv ncip 192.168.100.98 \0"
等环境中安装原始命令。
U-Boot 文档对此主题很清楚。 请注意警告的最后一句。
- Default Environment:
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.
我确实尝试过“ncip=192.168.100.98”...
这看起来几乎是正确的,但需要明确的空终止符。
有趣的是,我能够设置“ethaddr”、“swugip”和除“ncip”之外的其他变量。 ... 后来我尝试设置一些名为 dummy_var_1、dummy_var_2、dummy_var_3 的虚拟变量。甚至他们都没有准备好。
您只提供了对实际结果的模糊总结。
您是否检查了任何 .o 对象文件以检查存储了哪些文本字符串?
您是否对 U-Boot 映像文件执行了strings u-boot.bin | less
以查看嵌入在映像中的默认环境?
请注意,您可能会犯更多错误。
CONFIG_EXTRA_ENV_SETTINGS 中定义的环境变量只会(最初)存在于 U-Boot 的 default 环境中。 你对细节非常吝啬,忽略了你的设置。如果非易失性引导介质中存在现有且有效的存储环境,则需要执行特定程序来抑制现有存储环境为了恢复到具有“新”环境变量的默认环境。
在安装新的/不同版本的 u-boot.bin 时未能禁用/删除现有存储的环境将隐藏新的/不同的默认值 环境以及其中的所有新/不同变量。如果 U-Boot 确实不发出类似于以下内容的消息:
Loading Environment from xxx... *** Warning - bad CRC, using default environment
那么您可以放心,您的新/不同环境变量不在当前运行时环境中。 IOW 您希望在(初始)启动时看到此警告消息。
【讨论】:
非常感谢。您与nxp论坛一起回答帮助我解决了问题! (community.nxp.com/t5/i-MX-Processors/…)【参考方案2】:如果希望使用 netconsole 编译 u-boot,则必须对 uboot-imx/include/configs/imx8mm_evk.h 中的文件进行以下更改
添加“ncip”,即拥有网络控制台和其他网络设置的计算机/设备的 IP 地址。请注意,u-boot 中的每个变量都是以空字符结尾的字符串。
还添加一个变量(在以下情况下为 dfmcswug),它将通过 netconsole 设置标准输入、输出和错误报告。稍后将调用此变量。
在 CONFIG_EXTRA_ENV_SETTINGS 宏中包含 DFMC_SWUG 宏,以便我们的新设置与其他环境设置一起添加。
在 CONFIG_BOOTCOMMAND 中添加 dfmcswug 变量,以便在运行时由工具链执行。
通过上述步骤,u-boot 应该会通过 netconsole 输出其控制台。
在客户端使用或类似。
nc -u -l -p 6666 <ip_address_of_uboot_host>
【讨论】:
以上是关于uBoot编译时无法设置环境变量的主要内容,如果未能解决你的问题,请参考以下文章
uboot环境变量(设置bootargs向linux内核传递正确的参数)