4. Layerscape Linux内核与设备树
在 Layerscape 平台上,Linux 能否正确启动并驱动网络、PCIe、SATA、USB 等外设,取决于两件事:内核里有没有对应的驱动代码,以及设备树里有没有把硬件资源描述清楚。前者通过内核配置与裁剪控制,后者通过设备树源文件(.dts/.dtsi)描述。本节围绕这两条主线展开,并重点说明 DPAA/DPAA2 这类 NXP 专有网络加速单元在设备树中的节点组织方式。
一、内核配置与裁剪的基本方法
Layerscape 使用标准 Linux 内核源码树,NXP 通常提供基于某个 LTS 版本的分支(例如 linux-6.1 或 linux-6.6 的 lf 分支)。配置入口是 make menuconfig 或 make nconfig,最终生成 .config。裁剪的核心思路是:先保证平台基础可用,再按需增删外设驱动。
对 Layerscape 而言,必须保留的配置项包括:
CONFIG_ARCH_LAYERSCAPE=y:使能 Layerscape 平台支持,这是所有后续配置的前提。CONFIG_ARM64=y(LS1043A/LS1046A/LS2088A 等 64 位 SoC)或CONFIG_ARM=y(LS1021A 等 32 位 SoC)。CONFIG_PCI=y、CONFIG_PCI_MSI=y:Layerscape 的 PCIe 控制器依赖 MSI 中断。CONFIG_SMP=y:多核 SoC 必须开启。
网络相关配置是重点。DPAA1(LS1043A/LS1046A/LS2088A)使用 CONFIG_FSL_DPAA、CONFIG_FSL_DPAA_ETH;DPAA2(LS1088A/LS2088A/LX2160A)使用 CONFIG_FSL_DPAA2、CONFIG_FSL_DPAA2_ETH、CONFIG_FSL_MC_BUS。若使用 fsl-mc 总线管理 DPAA2 对象,还需 CONFIG_FSL_MC_DPIO、CONFIG_FSL_DPAA2_ETH 等。裁剪时若关闭这些项,即使设备树节点存在,也不会生成对应 netdev。
裁剪的常见做法是:以 NXP 提供的 defconfig(如 ls1046a_defconfig)为基线,用 make savedefconfig 导出精简配置,再逐项关闭不需要的子系统(如 CONFIG_SOUND、CONFIG_DRM、CONFIG_WIRELESS)。判断裁剪是否安全,最直接的方法是编译后检查 System.map 中是否仍包含关键符号,例如 dpaa_eth_probe、fsl_mc_bus_probe。
二、设备树结构:从 SoC 到板级
Layerscape 设备树采用分层包含结构:SoC 级 .dtsi(如 fsl-ls1046a.dtsi)描述 CPU、内存映射、中断控制器、DPAA 等公共资源;板级 .dts(如 fsl-ls1046a-rdb.dts)通过 #include 引入 SoC dtsi,再覆盖或补充板级差异,例如 PHY 地址、MDIO 总线、flash 分区。编译时 dtc 将 .dts 展开为 .dtb,由 U-Boot 通过 bootm 或 booti 传给内核。
设备树中每个节点由 compatible 属性与驱动匹配。例如 compatible = "fsl,ls1046a-dpaa" 会匹配 DPAA 驱动。节点内的 reg 描述寄存器基址与长度,interrupts 描述中断号,clocks 描述时钟源。理解这些属性的含义,是修改设备树的前提。
三、DPAA/DPAA2 节点描述要点
DPAA1 的典型节点是 dpaa 容器节点,内部包含 fman、bman、qman 等子节点。以 LS1046A 为例,fman@1a00000 节点下通过 fman0 的 ethernet@e0000 等子节点描述每个 MAC。每个 MAC 节点需要 phy-handle 指向 MDIO 总线上的 PHY 节点,phy-mode 指定接口类型(如 rgmii-id、sgmii、xgmii)。若 phy-mode 与实际硬件不符,链路可能无法 up。
DPAA2 则通过 fsl-mc 总线管理。设备树中 fsl-mc 节点描述 MC 固件的寄存器区域和中断,MC 固件启动后动态创建 DPNI、DPMAC、DPIO 等对象。板级 dts 中常见 dpmac@1、dpmac@2 节点,每个节点通过 phy-handle 关联 PHY。DPAA2 的网口在 Linux 中表现为 fsl-mc 总线下的平台设备,驱动为 fsl_dpaa2_eth。调试时可用 ls /sys/bus/fsl-mc/devices/ 查看 MC 对象是否枚举成功。
四、外设驱动使能方法
外设驱动使能分两步:内核配置中打开对应 CONFIG_*,设备树中使能对应节点(status = "okay")。以 I2C 为例,内核需 CONFIG_I2C=y、CONFIG_I2C_IMX=y;设备树中 i2c0: i2c@2180000 { status = "okay"; },并在其下挂载 eeprom@50 等从设备。若 status 仍为 "disabled",驱动不会 probe。
PCIe 使能需 CONFIG_PCI=y、CONFIG_PCIE_DW=y、CONFIG_PCIE_LAYERSCAPE=y,设备树中 pcie@3400000 { status = "okay"; }。SATA 需 CONFIG_SATA_AHCI=y 与 CONFIG_AHCI_IMX=y。USB 需 CONFIG_USB_XHCI_HCD=y 与 CONFIG_USB_XHCI_PLATFORM=y。
make dtbs 重新编译,将新 .dtb 放入 U-Boot 可访问的存储(如 SD 卡 FAT 分区或 TFTP 目录),再通过 booti $kernel_addr - $fdt_addr 启动。若启动后 dmesg | grep -i dpaa 无输出,优先检查 compatible 与 status。五、一个可复用的检查清单
| 检查项 | 命令/位置 | 预期结果 |
|---|---|---|
| 内核配置是否包含 DPAA/DPAA2 | grep DPAA .config | 出现 CONFIG_FSL_DPAA_ETH=y 等 |
| 设备树节点是否使能 | grep -A2 "dpaa" arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb.dts | status = "okay" |
| PHY 是否被识别 | dmesg | grep -i phy | 打印 PHY 地址与 ID |
| 网口是否注册 | ip link show | 出现 eth0、eth1 等 |
| MC 对象是否枚举 | ls /sys/bus/fsl-mc/devices/ | 出现 dprc.1 等 |
掌握以上方法后,面对一块新的 Layerscape 板卡,可以按“确认 SoC dtsi 基线 → 核对板级 dts 差异 → 检查内核配置 → 编译并启动 → 用 dmesg 和 sysfs 验证”的顺序推进。设备树与内核配置是软硬件之间的契约,任何一侧缺失都会导致外设不可用。