1. PHY基础概念

1.1 PHY芯片在以太网中的角色

PHY(Physical Layer Transceiver)是以太网通信中连接数字链路层与物理介质的核心器件。它负责将MAC层送出的数字信号编码为适合在铜缆、光纤等介质上传输的模拟信号,同时从介质接收模拟信号并解码为数字比特流交给MAC层。

在嵌入式系统中,PHY芯片通常作为独立芯片或集成在SoC内部,承担以下关键职责:

  • 信号编码/解码:实现4B/5B、8B/10B、MLT-3、PAM5等线路编码。
  • 时钟恢复与同步:从接收信号中提取时钟,实现位同步。
  • 链路协商(Auto-Negotiation):自动协商两端设备支持的最高速率和工作模式。
  • 电气特性适配:驱动电平、阻抗匹配、线缆交叉检测与自动翻转(Auto MDI/MDIX)。
  • 状态指示与中断:提供链路状态、速度、双工模式等寄存器信息,支持中断上报。
调试要点: 驱动开发中90%的PHY问题集中在链路协商失败、寄存器读写异常和中断处理缺失。理解PHY的角色是定位这些问题的前提。

1.2 OSI模型中的物理层与数据链路层边界

在OSI七层模型中,以太网跨越了物理层(Layer 1)和数据链路层(Layer 2)。PHY芯片位于物理层,而MAC(Media Access Controller)位于数据链路层的MAC子层。两者之间的接口定义了明确的边界:

OSI层 以太网子层 功能 典型芯片
Layer 2 数据链路层 LLC(逻辑链路控制) 复用/解复用上层协议 软件实现
Layer 2 数据链路层 MAC(介质访问控制) 帧封装、地址过滤、CSMA/CD MAC控制器(集成在SoC或独立芯片)
边界接口 MII/GMII/RGMII MAC与PHY之间的数字数据通道 PCB走线连接
Layer 1 物理层 PCS(物理编码子层) 线路编码、符号对齐 PHY芯片
Layer 1 物理层 PMA(物理介质附加子层) 串行化/解串行、时钟恢复
Layer 1 物理层 PMD(物理介质相关子层) 信号驱动、电气接口

MAC与PHY之间的边界接口(MII/GMII/RGMII)是驱动开发中需要重点关注的硬件信号组。这些接口定义了数据、时钟和控制信号的时序规范,驱动代码需要正确配置这些接口的速率和模式。

概念澄清: 在Linux内核中,net_device 结构体代表网络设备,而 phy_device 结构体代表PHY芯片。驱动开发中需要同时管理这两个层次,并通过 phy_connect() 或 of_phy_connect() 建立关联。

1.3 MII/GMII/RGMII接口介绍

MAC与PHY之间的接口标准决定了数据传输的带宽、引脚数量和时序复杂度。以下是三种最常用的接口:

接口标准 数据宽度 时钟频率 最大速率 引脚数(约) 适用场景
MII (Media Independent Interface) 4位 25 MHz (100M) / 2.5 MHz (10M) 100 Mbps 16~18 10/100M以太网
GMII (Gigabit MII) 8位 125 MHz 1000 Mbps 24~26 千兆以太网
RGMII (Reduced GMII) 4位(DDR双沿采样) 125 MHz (DDR) 1000 Mbps 12~14 千兆以太网(引脚少)

MII 是IEEE 802.3u定义的原始标准接口,包含独立的4位发送和接收数据总线,以及TX_CLK、RX_CLK、TX_EN、RX_DV等控制信号。其引脚数量较多,在PCB布局中占用较大面积。

GMII 将数据总线扩展到8位,时钟频率固定为125 MHz,支持千兆速率。但24个以上的引脚在高速设计中带来信号完整性和布线挑战。

RGMII 是目前嵌入式系统中最广泛采用的千兆接口标准。它通过以下方式减少引脚:

  • 数据总线缩减为4位,利用时钟的双沿(上升沿和下降沿)各采样4位,等效8位传输。
  • TX_CLK和RX_CLK各使用一个时钟引脚,不再区分高/低字节时钟。
  • 控制信号复用:TX_EN与TX_ER合并,RX_DV与RX_ER合并。

下图展示了RGMII接口在MAC与PHY之间的连接结构:

RGMII接口连接结构 MAC控制器 (SoC集成) TX_CLK TX_CTL TXD[3:0] RX_CLK RX_CTL RXD[3:0] PHY芯片 (外部独立) TX_CLK TX_CTL TXD[3:0] RX_CLK RX_CTL RXD[3:0] RGMII使用4位数据总线+DDR双沿采样,等效8位传输,引脚数仅为GMII的一半

在驱动开发中,RGMII接口需要特别注意以下配置:

  • 时钟相位调整:RGMII规范要求TX_CLK与数据之间的延迟为0~2ns,实际硬件可能需要通过PHY寄存器或MAC侧的延迟链(DLY)进行微调。
  • IO电压匹配:RGMII通常使用2.5V或3.3V的IO电压,需与MAC侧保持一致。
  • 复位时序:PHY芯片的复位信号需满足数据手册中的最小脉宽和释放时序,否则可能导致接口初始化失败。
常见调试陷阱: RGMII接口的时钟相位问题是最常见的链路不通原因之一。如果PHY无法建立链路,首先检查TX_CLK与TXD之间的相对延迟,使用示波器测量或通过PHY寄存器调整延迟值。

下图展示了MII、GMII、RGMII三种接口在引脚数量和速率上的对比关系:

MII / GMII / RGMII 接口对比 MII 4位数据总线 ~18引脚 | 100 Mbps GMII 8位数据总线 ~26引脚 | 1000 Mbps RGMII 4位+DDR双沿 ~14引脚 | 1000 Mbps 接口选型建议 • 10/100M 低成本设计:优先选择MII,引脚多但时序宽松 • 千兆设计且引脚充足:GMII提供最直接的8位并行接口 • 千兆设计且PCB面积受限:RGMII是当前嵌入式主流选择

1.4 PHY寄存器与MDIO管理接口

PHY芯片的配置和状态读取通过MDIO(Management Data Input/Output)总线完成。MDIO是IEEE 802.3定义的串行管理接口,包含两根信号线:

  • MDC(Management Data Clock):时钟信号,由MAC或专用控制器提供,最高频率通常为2.5 MHz。
  • MDIO(Management Data Input/Output):双向数据线,用于读写PHY寄存器。

每个PHY芯片在MDIO总线上拥有唯一的5位地址(PHY ADDR),范围0~31。驱动通过SMI(Serial Management Interface)协议帧与PHY通信:

/* MDIO 读写帧格式(简化) */
/* 读操作:前导码 + 起始码(01) + 操作码(10) + PHY_ADDR(5bit) + REG_ADDR(5bit) + 转向(2bit) + 数据(16bit) */
/* 写操作:前导码 + 起始码(01) + 操作码(01) + PHY_ADDR(5bit) + REG_ADDR(5bit) + 转向(2bit) + 数据(16bit) */

/* Linux内核中PHY寄存器读写示例 */
#include <linux/phy.h>

int phy_read(struct phy_device *phydev, u32 regnum);
int phy_write(struct phy_device *phydev, u32 regnum, u16 val);

PHY芯片内部包含一组标准寄存器(IEEE 802.3定义的基本寄存器)和厂商特定的扩展寄存器。基本寄存器包括:

寄存器地址 名称 功能描述
0 BMCR (Basic Mode Control Register) 控制复位、回环、速率选择、双工模式、协商使能
1 BMSR (Basic Mode Status Register) 指示链路状态、协商完成、支持的能力
2 PHY ID Register 1 (OUI高16位) 厂商OUI标识
3 PHY ID Register 2 (OUI低6位+型号+版本) 芯片型号与版本号
4 ANAR (Auto-Negotiation Advertisement Register) 广播本端支持的能力(速率、双工)
5 ANLPAR (Auto-Negotiation Link Partner Ability Register) 读取对端广播的能力
6 ANER (Auto-Negotiation Expansion Register) 扩展协商状态
调试技巧: 在驱动初始化阶段,通过读取寄存器2和3可以确认MDIO总线通信是否正常。如果读取到的PHY ID为0xFFFF或0x0000,通常表示MDIO时序或PHY地址配置错误。