3. Layerscape启动流程与固件开发

Layerscape系列处理器的上电启动是一条由硬件固化逻辑与外部固件共同接力的链路。理解这条链路,是进行U-Boot移植、启动介质选择和故障排查的前提。整个启动过程可以概括为:BootROM从选定介质加载RCW和PBI,完成芯片底层初始化后加载并跳转到U-Boot,最终由U-Boot加载操作系统。每一环都有明确的输入、输出和失败表现。

BootROM与启动介质选择

BootROM是芯片内部固化的只读代码,上电复位后首先执行。它根据复位配置字(RCW)中的启动源选择位(BOOTSRC)决定从哪个接口读取初始镜像。Layerscape常见的启动介质包括:NOR Flash、NAND Flash、SD/eMMC、QSPI以及通过PBL加载的串口/I2C等。选择依据主要是容量、读取速度、可更新性和成本。

BootROM的加载过程分为两个阶段:首先从介质固定偏移处读取RCW和PBI(Pre-Boot Initialization)数据,PBI中包含对DDR控制器、SerDes、时钟等关键模块的寄存器写入序列;随后BootROM根据RCW中的PBI_LENGTH和PBI_SRC等字段定位并执行PBI,完成DDR初始化后,再从介质读取U-Boot镜像到DDR并跳转执行。

启动介质的选择直接影响RCW的BOOTSRC字段和硬件引脚配置。例如,从SD卡启动时,BOOTSRC通常配置为0b001,同时需要确保SDHC控制器时钟和引脚复用正确;从QSPI启动时,BOOTSRC配置为0b010,并需注意QSPI的片选和时钟频率设置。若启动介质选择错误,BootROM会因找不到有效RCW而进入复位循环或串口输出错误码。

Layerscape 启动链路与固件接力 BootROM 固化代码 · 上电首执行 读取RCW/PBI RCW + PBI BOOTSRC / PBI_LENGTH DDR/SerDes/时钟初始化 U-Boot SPL / 完整镜像 加载OS · 环境变量 Linux Kernel 设备树 · 根文件系统 用户空间 启动介质(BOOTSRC选择) NOR Flash BOOTSRC=0b000 NAND Flash BOOTSRC=0b011 SD / eMMC BOOTSRC=0b001 QSPI BOOTSRC=0b010 串口/I2C BOOTSRC=0b100 加载RCW/PBI 启动故障排查要点 无串口输出 / 复位循环 检查BOOTSRC引脚与RCW偏移 DDR初始化失败 核对PBI中DDR寄存器序列 U-Boot无法加载 检查镜像偏移与校验和 关键工具:CodeWarrior TAP / JTAG · 串口终端 · RCW编译脚本 · U-Boot源码中的board/freescale/ls*目录

U-Boot移植与定制

U-Boot在Layerscape平台上的移植工作主要围绕板级目录展开。以LS1046ARDB为例,源码位于board/freescale/ls1046ardb/,关键文件包括ls1046ardb.c(板级初始化)、rcw.cfg(RCW配置)、ddr.c(DDR参数)以及设备树文件。移植的第一步是确认SoC级支持是否已存在,Layerscape系列在U-Boot中已有较完整的SoC支持,通常只需适配板级差异。

具体操作上,先复制相近参考板的目录结构,修改Kconfig和Makefile中的目标名称,再调整include/configs/ls1046ardb.h中的宏定义,包括串口基地址、环境变量存储位置、启动命令等。RCW配置需要根据实际硬件连接修改,例如SerDes通道分配、DDR类型和频率。编译时使用交叉工具链,例如:

export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make ls1046ardb_defconfig
make -j8

生成的u-boot.bin需要与RCW合并为最终启动镜像。NXP提供了rcw.py工具,可将RCW二进制与U-Boot镜像按BootROM要求的格式拼接。若使用SD卡启动,还需在镜像前添加特定的头部信息,确保BootROM能正确识别。

启动参数配置

U-Boot的环境变量决定了内核加载方式和根文件系统位置。Layerscape平台常用的环境变量包括bootargs、bootcmd、fdt_addr、kernel_addr等。一个典型的SD卡启动配置如下:

setenv bootargs 'console=ttyS0,115200 root=/dev/mmcblk0p2 rw rootwait'
setenv bootcmd 'mmc read 0x80000000 0x1000 0x8000; mmc read 0x90000000 0x9000 0x4000; booti 0x80000000 - 0x90000000'
saveenv

其中mmc read的地址和块偏移需与镜像烧录位置一致。若使用网络启动,则配置tftp和bootp相关变量。环境变量默认保存在启动介质的特定分区或偏移处,若保存失败,需检查CONFIG_ENV_IS_IN_MMC等配置和分区表。

故障排查方法

启动故障通常按阶段定位。若串口无任何输出,优先检查RCW的BOOTSRC字段与硬件引脚是否匹配,以及启动介质是否已正确烧录RCW。若串口输出BootROM错误码,可对照芯片参考手册中的错误码表判断是介质读取失败还是PBI校验失败。若DDR初始化后卡住,需用JTAG连接CodeWarrior TAP,读取DDR控制器的状态寄存器,确认PBI中的寄存器序列是否与实际DDR颗粒匹配。

U-Boot阶段的问题多与环境变量或镜像偏移有关。可通过bdinfo查看内存布局,用mmc part确认分区,用md命令读取镜像头部验证魔数。若内核启动后挂载根文件系统失败,检查bootargs中的root=参数与分区编号是否一致。整个排查过程应遵循“先硬件后软件、先BootROM后U-Boot”的顺序,避免在错误阶段反复修改配置。

建议在板级移植时保留一份已知可用的RCW和U-Boot镜像作为回退基准,每次修改后先通过JTAG加载到DDR中验证,确认无误后再烧录到启动介质,可显著降低变砖风险。