3. Layerscape启动流程与设备树
Layerscape 系列 SoC(如 LS1046A、LS1043A、LS2088A、LX2160A)的启动过程是一条严格分阶段的信任链:芯片上电后由固化在片内的 BootROM 开始,逐级把控制权交给可信的下一级镜像,直到 Linux 内核接管并挂载根文件系统。理解这条链路,是排查“板子起不来”“网口不识别”“DPAA 端口没出现”这类问题的前提。本节按启动顺序展开,并重点说明设备树中网络节点与 DPAA/DPAA2 的描述方式。
一、启动阶段划分与镜像职责
Layerscape 的典型启动链为:BootROM → PBL/RCW → ATF(BL2/BL31) → U-Boot(SPL/Proper) → Linux Kernel → RootFS。各阶段职责如下:
- BootROM:上电复位后运行,读取启动介质(QSPI、SD/eMMC、NAND、NOR)的头部信息,按 RCW(Reset Configuration Word)配置 SerDes、时钟、DDR 控制器等关键参数,然后加载下一级镜像。
- RCW/PBL:RCW 决定 SerDes 通道协议(如 PCIe、SGMII、XFI)、DDR 频率、启动介质顺序等;PBL(Pre-Boot Loader)负责把 ATF 与 U-Boot 镜像搬入 OCRAM/DDR。
- ATF(ARM Trusted Firmware):实现 BL2、BL31,负责安全启动校验、PSCI 电源管理、异常等级切换(EL3→EL2/EL1),并为 U-Boot 提供 SMC 调用接口。
- U-Boot:完成 DDR 初始化、外设驱动加载、环境变量解析,最终通过 booti/bootm 加载内核镜像(Image/Image.gz)与设备树(.dtb),并把控制权交给内核。
- Linux Kernel:解析设备树,注册平台设备,加载 DPAA/DPAA2 驱动,创建网络接口(如 eth0、dpaa2 的 dpni)。
下图给出各阶段之间的加载与交接关系,以及设备树在其中的传递路径:
二、U-Boot 到内核的交接细节
U-Boot 阶段最关键的是把三样东西准备好:内核镜像、设备树、启动参数。以 LS1046ARDB 为例,典型命令序列如下:
setenv bootargs 'console=ttyS0,115200 root=/dev/mmcblk0p2 rw rootwait'
load mmc 0:1 0x80000000 Image
load mmc 0:1 0x90000000 fsl-ls1046a-rdb.dtb
booti 0x80000000 - 0x90000000
其中 booti 的第三个参数就是设备树地址。内核启动后会打印 OF: fdt: Machine model: LS1046A RDB Board,说明 DTB 已被正确解析。若此处报 No valid device tree,通常是 DTB 地址错误或镜像与板卡不匹配。
三、设备树中网络节点的组织方式
DPAA1 与 DPAA2 在设备树中的描述差异很大,这是排查网络问题时最容易混淆的地方。
DPAA1(LS1043A/LS1046A):网络由 FMan(Frame Manager)统一管理。设备树中通常有一个 fsl,dpaa 容器节点,其下挂 ethernet@e0000 等 MAC 节点,每个 MAC 通过 phy-handle 指向 MDIO 总线上的 PHY,通过 phy-mode 指定接口类型(rgmii-id、sgmii、xgmii 等)。FMan 节点本身描述端口、BMI、QMI 等硬件资源。内核加载 fsl_dpaa、fsl_fman 驱动后,会为每个 MAC 注册一个 net_device。
DPAA2(LS2088A/LX2160A):网络对象由 MC(Management Complex)固件动态创建,设备树中只描述 fsl-mc 容器和 dpmac 等静态对象。Linux 启动时先加载 MC 固件(如 mc_ls2088a_10.28.1.itb),再通过 fsl-mc-bus 枚举 DPNI、DPRC、DPSW 等对象,最终生成 dpni.0 这类网络接口。因此 DPAA2 的“网口”在设备树里往往看不到完整的 MAC 节点,而是运行时由 MC 创建。
fsl-mc 节点:有则是 DPAA2,没有而存在 fsl,dpaa 则是 DPAA1。
四、常见启动与网络问题定位
启动链中任一环节出错,都会表现为“卡在某一行”。可按以下顺序排查:
- BootROM 阶段无输出:检查 RCW 是否与板卡匹配、启动介质拨码是否正确、串口波特率是否为 115200。
- ATF 之后卡住:多为 DDR 初始化失败或 ATF 镜像与 SoC 版本不匹配,可对比 SDK 中
atf/bl2.bin的编译配置。 - U-Boot 能起但内核不启动:检查
bootargs中 root 设备、Image 与 DTB 地址是否重叠。 - 内核启动后无网口:DPAA1 检查
phy-handle与phy-mode;DPAA2 检查 MC 固件是否加载成功,dmesg | grep fsl-mc是否有 DPNI 创建记录。
掌握这条从 BootROM 到设备树解析的完整链路,才能在面对“网口不识别”“PHY 不通”“DPNI 未创建”等问题时,快速判断故障发生在启动的哪一级,而不是盲目更换镜像或反复烧写。