4. Layerscape启动流程与引导加载
Layerscape系列处理器的启动过程是一条严格分阶段的链路:上电复位后,芯片内部的BootROM首先接管执行,读取RCW(Reset Configuration Word)完成最基础的时钟、SerDes与DDR初始化,随后由PBL(Pre-Boot Loader)从指定启动介质加载并校验SPL/U-Boot镜像,最终把控制权交给U-Boot,由U-Boot完成外设初始化、环境变量加载并引导操作系统。理解这条链路,是排查工业网关“上电不启动”“启动慢”“镜像校验失败”等问题的前提。
一、启动链路的四个阶段
Layerscape的启动可以拆成四个职责清晰的阶段,每个阶段的输入、执行主体和输出都不同:
- BootROM阶段:芯片复位后,CPU从内部ROM的固定入口开始执行。BootROM根据复位配置引脚(如CFG_RCW_SRC[0:3])判断启动介质类型(NOR、NAND、SD/eMMC、QSPI等),并确定RCW的读取位置。
- RCW加载与PBL阶段:BootROM从启动介质读取RCW数据,写入芯片内部的RCW寄存器,完成PLL倍频、SerDes协议配置、DDR控制器参数等关键初始化。随后PBL从介质中读取SPL(Secondary Program Loader)镜像到片上SRAM或已初始化的DDR中。
- SPL/U-Boot SPL阶段:SPL体积小,运行在片上SRAM中,负责进一步初始化DDR、串口等必要外设,然后把完整的U-Boot镜像搬运到DDR并跳转执行。
- U-Boot阶段:完整U-Boot运行后,初始化网络、存储、PCIe等外设,加载环境变量,最后通过bootcmd引导内核。
这四个阶段中,RCW和PBL是Layerscape特有的关键环节,也是工业网关定制启动流程时最常修改的部分。
二、RCW配置:启动链路的“第一份参数表”
RCW本质上是一组写入芯片复位配置寄存器的二进制数据,通常以.rcw文件或二进制形式随启动镜像一起烧录。它决定了芯片上电后最基础的运行环境。以LS1028A为例,RCW中几个关键字段的作用如下:
| 字段 | 作用 | 典型取值示例 |
|---|---|---|
| SYS_PLL_RAT | 系统PLL倍频比,决定CPU核心频率 | 6(对应约1.2GHz,需结合外部晶振) |
| DDR_PLL_RAT | DDR PLL倍频比,决定DDR时钟 | 4(对应约1.6GHz DDR数据率) |
| SRDS_PRTCL | SerDes协议配置,决定PCIe/SGMII等接口 | 根据板级设计选择对应协议编号 |
| BOOT_LOC | 启动介质位置选择 | 0x0=QSPI,0x1=SD,0x2=eMMC |
| UART_BAUD | 调试串口波特率 | 115200 |
RCW通常由NXP提供的RCW工具或QCVS工具生成,也可以直接修改源码中的rcw_default.rcw文件。修改后需要重新编译并烧录到启动介质的固定偏移处。工业网关中常见的做法是:在RCW中把调试串口波特率固定为115200,把启动介质设为QSPI或eMMC,并根据实际使用的SerDes通道配置正确的协议编号。
三、PBL与SPL:从SRAM到DDR的接力
PBL是BootROM内部固化的加载逻辑,它从启动介质中读取SPL镜像。SPL镜像通常包含一个头部(Header),其中记录了镜像长度、加载地址、校验和等信息。BootROM会校验这个头部,然后把SPL搬运到片上SRAM的指定地址并跳转执行。
SPL运行在SRAM中,空间有限(通常几十KB到几百KB),因此它只做最必要的事情:初始化DDR控制器、初始化调试串口、然后把完整的U-Boot镜像从启动介质搬运到DDR中。在Layerscape平台上,SPL的源码位于U-Boot源码树的arch/arm/cpu/armv8/fsl-layerscape/目录下,关键文件包括spl.c和spl_minimal.c。
工业网关快速启动优化的一个关键点就在这里:如果DDR训练时间过长,或者SPL中包含了不必要的初始化代码,启动时间会明显增加。常见的优化手段包括:
- 在SPL中只初始化实际使用的DDR通道和容量,跳过未使用的Rank。
- 关闭SPL中的调试打印输出,减少串口等待时间。
- 使用预计算的DDR参数替代运行时训练,前提是板级设计稳定。
- 把U-Boot镜像放在启动介质的连续区域,减少读取寻道时间。
四、U-Boot移植与启动参数配置
U-Boot阶段是工业网关功能扩展的主要场所。移植U-Boot到自定义Layerscape板卡时,需要重点关注以下配置:
# 典型Layerscape U-Boot配置片段(以LS1028A为例)
CONFIG_TARGET_LS1028ARDB=y
CONFIG_SYS_TEXT_BASE=0x82000000
CONFIG_SYS_MALLOC_F_LEN=0x2000
CONFIG_SPL=y
CONFIG_SPL_TEXT_BASE=0x18000000
CONFIG_DEFAULT_DEVICE_TREE="fsl-ls1028a-rdb"
CONFIG_BOOTDELAY=1
CONFIG_BOOTCOMMAND="mmc read 0x80000000 0x1000 0x8000; booti 0x80000000 - 0x90000000"
其中CONFIG_BOOTDELAY控制U-Boot启动前的等待时间,工业网关中通常设为1秒甚至0秒,以加快启动。CONFIG_BOOTCOMMAND定义了自动引导命令,需要根据实际存储布局和内核镜像格式调整。
环境变量是U-Boot阶段另一个需要关注的点。工业网关通常需要预置bootargs、ipaddr、serverip等变量,并保存到非易失存储中。如果环境变量存储区损坏,U-Boot会回退到默认环境,可能导致启动参数丢失。建议在移植时配置CONFIG_ENV_IS_IN_MMC或CONFIG_ENV_IS_IN_SPI_FLASH,并设置合理的环境变量偏移地址。
五、启动时间测量与优化验证
要验证启动优化效果,需要有一个可重复的测量方法。在Layerscape平台上,最直接的方式是利用U-Boot的bootstage机制或串口打印时间戳。具体操作如下:
- 在U-Boot配置中打开
CONFIG_BOOTSTAGE和CONFIG_BOOTSTAGE_REPORT。 - 启动后在U-Boot命令行执行
bootstage report,查看各阶段耗时。 - 对比优化前后的
bootstage数据,确认SPL、DDR初始化、U-Boot外设探测等环节的时间变化。
一个典型的优化前后对比如下(示例数据,实际值取决于板级设计和配置):
| 阶段 | 优化前耗时 | 优化后耗时 | 主要措施 |
|---|---|---|---|
| BootROM + RCW | 约80ms | 约80ms | RCW本身耗时固定,优化空间小 |
| SPL(含DDR初始化) | 约450ms | 约220ms | 精简DDR训练、关闭调试输出 |
| U-Boot外设初始化 | 约600ms | 约300ms | 关闭未使用外设探测 |
| 内核加载与引导 | 约900ms | 约700ms | 使用eMMC高速模式、镜像对齐 |
| 合计 | 约2030ms | 约1300ms | 整体缩短约36% |
总结来说,Layerscape的启动链路是一条从BootROM到RCW/PBL、再到SPL、最后到U-Boot的严格接力过程。RCW决定了芯片的基础运行环境,PBL和SPL负责把系统从SRAM过渡到DDR,U-Boot则承担外设初始化和内核引导。工业网关的快速启动优化,核心在于精简SPL和U-Boot中不必要的初始化步骤,同时保证关键工业接口的功能完整性。掌握这条链路,才能在出现启动故障时快速定位问题阶段,并做出有针对性的调整。