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 描述时钟源。理解这些属性的含义,是修改设备树的前提。

Layerscape 设备树结构与 DPAA/DPAA2 节点关系 SoC 级 dtsi fsl-ls1046a.dtsi cpus / memory gic 中断控制器 dpaa 节点 compatible="fsl,ls1046a-dpaa" fsl-mc 节点 compatible="fsl,ls1046a-mc" pcie / sata / usb clock / pinmux 板级 dts fsl-ls1046a-rdb.dts #include SoC dtsi mdio / phy 地址 ethernet@e0000 phy-handle / phy-mode dpmac@1 / dpmac@2 DPAA2 MAC 对象 flash 分区 led / gpio 内核驱动匹配 fsl_dpaa_eth CONFIG_FSL_DPAA_ETH fsl_mc_bus CONFIG_FSL_MC_BUS fsl_dpaa2_eth CONFIG_FSL_DPAA2_ETH pcie-designware CONFIG_PCIE_DW i2c / spi / uart compatible 属性决定驱动匹配;reg/interrupts/clocks 描述硬件资源;板级 dts 覆盖 SoC dtsi 的板级差异

三、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/DPAA2grep DPAA .config出现 CONFIG_FSL_DPAA_ETH=y 等
设备树节点是否使能grep -A2 "dpaa" arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb.dtsstatus = "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 验证”的顺序推进。设备树与内核配置是软硬件之间的契约,任何一侧缺失都会导致外设不可用。