实战笔记:从零到一完成裕泰微PHY芯片的驱动适配与设备树集成

张开发
2026/4/7 19:28:23 15 分钟阅读

分享文章

实战笔记:从零到一完成裕泰微PHY芯片的驱动适配与设备树集成
1. 初识裕泰微PHY芯片与开发环境搭建第一次拿到YT8521这颗PHY芯片时说实话有点懵。这个比指甲盖还小的芯片居然要负责整个网络通信的物理层信号转换。我用的开发板是BCM47722L主控通过RGMII接口直连YT8521。这里有个新手容易忽略的点RGMII和SGMII接口的电压匹配。当时我差点烧了芯片后来才发现开发板默认是1.8V电平而YT8521需要3.3V赶紧跳线改了电压选择电阻。开发环境我选择了Ubuntu 20.04 ARM交叉编译工具链。这里有个坑要注意编译器版本必须和SDK匹配。有次我用了gcc 9.x编译结果phy驱动死活加载不上换成SDK推荐的gcc 7.5就正常了。建议先用SDK里的hello world例程验证环境能跑通再搞驱动移植。2. 驱动代码移植与设备树配置2.1 驱动框架理解与封装从GitHub找到的参考驱动代码有2000多行但实际需要移植的核心功能就三个寄存器读写接口初始化配置流程状态检测机制我把它精简封装成phy_drv结构体关键代码如下struct phy_drv yt8521_drv { .phy_type YT8521S, .init yt8521_init, .read_reg yt8521_read_reg, .write_reg yt8521_write_reg, .get_link_status yt8521_get_link_status };特别注意Linux内核的PHY框架已经实现了MDIO总线操作我们只需要实现芯片特定的寄存器操作。有次我傻傻地自己写了全套MDIO驱动结果和内核框架冲突导致系统崩溃。2.2 设备树节点配置设备树配置看似简单实则暗藏玄机。正确的节点配置应该这样phy7 { compatible yutianyue,YT8521S; reg 0x7; yt,phy-mode rgmii; yt,rx-delay-ps 1200; };我踩过的大坑是reg地址设置。最初随便写了个0x1结果phy死活不响应。后来查手册才发现这个地址必须和硬件设计时PHY_ADDR引脚的电平状态一致。用示波器量了半天最终确认要设成0x7。3. 调试过程中的典型问题3.1 RGMII时序问题最折磨人的是rx_delay配置。刚开始网络能通但丢包率高达30%用示波器看RX_CLK和RXD信号发现相位偏差太大。查阅手册发现需要配置内部延迟线对应寄存器0xA001的bit8。调试时可以用这个命令实时调整# 读取当前配置 mdio-tool -r eth0 0xA001 # 设置延迟 mdio-tool -w eth0 0xA001 0x01003.2 寄存器读写异常遇到寄存器读写失败时建议按这个顺序排查确认MDIO总线频率我设成了2.5MHz检查PHY硬件复位信号是否正常验证读写时序是否符合IEEE 802.3标准有次调试发现写寄存器0x03总是失败最后发现是主控的MDIO控制器需要额外配置时钟极性// BCM47722L的特殊配置 mdio_ctrl-config | MDIO_CFG_CLK_INVERT;4. 验证与性能优化4.1 基础功能验证推荐用这套组合拳测试# 查看phy状态 ethtool eth0 # 测试百兆模式 ethtool -s eth0 speed 100 duplex full # 压力测试 iperf3 -c 192.168.1.1 -t 604.2 性能调优技巧通过调整这些参数可以提升吞吐量将TX FIFO深度改为1024字节启用EEE节能模式优化中断聚合参数最终在我的测试环境中YT8521实现了942Mbps的稳定传输速率丢包率低于0.001%。整个过程虽然踩坑不少但收获更大。建议准备开发PHY驱动的同学一定要先吃透芯片手册的时序图和寄存器说明能节省大量调试时间。

更多文章