
1. PHY节点基础配置入门第一次接触设备树中的PHY节点时我完全被那些陌生的属性搞懵了。后来才发现只要掌握几个核心属性就能让PHY芯片正常工作。先来看一个最简单的PHY节点配置示例ethernet-phy0 { compatible ethernet-phy-id0141.0e90; reg 0; interrupt-parent gpio0; interrupts 12 IRQ_TYPE_EDGE_FALLING; };这个配置包含了PHY节点的三个必需属性compatible这是PHY的身份证格式通常是ethernet-phy-idAAAA.BBBB。AAAA对应PHY标识寄存器1的值BBBB对应寄存器2的值。我常用ethernet-phy-ieee802.3-c22作为兼容性回退选项。regPHY在MDIO总线上的地址范围通常是0-31。有一次调试时我把地址设错导致内核死活找不到PHY后来用mdio-tool工具扫描才发现问题。interrupts中断配置需要配合interrupt-parent使用。记得有次没配置中断PHY链路状态变化时系统完全没反应。提示使用mdio-tool -w /dev/mdio0 0x1e 0x0002可以强制PHY进入回环测试模式这对硬件调试特别有用。2. 关键可选属性详解除了必需属性PHY节点还支持许多可选属性来增强功能。最常用的几个属性我整理成了表格属性名作用典型值注意事项max-speed限制PHY最大速率10/100/1000实际速率还受硬件设计限制reset-gpios硬件复位引脚gpio1 4 GPIO_ACTIVE_LOW需要配合reset时序参数reset-assert-us复位保持时间1000(1ms)必须大于PHY规格书要求reset-deassert-us复位释放延时2000(2ms)确保PHY稳定后再操作实际项目中遇到过一个坑某款PHY芯片要求复位信号至少保持10ms但设备树里只配了1ms导致上电后PHY工作不稳定。后来在规格书里找到这个参数修改后问题解决。中断配置也有讲究interrupts 12 IRQ_TYPE_EDGE_FALLING;第二个参数可选IRQ_TYPE_LEVEL_HIGH/LOW电平触发IRQ_TYPE_EDGE_RISING/FALLING边沿触发我曾经用错触发方式导致中断频繁触发系统负载飙升。后来改用边沿触发才恢复正常。3. 高级调优技巧3.1 解决硬件设计问题当PCB设计存在缺陷时这些属性能救命enet-phy-lane-swap; // 交换TX/RX差分对 enet-phy-lane-no-swap; // 禁用自动交换 phy-is-integrated; // 表示PHY与MAC集成遇到过PCB设计把TX/TX-接反的情况当时通过添加enet-phy-lane-swap属性就解决了省去了改板的成本。3.2 节能以太网配置EEE(Energy Efficient Ethernet)相关属性eee-broken-100tx; // 禁用100M EEE eee-broken-1000t; // 禁用1G EEE某次产品功耗测试发现EEE会导致ping时延波动禁用后问题解决。但要注意这会影响节能效果需要权衡。3.3 复位时序优化完整的复位配置示例reset-gpios gpio1 4 GPIO_ACTIVE_LOW; reset-assert-us 15000; // 15ms复位 reset-deassert-us 40000; // 40ms稳定时间建议用示波器测量实际复位时序我曾遇到GPIO控制器驱动延时不准的问题最后通过调整这些值解决。4. 实战案例分析4.1 千兆PHY完整配置phy0: ethernet-phy0 { compatible ethernet-phy-id0141.0e90, ethernet-phy-ieee802.3-c22; reg 0; /* 中断配置 */ interrupt-parent gpio0; interrupts 12 IRQ_TYPE_EDGE_FALLING; /* 复位配置 */ reset-gpios gpio1 4 GPIO_ACTIVE_LOW; reset-assert-us 10000; reset-deassert-us 20000; /* 高级功能 */ max-speed 1000; enet-phy-lane-swap; eee-broken-1000t; };这个配置我在多个项目中验证过稳定可靠关键点复位时间严格遵循PHY规格书明确限制最大速率启用Lane交换补偿PCB设计禁用1G EEE避免时延问题4.2 多PHY管理当系统有多个PHY时建议这样组织mdio { #address-cells 1; #size-cells 0; phy1: ethernet-phy1 { reg 1; /* 配置略 */ }; phy2: ethernet-phy2 { reg 2; /* 配置略 */ }; };调试多PHY系统时我发现给每个PHY添加标签(如phy1、phy2)特别有用在驱动中可以直接通过标签引用。5. 常见问题排查根据我的踩坑经验PHY相关问题90%可以通过以下步骤解决检查MDIO通信mdio-tool -r /dev/mdio0 0x1e # 读取PHY ID如果返回全F说明MDIO通信异常验证中断配置cat /proc/interrupts | grep eth查看中断计数是否增加检查PHY状态ethtool eth0重点看Link detected和Speed查看内核日志dmesg | grep phy曾经有个奇葩问题PHY能识别但无法建立链接最后发现是变压器中心抽头电压不对。这类硬件问题往往需要结合示波器分析。