【发布时间】:2013-12-29 19:31:38
【问题描述】:
- u-boot bootloader 如何读取/保存其环境变量?
我们如何在Flash中声明u-boot环境变量部分的地址?
-
来自here 的描述:U-Boot 环境是一块内存,保存在持久存储中,并在 U-Boot 启动时复制到 RAM。
“复制到内存”是什么意思?
U-boot 会将环境变量的内存块复制到 RAM 中?
谢谢
【问题讨论】:
我们如何在Flash中声明u-boot环境变量部分的地址?
来自here 的描述:U-Boot 环境是一块内存,保存在持久存储中,并在 U-Boot 启动时复制到 RAM。
“复制到内存”是什么意思?
U-boot 会将环境变量的内存块复制到 RAM 中?
谢谢
【问题讨论】:
是的,U-boot 会将环境变量的内存块复制到 RAM。
块来自的持久存储是特定于平台的。一些常见的存储选项(以及处理该存储选项的源文件):
NOR flash env/flash.c
SPI flash env/sf.c
MMC env/mmc.c
include/configs/yourboard.h 中的 CONFIG_ 定义将确定详细信息。例如,对于映射在内存顶部的 SPI 闪存,可能:
#define CONFIG_ENV_IS_IN_SPI_FLASH
#define CONFIG_ENV_SIZE 0x00001000
#define CONFIG_ENV_ADDR 0xFFFFF000
CONFIG_ENV_ADDR 是 u-boot 环境变量在 Flash 中的地址。
请注意,将环境写入持久存储时,u-boot 会自动在此部分上创建 CRC32。在启动时读取环境时检查 CRC。如果CRC校验不通过,则不使用存储环境;而是使用硬编码到程序代码中的新默认环境,这是一种特殊情况。
在 U-Boot 初始化期间,环境变量被导入到哈希表中。在操作中,所有读/写操作以及所有“printenv”(显示环境变量)和“setenv”(设置环境变量)命令都使用这些表条目。在命令“saveenv”完成之前,任何更改都不会保存,该命令会写入持久存储。
有关详细信息,请参阅 u-boot/common/cmd_nvedit.c 第 14-24 行和 u-boot/README 第 3474-3881 行(行号适用于 v2013.10)。
【讨论】:
环境变量块的地址和大小将在板头文件中定义。参见include/configs/am3517_evm.h 例如:
#define CONFIG_SYS_ENV_SECT_SIZE (128 << 10) /* 128 KiB */
#define CONFIG_ENV_OFFSET SMNAND_ENV_OFFSET
#define CONFIG_ENV_ADDR SMNAND_ENV_OFFSET
u-boot 从SMNAND_ENV_OFFSET 加载CONFIG_SYS_ENV_SECT_SIZE。您可以更改值,然后通过saveenv 保存它们。
【讨论】: