如何清除先前由u-boot保存的环境变量?

15

我正在使用运行u-boot的嵌入式Linux套件。为了使一切正常启动,我必须修改一些环境变量,并使用"saveenv"命令保存它们。

现在我想回去看看默认设置是什么,确保我知道确切地进行了哪些更改,并找出一种方法来更改这些默认设置,以便生产中的每个单元都不需要单独启动和修改。

有没有办法告诉u-boot清除任何已保存的数据,以便我可以再次查看默认设置?如果闪存类型是QSPI,是否会有所不同?


2
U-Boot环境区域使用32位CRC进行验证,因此如果您在非易失性存储中破坏了它,只需一个字节即可,那么U-Boot将在启动时恢复为其默认设置。 - sawdust
4个回答

30

在您的套件上,尝试一下

help env

并查找“env default”。

env default [-f] var [...] - [forcibly] reset variable(s) to their default values

听起来像是你在寻找的东西。

env default -a

如果进行非持久性更改,那么"printenv"将显示默认值。

要更改默认值,您需要重新构建带有更改(例如CONFIG_EXTRA_ENV_SETTINGS)的u-boot.bin。


我在./u-boot/include/configs/board-vendor.h.template中找到了配置。然而,在CONFIG_EXTRA_ENV_SETTINGS的那个部分,我看到像"loadaddr=@nstart@\0"这样的内容。你知道'nstart'和其他类似变量是在哪里设置的吗?如果有更好的方法,我宁愿不只是用数字替换它们。 - KyleL
当前的u-boot似乎没有board-vendor.h文件,并且我不认识变量语法@nstart,抱歉。 - Joe Kul
这一定是与我的套件有关(使用Xilinx Petalinux的Avnet Zedboard)。谢谢帮忙! - KyleL

6

要使用默认变量而不将它们从 Flash 中删除,请执行以下操作:

env default -a

在u-boot中执行$bootcmd。这是Joe Kul的解决方案。

要从SPI闪存中删除变量,请执行此操作

run eraseenv

在u-boot中执行并重新启动。


请注意,“run eraseenv”,特别是“eraseenv”必须先定义。它不是一个开箱即用的命令。https://www.denx.de/wiki/publish/DULG/to-delete/UBootCmdGroupEnvironment.html - Catalin
1
@Catalin 好的,来自 Xilinx 的 Zynq 开发环境已经被定义了,我不知道它在食物链上向上延伸到哪个层次。 - Joshua

3
# add uboot env variable
setenv my_var 1

# printenv my_var
my_var=1

# remove/unset uboot env variable
setenv my_var

# printenv my_var
## Error: "my_var" not defined

2

在我的情况下,eraseenv 未定义。根据@Joshua的答案,我发现以下命令可以完成与 eraseenv 相同的操作。

env default -a
saveenv

你好@Iceberg,当我在Linux用户空间中执行env default -a指令时,我会收到env: 'default': No such file or directory的错误提示。请告诉我如何使用此命令。 - Preeti
@Preeti 我相信我是在 u-boot 的控制台中执行了这些命令,而不是在 Linux 的命令行中执行的。 - Iceberg
也许我在这里有些困惑。我的板子已经完全启动,并且Linux用户空间已加载(例如,我可以执行fw_printenv),但是env default -a显示错误。我需要在我的配置文件中启用它,例如include/configs/stm32mp1.h吗? - Preeti
不,env default -a 命令无法在 Linux 中运行。Linux 的 env 命令与 u-boot 没有任何关系。据我所知,在 Linux 中没有简单的方法可以重置 u-boot 环境。我认为您可能可以使用 dd 清除适当的存储空间来实现此目的,这将导致 u-boot 恢复到编译的默认环境(但我尚未尝试过)。 - David Robertson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接