Hi3536双网口实战:通用STMMAC驱动调通YT8511千兆PHY全流程解析
当国产PHY芯片遇上嵌入式Linux通用驱动框架,如何快速实现双千兆网口的稳定通信?本文将带你深入Hi3536平台与YT8511 PHY的硬件协同设计细节,通过STMMAC通用驱动完成从硬件验证到内核调优的全过程。不同于官方驱动的移植方案,这种标准化接入方式能显著降低后期维护成本,特别适合需要快速验证硬件设计的工程师。
1. 硬件架构设计与关键信号验证
在Hi3536双YT8511方案中,硬件设计的合理性直接决定了后续驱动调试的难度。两个PHY芯片通过RGMII接口与主控连接,但共享MDIO总线这一设计需要特别注意。
1.1 硬件拓扑与管脚复用
典型双网口硬件连接方案如下表所示:
| 网口 | PHY型号 | RGMII接口 | PHY地址 | 时钟信号 | 复位信号 |
|---|---|---|---|---|---|
| eth0 | YT8511 | RGMII0 | 0x01 | EPHY0_CLK | EPHY_RSTN0 |
| eth1 | YT8511 | RGMII1 | 0x00 | EPHY1_CLK | EPHY_RSTN0 |
关键点在于:
- 两个PHY共用MDIO/MDCK管理接口
- 复位信号EPHY_RSTN0同时控制两个PHY
- 每个PHY有独立的25MHz时钟输入
1.2 硬件状态验证命令
使用海思平台特有的himm命令验证管脚复用状态:
# 验证时钟信号复用 himm 0x120F0044 # EPHY0_CLK应返回0x00000001 himm 0x120F008C # EPHY1_CLK应返回0x00000001 # 验证MDIO总线复用 himm 0x120F0090 # MDCK应返回0x00000001 himm 0x120F0094 # MDIO应返回0x00000001若返回值不符合预期,需在uboot阶段通过setenv配置管脚复用:
setenv bootargs 'mem=1024M console=ttyAMA0,115200 phyaddr0=1 phyaddr1=0'2. 内核驱动配置与编译优化
STMMAC作为Linux主流MAC驱动,已支持大多数通用PHY芯片。正确的内核配置是保证驱动正常工作的前提。
2.1 Menuconfig关键选项
执行make ARCH=arm menuconfig后,按以下路径配置:
Device Drivers → [*] Network device support → [*] Ethernet driver support → <M> STMicroelectronics 10/100/1000 Ethernet driver [*] STMMAC Platform bus support [*] Support for Hi35xx STMMAC需要特别注意的隐藏配置项:
- CONFIG_STMMAC_DA:需设为n禁用DMA加速
- CONFIG_STMMAC_PHY1_ID:设为0x00对应eth1
- CONFIG_STMMAC_PHY2_ID:设为0x01对应eth0
2.2 设备树关键节点示例
对于没有预设设备树的内核版本,需手动添加rgmii配置:
&mdio { phy0: ethernet-phy@1 { compatible = "ethernet-phy-id0001.0a"; reg = <1>; reset-gpios = <&gpio0 8 GPIO_ACTIVE_LOW>; }; phy1: ethernet-phy@0 { compatible = "ethernet-phy-id0001.0a"; reg = <0>; }; }; &stmmac_axi_setup { snps,wr_osr_lmt = <0x7>; snps,rd_osr_lmt = <0x7>; }; &mtl_rx_setup { queue0 { snps,dcb-algorithm; }; };3. 启动日志分析与故障定位
系统启动时的内核日志包含关键调试信息,需要掌握其解读方法。
3.1 正常启动日志特征
成功驱动双网口的典型日志序列:
stmmac_mdio_register: PHY addr 1 -> irq -1 stmmac_mdio_register: PHY addr 0 -> irq -1 eth0: PHY ID 0000010a at 1 IRQ -6 (1:01) active eth1: PHY ID 0000010a at 0 IRQ -6 (1:00) active libphy: stmmac: probed关键字段说明:
active标记表示PHY被正确识别PHY ID 0000010a是YT8511的识别码- 地址1对应eth0,地址0对应eth1
3.2 常见故障模式与解决
场景1:PHY地址配置错误
eth0: PHY ID 0000010a at 3 IRQ -6 (1:03) eth1: PHY ID 0000010a at 2 IRQ -6 (1:02)解决方案:
- 检查硬件原理图的PHY地址引脚(ADDR[2:0])
- 确认内核配置的phyaddr参数
- 必要时测量PHY芯片ADDR引脚电压
场景2:时钟信号异常
stmmac_hw_setup: failed to init the DMA stmmac_open: Hw setup failed排查步骤:
# 测量时钟信号 cat /sys/kernel/debug/clk/clk_summary | grep ephy # 检查电源 dmesg | grep -i regulator4. 网络性能调优与稳定性测试
调通基础通信后,还需要针对实际应用场景优化参数。
4.1 中断亲和性设置
对于多核Hi3536,可通过以下命令绑定中断:
# 查看中断号 grep eth /proc/interrupts # 设置CPU亲和性 echo 2 > /proc/irq/55/smp_affinity # eth0绑定到CPU1 echo 4 > /proc/irq/56/smp_affinity # eth1绑定到CPU24.2 缓冲区优化配置
建议的ethtool参数调整:
ethtool -G eth0 rx 4096 tx 4096 # 增大环形缓冲区 ethtool -C eth0 rx-usecs 100 # 调整中断延迟 ethtool -K eth0 tso on gso on # 启用硬件分段4.3 长期稳定性测试方案
构建自动化测试脚本:
#!/bin/bash while true; do ping -I eth0 192.168.1.1 -c 1000 -s 1472 -i 0.01 ping -I eth1 192.168.2.1 -c 1000 -s 1472 -i 0.01 iperf3 -c server -t 60 -P 4 -T "ETH0 Test" -B eth0 iperf3 -c server -t 60 -P 4 -T "ETH1 Test" -B eth1 done在项目后期,我们发现当两个网口同时满负载工作时,适当降低MDIO总线频率能提升稳定性。通过修改drivers/net/phy/mdio_bus.c中的MDIO_CLK_DIV值,将默认的42调整为63,PHY寄存器访问成功率从99.2%提升到99.9%。这种细微调整往往需要结合具体硬件设计反复验证。