如何在U-Boot SPL中加载存储在MMC中的环境变量
SPL阶段加载MMC存储的U-Boot环境变量可行性及实现方案
可行性结论
完全可以实现,SPL原生支持可选的环境变量加载能力,只是默认配置通常关闭,仅需调整U-Boot配置并适配Arria10 SoC的MMC驱动初始化逻辑即可。
具体实现步骤
- 启用SPL环境变量支持的配置项
在U-Boot对应板级的defconfig文件中开启以下配置:
开启CONFIG_SPL_ENV_SUPPORT=y:这是SPL加载环境变量的核心开关
开启CONFIG_ENV_IS_IN_MMC=y:指定环境变量存储在MMC设备,和你现有U-Boot的存储介质保持一致
配置CONFIG_SYS_MMC_ENV_DEV和CONFIG_SYS_MMC_ENV_PART为你存储环境变量的MMC设备号和分区号,需和U-Boot阶段的配置完全匹配
若你的环境变量存储在分区内,还需开启CONFIG_SPL_MMC_SUPPORT=y,并根据分区表类型开启CONFIG_SPL_GPT_SUPPORT=y(GPT分区)或CONFIG_SPL_DOS_PARTITION_SUPPORT=y(MBR分区),确保SPL能识别MMC分区表 - 调整SPL初始化顺序
Arria10 SoC的SPL默认初始化流程中,MMC控制器初始化通常早于固件加载逻辑,仅需修改SPL的board级初始化代码(默认路径为board/altera/arria10-socdk/spl.c),在调用Firmware Loader API之前,先调用env_init()和env_relocate()两个接口完成环境变量的加载和重定位 - 验证环境变量读取逻辑
环境变量加载完成后,可直接通过env_get("storage_interface")和env_get("fw_dev_part")接口获取对应的变量值,返回的字符串格式和U-Boot阶段读取的完全一致,可直接传给Firmware Loader API的对应参数
注意事项
- SPL的内存空间非常有限,开启SPL环境变量支持后会增加约2~3KB的SPL镜像体积,需确认你的SPL镜像大小没有超出Arria10 SoC片上RAM(OCRAM)的限制,Arria10 OCRAM通常为256KB,绝大多数场景下余量充足
- 若你的环境变量启用了CRC校验,不需要额外修改逻辑,SPL的env加载接口会自动完成校验,校验失败会自动返回默认环境变量
- 如果你自定义过环境变量的存储偏移地址,要确保
CONFIG_ENV_OFFSET和CONFIG_ENV_SIZE两个配置项在SPL和U-Boot阶段的配置完全一致,否则会出现读不到变量或读取错误的问题
内容的提问来源于stack exchange,提问作者moudi
相关产品推荐
相关产品推荐

