3. 启动模式与量产镜像规划
Zynq-7000 与 Zynq UltraScale+ MPSoC 的启动过程,本质上是 BootROM 按固定顺序寻找并加载引导镜像的过程。量产部署时,启动介质的选择直接决定了镜像烧录方式、升级策略、现场可维护性以及单板成本。理解每种介质的物理特性与 BootROM 的读取约束,是规划量产镜像的第一步。
一、四种启动介质的工程定位
Zynq 常见的启动介质包括 QSPI Flash、SD 卡、eMMC 和 NAND Flash,它们在量产中的角色差异明显:
- QSPI Flash:NOR 型存储,支持 XIP(就地执行)与随机读取,BootROM 可直接通过 QSPI 控制器读取。容量通常 16MB~64MB,适合存放 FSBL、BIT 流与轻量应用。缺点是单位容量成本高、写入速度慢,不适合大容量根文件系统。
- SD 卡:量产阶段最常用的调试与首件启动介质。可插拔、可用读卡器直接烧录,BootROM 支持 FAT32 分区中的 BOOT.BIN。缺点是接触可靠性差、易被误拔,不适合作为最终产品唯一启动源。
- eMMC:BGA 封装焊接在板上,容量 4GB~32GB,具备坏块管理与磨损均衡。BootROM 通过 SD/eMMC 控制器以 1-bit 或 4-bit 模式读取其 Boot Partition 或 User Partition 的前若干扇区。适合作为量产主启动介质,兼顾容量与可靠性。
- NAND Flash:单位成本最低,容量大,但存在坏块、需要 ECC 与页读取。BootROM 对 NAND 的支持依赖具体器件与 ONFI 参数,量产中需严格校验坏块表与 ECC 配置,否则易出现批次性启动失败。
选择原则可以概括为:调试与首件用 SD,量产主启动用 QSPI 或 eMMC,成本极度敏感且能接受坏块管理复杂度时用 NAND。若产品需要现场升级,eMMC 的块设备特性比 QSPI 更易实现 A/B 双分区回滚。
二、BOOT.BIN 的组成与加载顺序
BOOT.BIN 是 BootROM 直接解析的引导镜像,其内部由多个分区(Partition)按顺序排列,每个分区带有一个 Image Header Table 与分区头。典型组成如下:
BOOT.BIN 结构(Zynq-7000 示例)
┌─────────────────────────────────────┐
│ Image Header Table (IH) │
├─────────────────────────────────────┤
│ Partition 1: FSBL (ELF) │ ← BootROM 首先加载并执行
├─────────────────────────────────────┤
│ Partition 2: PL Bitstream (BIT) │ ← 由 FSBL 搬移到 PL
├─────────────────────────────────────┤
│ Partition 3: U-Boot (ELF) │ ← FSBL 跳转执行
├─────────────────────────────────────┤
│ Partition 4: ATF / PMU (可选) │ ← MPSoC 平台需要
└─────────────────────────────────────┘
BootROM 只负责把 FSBL 加载到 OCM(On-Chip Memory)并跳转,后续 BIT、U-Boot 的搬移由 FSBL 完成。因此 FSBL 必须与硬件设计(PS 配置、DDR 初始化参数)严格匹配,否则会在 DDR 初始化阶段挂死。量产时建议将 FSBL 的调试串口输出保留在 UART0,便于产线快速定位启动失败。
对于 Zynq UltraScale+ MPSoC,BOOT.BIN 还需包含 PMU Firmware 与 ARM Trusted Firmware(ATF),加载顺序为 PMU → ATF → FSBL → BIT → U-Boot。若使用安全启动,还需在 IH 中附加认证证书(Certificate),并配置 eFUSE 中的 PPK 哈希。
三、量产分区布局设计
以 16MB QSPI Flash 为例,一种经过验证的量产分区方案如下:
| 分区 | 起始偏移 | 大小 | 内容 | 说明 |
|---|---|---|---|---|
| boot | 0x000000 | 4MB | BOOT.BIN | FSBL+BIT+U-Boot |
| bootenv | 0x400000 | 256KB | U-Boot 环境变量 | 冗余两份 |
| kernel | 0x440000 | 4MB | Linux 内核 + DTB | zImage + system.dtb |
| rootfs | 0x840000 | 7MB | 只读根文件系统 | squashfs 压缩 |
| data | 0xF40000 | 768KB | 应用配置/日志 | jffs2 可读写 |
若使用 eMMC,则建议划分独立的 Boot Partition 存放 BOOT.BIN,User Partition 用 GPT 分区表划分 rootfs、data 与 recovery 分区。eMMC 的 Boot Partition 默认容量为 4MB,可通过 EXT_CSD 寄存器调整,量产时需在烧录脚本中统一设置,避免不同批次容量不一致。
四、启动模式引脚与量产一致性
Zynq-7000 通过 MIO[5:2] 在上电复位时采样启动模式,常见配置为:0000 为 JTAG,0001 为 QSPI,0010 为 SD,0100 为 NAND。量产板必须将这些引脚通过电阻固定到目标电平,不能悬空。若使用 eMMC,通常配置为 SD 模式(0010),由 BootROM 通过 SD 控制器识别 eMMC 设备。
对于需要现场升级的产品,建议在 U-Boot 中实现 A/B 双分区启动:boot_a 与 boot_b 各存放一份 BOOT.BIN,通过环境变量 bootcount 与 upgrade_available 控制回滚。升级时先写入备用分区,校验通过后切换启动指针,失败则自动回退。这一机制在 eMMC 上实现最为自然,因为块设备读写与分区管理成熟;在 QSPI 上则需要自行管理擦除粒度与写入对齐。
综合来看,量产镜像规划的核心是:先根据产品定位选定主启动介质,再按 BootROM 的加载顺序组织 BOOT.BIN 分区,最后用分区表固定各镜像的偏移与大小,使烧录脚本、升级逻辑与产线校验三者使用同一份分区定义。这样在批量生产时,任何一块单板的启动失败都可以通过分区偏移与校验值快速定位到具体环节。