4. PHY 节点基础:phy-handle、phy-device、max-speed、broken-turnaround 等属性

PHY(Physical Layer)节点是设备树中描述以太网物理层收发器的关键部分。MAC 节点通过特定的属性与 PHY 节点建立绑定关系,从而完成数据链路层与物理层的连接。本章将详细解析 PHY 节点中最核心的属性,包括绑定句柄、设备实例、速率限制以及兼容性标志。

4.1 phy-handle:MAC 到 PHY 的绑定句柄

phy-handle 是 MAC 节点中最重要的属性之一,它建立了一个从 MAC 控制器到 PHY 设备的引用关系。该属性的值是一个 phandle,指向设备树中某个 PHY 节点的标签。

关键概念: phy-handle 是 MAC 节点与 PHY 节点之间的“桥梁”。没有这个属性,MAC 驱动无法找到对应的 PHY 设备,网络接口将无法正常工作。

典型用法示例:

/* MAC 节点 */
&macb0 {
    status = "okay";
    phy-mode = "rgmii-id";
    phy-handle = &phy0;   /* 引用下方 PHY 节点 */

    phy0: ethernet-phy@0 {
        reg = <0x0>;
        /* ... 其他 PHY 属性 ... */
    };
};

在上例中,phy-handle = &phy0; 将 MAC 节点与标签为 phy0 的 PHY 节点绑定。驱动在解析时,会通过 of_phy_find_device() 或 of_phy_connect() 等 API 获取该句柄对应的 PHY 设备。

4.2 phy-device:内核中的 PHY 设备实例

phy-device 并不是设备树中的直接属性,而是内核在解析 phy-handle 后,在驱动层创建的 phy_device 结构体实例。理解这一点对于区分设备树描述与内核运行时结构至关重要。

概念 层次 说明
phy-handle 设备树(静态描述) MAC 节点中的属性,指向 PHY 节点的 phandle
PHY 节点 设备树(静态描述) 描述 PHY 芯片的寄存器地址、速率、中断等硬件信息
phy_device 内核运行时(动态实例) 内核根据 PHY 节点创建的设备实例,包含驱动绑定、状态机等
开发提示: 在调试时,可以通过 /sys/bus/mdio_bus/devices/ 目录查看系统注册的 phy_device 实例。每个实例对应设备树中的一个 PHY 节点。

4.3 max-speed:速率上限约束

max-speed 属性用于限制 PHY 能够协商的最大链路速率,单位是 Mbps。该属性通常放置在 PHY 节点内部,用于硬件设计上无法支持更高速度的场景。

常见取值:

  • 10 — 限制为 10BASE-T
  • 100 — 限制为 100BASE-TX
  • 1000 — 限制为 1000BASE-T
  • 2500 — 限制为 2.5GBASE-T

示例:

phy1: ethernet-phy@1 {
    reg = <0x1>;
    max-speed = <100>;   /* 强制限制为 100Mbps */
};

当该属性存在时,内核 PHY 驱动在自动协商完成后,会调用 phy_speed_down_core() 检查协商结果是否超过 max-speed,如果超过则降级到该上限值。

注意: max-speed 只限制自动协商的结果上限,不会强制 PHY 工作在固定速率。如果需要固定速率,应使用 fixed-link 子节点。

4.4 broken-turnaround:兼容性标志

broken-turnaround 是一个布尔属性,用于处理某些不符合 IEEE 802.3 标准的 PHY 芯片。在标准的 MDIO 读操作中,PHY 在地址阶段后需要插入一个“转向时间”(Turnaround),但部分 PHY 芯片会跳过或缩短这个时间。

适用场景:

  • 某些国产或低成本的 PHY 芯片
  • 老旧的 PHY 芯片,其 MDIO 实现存在时序偏差
  • FPGA 模拟的 PHY,其 MDIO 控制器实现不完整

设备树写法:

phy2: ethernet-phy@2 {
    reg = <0x2>;
    broken-turnaround;   /* 告知内核该 PHY 存在转向时间缺陷 */
};

当该属性存在时,内核 MDIO 总线驱动会在读操作中调整时序,跳过标准的转向等待,从而正确读取 PHY 的寄存器值。

4.5 PHY 节点属性关系图

下面的 SVG 图展示了 MAC 节点、PHY 节点以及各属性之间的绑定与约束关系:

PHY 节点属性关系图 PHY 节点核心属性关系图 MAC 节点 phy-mode = "rgmii-id" phy-handle PHY 节点 reg = <0x0> max-speed = <1000> 可选属性 broken-turnaround interrupts 内核运行时 phy_device 实例 设备树解析 速率限制流程 协商结果 → 检查 max-speed 超限则降级到上限值

4.6 属性对比与使用场景

属性名 所属节点 类型 作用 是否必需
phy-handle MAC 节点 phandle 绑定 MAC 到 PHY 是(非 fixed-link 时)
reg PHY 节点 u32 PHY 在 MDIO 总线上的地址 是
max-speed PHY 节点 u32 限制最大协商速率 否
broken-turnaround PHY 节点 boolean 兼容非标准 MDIO 时序 否
interrupts PHY 节点 u32 PHY 中断号 否

4.7 完整 PHY 节点示例

以下是一个包含多个属性的完整 PHY 节点示例,展示了实际项目中的典型写法:

/* 设备树中的 PHY 节点 */
&mdio0 {
    status = "okay";

    phy3: ethernet-phy@3 {
        reg = <0x3>;                    /* MDIO 地址 3 */
        max-speed = <1000>;             /* 限制千兆 */
        broken-turnaround;               /* 兼容非标准时序 */
        interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>;
        status = "okay";
    };
};

/* MAC 节点引用 PHY */
&macb1 {
    status = "okay";
    phy-mode = "rgmii-id";
    phy-handle = &phy3;
};
调试技巧: 如果 PHY 无法正确识别,首先检查 reg 属性是否与硬件原理图一致。其次,对于非标准 PHY,尝试添加 broken-turnaround 属性。最后,使用 max-speed 排除速率协商异常。

4.8 常见问题与避坑指南

  • phy-handle 拼写错误: 内核严格区分大小写,phy-handle 不能写成 phy_handle 或 phyhandle。
  • reg 地址冲突: 同一 MDIO 总线上不能有两个 PHY 节点使用相同的 reg 值,否则后注册的 PHY 会失败。
  • max-speed 与 fixed-link 冲突: 如果使用 fixed-link 子节点,max-speed 属性将被忽略,因为固定链接不经过自动协商。
  • broken-turnaround 滥用: 仅当确认 PHY 存在转向时间缺陷时才添加该属性,否则可能导致正常 PHY 的 MDIO 通信异常。