4. DPAA1以太网驱动移植与MAC配置
移植目标与硬件前提
本例把 DPAA1 以太网驱动落到一块自定义 LS1046A 板卡上。板卡使用 RGMII 连接外部千兆 PHY(示例为 AQR105 类器件),PHY 地址 0x03,MDIO 挂在 mdio0,复位由 GPIO1_15 控制。移植要同时打通三件事:DTS 节点描述正确、MAC 地址来源合法、PHY 接口与驱动匹配,最后用 ping 与 ethtool 验证链路。
LS1046A 的 DPAA1 以太网控制器在 Linux 中由
fsl_dpaa_mac / dpaa_eth 驱动栈管理。DTS 中 fsl,fman-mac 节点必须与 FMan 端口、MDIO 总线、PHY 三者对齐,否则会出现“网口存在但无 carrier”或“MAC 地址全 0”。DTS 节点结构与连接关系
下图给出本例板卡上 DPAA1 以太网从 SoC 内部到外部 PHY 的完整连接拓扑,以及 DTS 中需要落笔的关键节点与属性。理解这张图,就能定位“改哪个节点、连哪根线、配哪个参数”。
MAC 地址来源与配置
LS1046A 的 MAC 地址不能凭空写死。推荐优先级为:U-Boot 环境变量 ethaddr → DTS 中 local-mac-address → 驱动随机生成。生产板卡应把 MAC 写入 OTP 或 EEPROM,由 U-Boot 读取后注入内核。示例中先在 U-Boot 设置:
setenv ethaddr 00:1b:21:aa:bb:04
setenv eth1addr 00:1b:21:aa:bb:05
saveenv
内核启动后可用 ip link show enet0 确认地址是否生效。若显示 00:00:00:00:00:00,说明 U-Boot 未传递或 DTS 覆盖了该属性。
PHY 接口与驱动匹配
RGMII 模式下,PHY 与 MAC 之间的时序由 phy-mode 决定。常见取值与适用场景:
| phy-mode | 含义 | 适用 |
|---|---|---|
rgmii | 无内部延时 | PHY 侧已加延时 |
rgmii-id | RX/TX 内部延时 | 本例推荐 |
rgmii-txid | 仅 TX 延时 | RX 由 PHY 处理 |
rgmii-rxid | 仅 RX 延时 | TX 由 PHY 处理 |
若链路能 up 但丢包严重,优先检查 phy-mode 与 PHY 实际延时配置是否匹配,而不是先怀疑驱动。
编译、烧写与连通性验证
- 修改
arch/arm64/boot/dts/freescale/fsl-ls1046a-xxx.dts,加入上述节点与属性。 - 编译 DTB:
make ARCH=arm64 fsl-ls1046a-xxx.dtb,替换板卡启动分区中的 DTB。 - 启动后确认驱动绑定:
dmesg | grep -i dpaa,应看到fsl_dpaa_mac与 PHY 探测成功。 - 查看链路:
ethtool enet0,确认Speed: 1000Mb/s、Duplex: Full、Link detected: yes。 - 配置 IP 并 ping 网关:
ip addr add 192.168.1.10/24 dev enet0 && ip link set enet0 up && ping -c 4 192.168.1.1。
若
ethtool 显示 Link detected: no,按顺序排查:PHY 复位 GPIO 是否拉低足够时间 → MDIO 能否读到 PHY ID(mdio-tool 或 phytool)→ phy-mode 是否与硬件一致 → 时钟是否使能。常见问题速查
| 现象 | 可能原因 | 处理 |
|---|---|---|
| 无 enet0 设备 | DTS 节点未使能或 compatible 错误 | 检查 status = "okay" 与 compatible |
| MAC 全 0 | U-Boot 未传 ethaddr | 设置并保存 ethaddr |
| Link no | PHY 复位/时钟/MDIO 异常 | 量复位电平,读 PHY ID |
| 能 up 但丢包 | RGMII 延时错配 | 切换 rgmii-id / rgmii |