U-Boot从SD卡启动时如何从QSPI Flash加载环境配置
U-Boot SD卡启动+QSPI存储运行环境配置方案
方案可行性结论
U-Boot运行环境存储位置与U-Boot自身加载位置完全独立,不存在强制绑定关系。你要实现的「开发阶段从SD卡加载U-Boot方便迭代、持久化环境存在板载QSPI Flash上跟随板卡走」是通用成熟方案,不存在架构层面的障碍。
取消CONFIG_ENV_IS_IN_FAT后启动卡死的根因
你遇到的U-Boot无串口输出问题,崩在U-Boot拿到执行权后的最早期初始化阶段:
- 你仅删除了FAT分区相关的环境配置项,但没有显式启用SPI Flash作为环境存储后端,U-Boot编译时没有链接有效的环境加载逻辑,初始化流程中调用环境读取接口时触发空指针访问,直接进入异常死循环,因此连串口初始化日志都无法输出。
- 你之前观察到的「U-Boot根据启动介质自动选择环境存储位置」不是U-Boot原生逻辑,是PetaLinux的默认配置规则导致的:PetaLinux构建U-Boot时会根据选中的默认启动设备,自动将对应介质的环境配置设为最高优先级,和U-Boot本身从哪个介质加载没有关系。
- ATF日志里的
invalid exception level警告、CPU勘合补丁缺失提示不影响U-Boot正常启动,板载LED变绿证明FPGA、FSBL、ATF流程全量正常,执行权已经正确交到U-Boot入口地址0x8000000,故障点完全在U-Boot自身的配置上。
正确配置方法
推荐直接硬编码指定QSPI为唯一环境存储后端,稳定性最高,配置步骤如下:
- 不要仅删除FAT相关环境配置,需在
u-boot.cfg中显式开启SPI Flash环境支持,保留并补充以下配置项:
// 原有QSPI环境偏移配置保留 #define CONFIG_ENV_OFFSET 0x2E00000 #define CONFIG_ENV_OVERWRITE 1 #define CONFIG_CMD_ERASEENV 1 // 补充配置:匹配你板载Flash的128KiB擦除块大小 #define CONFIG_ENV_SECT_SIZE 0x20000 // 显式指定环境存储在SPI Flash中 #define CONFIG_ENV_IS_IN_SPI_FLASH 1 // 确认QSPI Flash驱动编译进U-Boot,匹配你日志中识别到的mt25qu02g型号 #define CONFIG_SPI_FLASH 1 #define CONFIG_SPI_FLASH_MT25QU02G 1 // 全量注释/删除所有FAT/MMC相关的环境存储配置 // #define CONFIG_ENV_IS_IN_FAT // #define CONFIG_SYS_MMC_ENV_DEV // #define CONFIG_ENV_FAT_DEVICE_AND_PART // #define CONFIG_ENV_FAT_FILE // #define CONFIG_SYS_MMC_ENV_PART // #define CONFIG_ENV_FAT_INTERFACE
- 清理U-Boot旧编译缓存后重新构建,避免残留配置导致异常:
petalinux-build -c u-boot-xlnx -x distclean petalinux-build -c u-boot-xlnx
- 重新打包生成BOOT.BIN拷贝到SD卡,拨码切SD启动模式后,就能看到串口日志打印
Loading Environment from SPIFlash...,直接读取你之前存在QSPI里的MAC地址、板级配置等持久化数据,不会再从SD卡找环境文件。
如果不想改动现有编译配置,也可以保留FAT环境相关配置,通过U-Boot默认内置环境变量,在启动流程最早期手动挂载QSPI、导入QSPI中存储的环境覆盖默认加载的FAT环境,但该方案灵活性高但稳定性不如硬编码配置,适合临时调试场景使用。
内容的提问来源于stack exchange,提问作者davidA
相关产品推荐
相关产品推荐

