Hi3536双网口调试实录:手把手教你用STMMAC通用驱动点亮YT8511千兆PHY
Hi3536双网口实战通用STMMAC驱动调通YT8511千兆PHY全流程解析当国产PHY芯片遇上嵌入式Linux通用驱动框架如何快速实现双千兆网口的稳定通信本文将带你深入Hi3536平台与YT8511 PHY的硬件协同设计细节通过STMMAC通用驱动完成从硬件验证到内核调优的全过程。不同于官方驱动的移植方案这种标准化接入方式能显著降低后期维护成本特别适合需要快速验证硬件设计的工程师。1. 硬件架构设计与关键信号验证在Hi3536双YT8511方案中硬件设计的合理性直接决定了后续驱动调试的难度。两个PHY芯片通过RGMII接口与主控连接但共享MDIO总线这一设计需要特别注意。1.1 硬件拓扑与管脚复用典型双网口硬件连接方案如下表所示网口PHY型号RGMII接口PHY地址时钟信号复位信号eth0YT8511RGMII00x01EPHY0_CLKEPHY_RSTN0eth1YT8511RGMII10x00EPHY1_CLKEPHY_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 mem1024M consolettyAMA0,115200 phyaddr01 phyaddr102. 内核驱动配置与编译优化STMMAC作为Linux主流MAC驱动已支持大多数通用PHY芯片。正确的内核配置是保证驱动正常工作的前提。2.1 Menuconfig关键选项执行make ARCHarm 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对应eth1CONFIG_STMMAC_PHY2_ID设为0x01对应eth02.2 设备树关键节点示例对于没有预设设备树的内核版本需手动添加rgmii配置mdio { phy0: ethernet-phy1 { compatible ethernet-phy-id0001.0a; reg 1; reset-gpios gpio0 8 GPIO_ACTIVE_LOW; }; phy1: ethernet-phy0 { 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对应eth13.2 常见故障模式与解决场景1PHY地址配置错误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调整为63PHY寄存器访问成功率从99.2%提升到99.9%。这种细微调整往往需要结合具体硬件设计反复验证。