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)。

下图给出各阶段之间的加载与交接关系,以及设备树在其中的传递路径:

BootROM 片内固化 / 读RCW PBL + RCW SerDes/DDR 配置 ATF (BL2/BL31) EL3 / PSCI / SMC U-Boot 加载 Image + DTB Linux Kernel 解析 DTB / 驱动 fsl-ls1046a-rdb.dtb 设备树二进制 传递 设备树中的网络描述(以 LS1046A 为例) DPAA1(LS1043A/LS1046A) fsl,dpaa 总线容器 ethernet@e0000 fsl,fman-mac fman@1a00000 帧管理器 phy-handle → mdio 节点 phy-mode = "sgmii" / "rgmii-id" local-mac-address 由 U-Boot 注入 DPAA2(LS2088A/LX2160A) fsl-mc 管理复合体 dpmac@1 MAC 对象 dpni@0 网络接口 MC 固件:mc_ls2088a_xx.itb DPRC/DPNI 由 MC 动态创建 Linux 侧通过 fsl-mc-bus 枚举

二、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 未创建”等问题时,快速判断故障发生在启动的哪一级,而不是盲目更换镜像或反复烧写。