4、PHY芯片基础:PHY的作用、MII/GMII/RGMII/SGMII接口、寄存器标准(IEEE 802.3)
PHY(Physical Layer,物理层)芯片是网络设备中连接数据链路层(MAC)与物理传输介质(网线、光纤)的桥梁。在嵌入式网络开发中,MAC(Media Access Control)控制器通常集成在SoC或FPGA内部,而PHY芯片则作为独立器件放置在板卡上。调试网络驱动时,如果对PHY的作用、接口类型和寄存器标准缺乏系统认知,往往会陷入“MAC配置正确但链路不通”的困境。本章将围绕PHY的核心功能、四种主流MAC-PHY接口协议以及IEEE 802.3定义的寄存器体系展开,帮助读者建立从硬件信号到软件驱动的完整映射关系。
上图展示了MAC与PHY之间的接口选择以及PHY内部的核心功能模块。在实际硬件设计中,接口类型由板卡原理图决定,而驱动开发者必须根据硬件原理图正确配置MAC控制器以匹配对应的接口模式。下面我们将从PHY的作用出发,逐一剖析各接口的时序特征和寄存器操作要点。
4.1 PHY的核心作用与信号链路
PHY芯片在OSI模型第二层(数据链路层)的底部和第一层(物理层)之间工作,承担以下关键职责:
- 数据转换:将MAC发送的并行数据转换为适合在双绞线或光纤上传输的串行差分信号,同时将接收到的串行信号还原为并行数据。
- 链路建立与协商:通过自动协商(Auto-Negotiation)机制与对端设备协商速率(10/100/1000Mbps)和双工模式(半双工/全双工)。
- 信号检测与校正:监测链路状态(Link Status),检测载波侦听(Carrier Sense),执行基线漂移校正、均衡滤波等信号完整性处理。
- 状态上报:通过MDIO(Management Data Input/Output)接口向MAC或CPU报告链路状态、错误计数、协商结果等诊断信息。
从信号链路来看,数据从MAC发出后,经过接口总线(如RGMII)进入PHY的PCS(Physical Coding Sublayer)层进行编码(如1000BASE-T的4D-PAM5编码),再经过PMA(Physical Medium Attachment)层进行并串转换,最后由PMD(Physical Medium Dependent)层驱动差分信号通过磁性变压器耦合到RJ45接口。接收方向则执行完全相反的流程。
4.2 MAC-PHY接口协议详解
MAC与PHY之间的数据传输接口经历了从并行到串行、从单沿到双沿的演进。选择哪种接口取决于系统带宽需求、PCB布局难度和成本约束。下表对比了四种主流接口的关键参数:
| 接口类型 | 数据位宽 | 时钟频率 | 数据速率 | 引脚数量 | 适用场景 |
|---|---|---|---|---|---|
| MII | 4-bit | 25MHz (100M) / 2.5MHz (10M) | 100Mbps | 16 | 早期10/100M以太网 |
| GMII | 8-bit | 125MHz | 1000Mbps | 24 | 千兆以太网,但引脚多、EMI大 |
| RGMII | 4-bit DDR | 125MHz (DDR) | 1000Mbps | 12 | 当前最主流的千兆接口 |
| SGMII | 1-bit SerDes | 1.25GHz | 1000Mbps | 4(差分对) | 高速背板、光纤模块、引脚受限场景 |
4.2.1 MII与GMII:传统并行接口
MII接口使用独立的TX_CLK和RX_CLK,MAC发送数据时,在TX_CLK上升沿采样TXD[3:0]和TX_EN(发送使能)。接收方向,PHY在RX_CLK上升沿驱动RXD[3:0]和RX_DV(接收数据有效)。GMII将数据位宽扩展到8位,时钟提升至125MHz,同时增加了TX_ER和RX_ER错误指示信号。这两种接口的时序相对简单,但引脚数量多,在高速下容易产生信号完整性问题,现代设计已较少直接使用。
4.2.2 RGMII:双沿采样减少引脚
RGMII(Reduced GMII)通过DDR(Double Data Rate)技术,在时钟的上升沿和下降沿各采样4位数据,从而用4根数据线实现8位数据的传输。其关键时序特征为:
- TX_CLK由MAC提供(对于RGMII,时钟方向与MII相反),频率125MHz,上升沿发送TXD[3:0],下降沿发送TXD[7:4]。
- RX_CLK由PHY提供,同样在双沿采样RXD[3:0]。
- 控制信号TX_CTL在上升沿表示TX_EN,下降沿表示TX_ER;RX_CTL同理。
驱动开发中,RGMII最常见的配置错误是时钟延迟(Clock Skew)问题。由于MAC在上升沿发送低4位、下降沿发送高4位,PHY内部需要精确的延迟补偿。许多SoC的MAC控制器提供TXCLK延迟调节寄存器(如延迟2ns),调试时需根据示波器测量结果微调。
// 以某SoC的RGMII TXCLK延迟配置为例(寄存器地址仅为示意)
// 设置TX时钟延迟为1.5ns,以补偿PCB走线偏差
reg_write(MAC_TXCLK_DLY_CTRL, 0x1);
// 使能RX时钟内部延迟,用于采样数据稳定
reg_write(MAC_RXCLK_DLY_CTRL, 0x1);
4.2.3 SGMII:串行化接口
SGMII使用1.25Gbps的SerDes差分对进行数据传输,将并行数据编码为串行码流。它支持10/100/1000Mbps速率自适应,通过内部协商机制在MAC和PHY之间传递速率信息。SGMII的物理层编码采用8b/10b编码,因此实际有效数据带宽为1Gbps。该接口引脚少、抗干扰能力强,常用于连接独立PHY或直接驱动SFP光模块。
4.3 IEEE 802.3寄存器标准与MDIO操作
IEEE 802.3第22条定义了PHY寄存器的标准访问机制——MDIO(Management Data Input/Output),也称为MII管理接口。该接口使用两根线:MDC(管理时钟,最高2.5MHz)和MDIO(管理数据,双向)。通过MDIO可以访问PHY内部0~31号寄存器,其中前6个寄存器有标准定义,其余为厂商自定义。
4.3.1 标准寄存器功能
| 寄存器地址 | 名称 | 关键位定义 | 驱动调试用途 |
|---|---|---|---|
| 0x00 | 控制寄存器 | bit13: 速率选择(0=10M,1=100M,10=1000M) bit12: 自动协商使能 bit8: 全双工模式 bit9: 重启自动协商 | 配置速率、双工、重启协商 |
| 0x01 | 状态寄存器 | bit5: 自动协商完成 bit2: 链路状态(1=已建立) bit1: 链路错误 | 读取链路状态、协商结果 |
| 0x02 | PHY标识符高16位 | OUI编号高16位 | 识别PHY厂商和型号 |
| 0x03 | PHY标识符低16位 | OUI低6位+型号+版本 | 精确匹配驱动 |
| 0x04 | 自动协商通告 | bit9: 1000BASE-T全双工 bit8: 1000BASE-T半双工 bit7: 100BASE-TX全双工 bit6: 100BASE-TX半双工 bit5: 10BASE-T全双工 bit4: 10BASE-T半双工 | 配置本端支持的能力 |
| 0x05 | 自动协商链路伙伴能力 | 与0x04格式相同 | 读取对端能力 |
| 0x06 | 自动协商扩展状态 | bit0: 1000BASE-T全双工协商成功 | 确认千兆协商结果 |
3.3.2 MDIO读写时序
MDIO帧格式包含32位前导码(1连续)、2位起始码(01)、2位操作码(读=10,写=01)、5位PHY地址、5位寄存器地址、2位转向码(读操作时由PHY驱动为00)以及16位数据。驱动实现时通常使用SoC提供的MDIO控制器硬件自动完成帧封装,仅需提供PHY地址、寄存器地址和数据。
// Linux内核中通过mdio总线访问PHY寄存器的典型代码
#include <linux/mdio.h>
#include <linux/phy.h>
// 读取PHY状态寄存器
int val = phy_read(phydev, MII_BMSR); // MII_BMSR = 0x01
if (val & BMSR_LSTATUS) {
pr_info("Link is up\n");
} else {
pr_info("Link is down\n");
}
// 配置PHY为1000M全双工并重启协商
phy_write(phydev, MII_BMCR, BMCR_SPEED1000 | BMCR_FULLDPLX | BMCR_ANENABLE | BMCR_RESET);
4.4 实战案例:RGMII接口千兆链路调试
背景与约束:某工业控制板卡使用i.MX6ULL处理器(内置千兆MAC)搭配Realtek RTL8211F PHY芯片,接口为RGMII。PCB设计时由于布局空间紧张,MAC与PHY之间的RGMII走线长度差达到300mil(约7.6mm),且未做等长处理。系统启动后,网口指示灯亮,但ping网关丢包率100%。
初始现象:使用ifconfig eth0 up命令后,链路状态显示为“Link is up”,但无法获取IP地址(DHCP超时)。通过串口查看内核日志,发现大量“eth0: link up, 1000Mbps, full-duplex”消息,但紧接着出现“eth0: transmit timed out”错误。
分析判断过程:
- 首先通过MDIO读取PHY寄存器0x01,确认bit2(Link Status)为1,说明物理链路已建立。
- 读取寄存器0x00,确认bit13和bit8均为1,即协商为1000M全双工。
- 怀疑RGMII时序问题。使用示波器测量TX_CLK与TXD[3:0]的相位关系,发现上升沿采样窗口内数据不稳定,存在约2ns的建立时间违例。
- 进一步检查PCB走线,发现TX_CLK走线比TXD短约300mil,导致时钟提前到达PHY,数据采样点偏移。
实际操作步骤:
// 步骤1:在设备树中使能MAC的TX时钟延迟功能
// 修改imx6ull.dtsi中的fec1节点
&fec1 {
phy-mode = "rgmii-id"; // 使用内部延迟模式
status = "okay";
};
// 步骤2:在驱动中调整TXCLK延迟(若设备树不支持,可在运行时设置)
// 通过MDIO直接写PHY的RTL8211F特定寄存器(0x1C)的bit4
phy_write(phydev, 0x1C, phy_read(phydev, 0x1C) | (1 << 4));
结果对比:修改后重新编译内核并启动,ping网关延迟稳定在0.3ms以内,iperf3测试吞吐量达到941Mbps(千兆线速的94%)。通过ethtool -S eth0查看,rx_errors和tx_errors均为0。
风险与代价:启用内部延迟虽然解决了当前问题,但该延迟值固定(约2ns),若未来更换PCB或PHY型号,可能需要重新调整。更彻底的解决方案是重新设计PCB,确保RGMII信号组等长(误差±50mil以内)。
4.5 常见误区与设计建议
在PHY驱动开发中,以下问题出现频率最高:
- 误区一:PHY地址配置错误。许多PHY芯片的地址由硬件引脚(如LED0/PHYAD0)决定,默认地址可能为0x00~0x1F。驱动中必须读取PHY ID寄存器(0x02/0x03)确认实际地址,而不是盲目使用0x00。
- 误区二:忽略自动协商超时。自动协商需要约2~3秒完成,驱动初始化时不能立即读取协商结果,应轮询状态寄存器的bit5(Auto-Negotiation Complete),超时时间建议设为5秒。
- 误区三:混淆SGMII与1000BASE-X。SGMII用于MAC-PHY连接,而1000BASE-X用于光纤模块直连。两者虽然物理层相似,但协商机制不同。若将SGMII PHY配置为1000BASE-X模式,会导致协商失败。
- 误区四:忽视PHY复位时序。PHY的硬件复位引脚(RST_N)需要保持低电平至少10ms,释放后还需等待PHY内部初始化完成(通常10ms)。驱动中若在复位后立即访问MDIO,可能读到全0xFF或全0x00。
针对以上问题,建议在驱动初始化流程中严格遵循以下顺序:硬件复位→延时20ms→读取PHY ID→配置能力通告→使能自动协商→等待协商完成→配置MAC接口模式→使能收发。同时,在调试阶段开启内核的PHY驱动调试选项(CONFIG_PHYLIB_DEBUG),通过动态调试信息观察MDIO读写过程。