启动ROM与第一阶段:Boot ROM的初始化流程、PLL配置、引脚采样与启动源选择机制
Agilex SoC 上电或热复位后,第一个执行的代码并非来自用户闪存,而是固化在芯片内部的 Boot ROM。Boot ROM 是 SDM (Secure Device Manager) 子系统的一部分,负责完成最底层的硬件初始化,并决定从何处加载下一阶段代码。本章深入剖析 Boot ROM 的执行流程、关键配置与决策逻辑。
2.1 Boot ROM 初始化流程概览
Boot ROM 的执行是一个高度结构化的状态机过程,从复位释放到跳转到下一阶段加载器,通常经历以下主要阶段:
| 阶段 | 主要任务 | 关键输出 |
|---|---|---|
| 1. 硬件自检与微控制器启动 | 验证内部 SRAM、启动 SDM 微控制器内核、初始化堆栈指针 | SDM 固件运行环境就绪 |
| 2. PLL 与时钟配置 | 根据复位类型和硬布线配置,设置系统 PLL 与外围时钟 | 稳定的高频时钟域 |
| 3. I/O 引脚采样与配置 | 采样配置引脚 (MSEL, CSEL),确定启动模式与安全策略 | 启动源选择向量 |
| 4. 启动源枚举与选择 | 按优先级扫描可用启动设备,尝试读取有效启动映像头 | 选定的启动设备与偏移地址 |
| 5. 映像加载与验证 | 从选定设备加载第一阶段引导加载器 (FSBL) 或配置数据 | 跳转到下一阶段入口 |
关键理解: Boot ROM 本身不可修改,但其行为可以通过引脚电平、eFuse 设置以及复位类型进行配置。理解这些配置点是控制 HPS 与 FPGA 启动顺序的前提。
2.2 PLL 配置:从低速参考时钟到系统主频
复位释放后,芯片首先运行在一个内部低速振荡器 (OSC) 或外部参考时钟上。Boot ROM 必须快速配置 PLL,将时钟提升到足以支持高速外设(如 DDR、HPS 总线、SDM 自身)工作的频率。
PLL 配置流程遵循以下步骤:
- 参考时钟检测: 检测外部参考时钟输入(如 CLK_REF)的频率与稳定性。
- PLL 复位与旁路: 确保所有 PLL 处于复位状态,系统时钟运行在旁路模式(直接使用参考时钟)。
- PLL 参数加载: 从硬编码的默认参数表或 eFuse 中读取倍频 (M)、分频 (N)、后分频 (C) 系数。
- PLL 锁定: 写入配置寄存器,等待 PLL 锁定指示信号有效。
- 时钟切换: 将系统主时钟从旁路时钟无缝切换到 PLL 输出时钟。
设计提示: 对于需要特定启动频率的应用(例如,HPS 早期 DDR 初始化要求特定频率),可以通过 eFuse 或配置引脚覆盖默认 PLL 参数。但请注意,Boot ROM 阶段的 PLL 配置是全局性的,会影响 FPGA 架构时钟和 HPS 外围时钟的初始频率。
2.3 引脚采样与启动源选择机制
时钟稳定后,Boot ROM 立即对一组专用配置引脚进行采样。这些引脚在芯片复位期间被锁存,其电平状态直接编码为启动模式选择向量。Agilex 系列支持多种启动源,通过 MSEL[3:0] 和 CSEL[1:0] 引脚组合进行选择。
2.3.1 配置引脚定义与采样时序
| 引脚组 | 位宽 | 功能描述 | 采样时刻 |
|---|---|---|---|
| MSEL[3:0] | 4 位 | 主启动模式选择:定义启动设备类型(QSPI、SD/MMC、NAND、FLASH 等) | nPOR 释放后的上升沿 |
| CSEL[1:0] | 2 位 | 配置源选择:定义配置映像来源(HPS、FPGA、SDM 直通) | nPOR 释放后的上升沿 |
| BSEL | 1 位 | 启动映像备份选择:定义主启动失败后的回退策略 | nPOR 释放后的上升沿 |
硬件设计警告: 配置引脚必须在 nPOR 释放前稳定到目标电平。由于内部上拉/下拉电阻的强度有限,建议在 PCB 上使用 4.7kΩ ~ 10kΩ 的外部电阻进行强上拉或强下拉,以防止噪声导致采样错误。采样仅在复位释放瞬间发生,之后引脚电平变化不影响本次启动。
2.3.2 启动源优先级与枚举顺序
Boot ROM 根据 MSEL/CSEL 确定启动设备类型后,并不立即加载,而是按照预定义的优先级顺序尝试枚举设备。这种设计允许系统在主要启动设备失效时自动回退。
- 第一优先级: 由 MSEL 指定的主启动设备(如 QSPI Flash 的 CS0)。
- 第二优先级: 由 BSEL 指定的备份启动设备(如 QSPI Flash 的 CS1 或 SD/MMC 的第二分区)。
- 第三优先级: 如果前两者均失败,进入 恢复模式,等待通过 JTAG 或 USB 下载映像。
2.4 启动映像头验证与第一阶段加载
一旦 Boot ROM 通过枚举确认了有效的启动设备,它会读取该设备的起始扇区(通常为偏移 0 或特定块地址),并验证 启动映像头 (Boot Image Header)。该头结构包含以下关键字段:
- 魔数 (Magic Number): 用于快速识别是否为有效映像。
- 映像长度与校验和: 确保映像完整性。
- 入口点地址: 第一阶段引导加载器 (FSBL) 在 HPS 或 SDM 内部 RAM 中的加载地址。
- 配置标志: 指示是否包含 FPGA 配置数据、HPS 早期配置数据等。
验证通过后,Boot ROM 将 FSBL 代码从启动设备复制到 SDM 内部 SRAM(或 HPS 的 OCM),然后执行一次跳转,将控制权移交给 FSBL。至此,Boot ROM 的使命完成,系统进入由 FSBL 主导的第二阶段。
HPS 与 FPGA 启动顺序的第一次分岔口: 在 Boot ROM 阶段,HPS 和 FPGA 均处于复位状态。Boot ROM 仅初始化 SDM 子系统。HPS 的复位释放、FPGA 的配置操作,均由后续的 FSBL 或 SDM 固件根据 CSEL 和映像头标志决定。这正是控制启动顺序的关键切入点。