1. iMX6ULL是否使用SPL
结论:iMX6ULL默认不使用SPL,而是使用Plugin机制。
证据分析:
defconfig文件分析:
- 检查所有iMX6ULL相关配置文件(configs/mx6ull_*_defconfig)
- 无任何配置文件包含CONFIG_SPL=y
- 所有配置都使用imximage.cfg而非SPL启动方式
Kconfig配置分析:
- MX6ULL基础配置没有默认选择SUPPORT_SPL
- 对比其他芯片(如MX6UL_LITESOM),明确选择了SUPPORT_SPL
2. SPL的作用和启动机制
SPL(Secondary Program Loader)的核心作用:
- 内存初始化:在OCRAM中运行,初始化DDR3/LPDDR2
- 硬件配置:时钟设置、GPIO配置、存储接口初始化
- 代码加载:从存储介质加载完整U-Boot到DDR
- 环境准备:为U-Boot proper执行准备运行环境
iMX6ULL的内存布局(支持SPL时):
SPL启动序列:
- BootROM → 加载SPL到OCRAM (0x00908000)
- SPL执行 → 初始化DDR + 时钟 + 外设
- SPL加载 → 从存储加载u-boot.img到DDR
- 跳转执行 → 跳转到DDR中的U-Boot proper
3. iMX6ULL使用Plugin机制替代SPL
Plugin机制分析:
配置方式:
Plugin功能:
- DDR初始化:执行完整的DDR3/LPDDR2配置序列
- 时钟配置:设置系统时钟和外设时钟
- 硬件设置:GPIO、IOMUX等基础配置
- ROM API调用:调用BootROM的pu_irom_hwcnfg_setup()
Plugin vs SPL对比:
| 特性 | Plugin机制 | SPL机制 | 
| 代码位置 | OCRAM (plugin.bin) | OCRAM (SPL) | 
| 大小限制 | ~64KB | 64KB (CONFIG_SPL_MAX_SIZE) | 
| 执行方式 | BootROM调用 | 独立执行 | 
| 功能范围 | DDR初始化为主 | 完整启动链 | 
| 文件系统支持 | 无 | 支持(FAT/EXT4) | 
| 复杂度 | 简单 | 复杂 | 
4. 决定是否使用SPL的依据
主要考虑因素:
1. OCRAM大小限制
- iMX6ULL: 128KB OCRAM → Plugin够用
- iMX6Q/D: 256KB OCRAM → 更适合SPL
- 大型芯片: 更多OCRAM → SPL优势明显
2. 启动复杂度需求
3. 存储介质要求
- Plugin适用:SD/eMMC/QSPI等简单介质
- SPL适用:需要文件系统、网络启动等复杂场景
4. 功耗和启动时间
- Plugin:启动更快,功耗更低
- SPL:功能更全,但启动较慢
5. 有无SPL的启动流程差异
无SPL启动流程(iMX6ULL默认):
有SPL启动流程:
关键差异总结:
| 启动阶段 | 无SPL (Plugin) | 有SPL | 
| 阶段数 | 3阶段 | 4阶段 | 
| DDR初始化时机 | Plugin中(OCRAM) | SPL中(OCRAM) | 
| 代码加载方式 | BootROM直接加载 | SPL智能加载 | 
| 启动设备支持 | 固定配置 | 动态检测 | 
| 错误处理 | 基础 | 完善 | 
| 调试支持 | 有限 | 完整 | 
6. 实际应用建议
推荐使用Plugin(默认)的场景:
- 标准开发板应用
- 简单产品部署
- 对启动时间要求高
- 存储空间有限
推荐使用SPL的场景:
- 需要支持多种启动介质
- 需要网络启动(TFTP)
- 复杂的启动逻辑
- 需要完整的调试支持
总的来说,iMX6ULL选择Plugin机制而非SPL是基于其128KB OCRAM限制和应用场景的合理设计选择,既满足了启动需求,又保持了简洁性和高效性。






