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)。
- 状态指示与中断:提供链路状态、速度、双工模式等寄存器信息,支持中断上报。
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)是驱动开发中需要重点关注的硬件信号组。这些接口定义了数据、时钟和控制信号的时序规范,驱动代码需要正确配置这些接口的速率和模式。
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接口需要特别注意以下配置:
- 时钟相位调整:RGMII规范要求TX_CLK与数据之间的延迟为0~2ns,实际硬件可能需要通过PHY寄存器或MAC侧的延迟链(DLY)进行微调。
- IO电压匹配:RGMII通常使用2.5V或3.3V的IO电压,需与MAC侧保持一致。
- 复位时序:PHY芯片的复位信号需满足数据手册中的最小脉宽和释放时序,否则可能导致接口初始化失败。
下图展示了MII、GMII、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) | 扩展协商状态 |