You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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为唯一环境存储后端,稳定性最高,配置步骤如下:

  1. 不要仅删除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
  1. 清理U-Boot旧编译缓存后重新构建,避免残留配置导致异常:
petalinux-build -c u-boot-xlnx -x distclean
petalinux-build -c u-boot-xlnx
  1. 重新打包生成BOOT.BIN拷贝到SD卡,拨码切SD启动模式后,就能看到串口日志打印Loading Environment from SPIFlash...,直接读取你之前存在QSPI里的MAC地址、板级配置等持久化数据,不会再从SD卡找环境文件。

如果不想改动现有编译配置,也可以保留FAT环境相关配置,通过U-Boot默认内置环境变量,在启动流程最早期手动挂载QSPI、导入QSPI中存储的环境覆盖默认加载的FAT环境,但该方案灵活性高但稳定性不如硬编码配置,适合临时调试场景使用。

内容的提问来源于stack exchange,提问作者davidA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 08:57:20