3. PHY 寄存器概述:地址空间与基本寄存器功能
PHY(Physical Layer)芯片通过一组标准寄存器与 MAC 层或 CPU 进行通信,完成链路状态查询、协商控制、中断管理等功能。IEEE 802.3 标准定义了 PHY 寄存器地址空间的基本框架,其中前 32 个寄存器(地址 0x00–0x1F)为基本寄存器集,后续地址为厂商扩展寄存器。掌握这些寄存器的布局与功能,是进行 PHY 驱动开发和链路调试的基础。
3.1 PHY 寄存器地址空间布局
PHY 寄存器采用 16 位宽度、5 位地址线(共 32 个基本寄存器)的访问模型。标准将地址空间划分为三个区域:
| 地址范围 | 区域类型 | 说明 |
|---|---|---|
| 0x00 – 0x0F | 基本寄存器 | IEEE 802.3 强制定义,包含控制、状态、标识、协商等核心功能 |
| 0x10 – 0x1F | 扩展寄存器 | IEEE 802.3 可选定义,用于扩展状态、特定能力指示 |
| 0x20 – 0xFF | 厂商专用寄存器 | 各 PHY 厂商自定义,用于调试、测试、高级特性控制 |
下图展示了 PHY 寄存器地址空间的整体结构,以及基本寄存器与扩展寄存器的分布关系:
3.2 基本寄存器功能详解
以下重点介绍链路协商与中断调试中频繁使用的 7 个基本寄存器(地址 0、1、4、5、6、17、18、19)。每个寄存器均为 16 位,位定义遵循 IEEE 802.3 标准。
3.2.1 寄存器 0:控制寄存器(BMCR)
BMCR(Basic Mode Control Register)用于配置 PHY 的重置、环回、速度、双工模式以及协商使能。复位值为 0x1000(Auto-Negotiation Enable 位默认置 1)。
| 位 | 名称 | 功能描述 |
|---|---|---|
| 15 | Reset | 软件复位(写 1 触发,自清零) |
| 14 | Loopback | 环回模式使能(1=使能) |
| 13 | Speed Selection (LSB) | 与位 6 组合选择速度:00=10M, 01=100M, 10=1000M |
| 12 | Auto-Negotiation Enable | 自动协商使能(1=使能) |
| 11 | Power Down | 低功耗模式(1=掉电) |
| 10 | Isolate | 电气隔离(1=隔离 MII 接口) |
| 9 | Restart Auto-Negotiation | 重启协商(写 1 触发,自清零) |
| 8 | Duplex Mode | 双工模式(1=全双工,0=半双工) |
| 7–6 | Collision Test / Speed(MSB) | 位 6 与位 13 组合选择速度 |
| 5–0 | Reserved / Vendor Specific | 保留或厂商自定义 |
3.2.2 寄存器 1:状态寄存器(BMSR)
BMSR(Basic Mode Status Register)反映 PHY 的当前能力与链路状态,包括协商完成标志、链路状态、扩展能力等。只读寄存器。
| 位 | 名称 | 功能描述 |
|---|---|---|
| 15 | 100BASE-T4 | 支持 T4 模式 |
| 14 | 100BASE-TX Full Duplex | 支持 100M 全双工 |
| 13 | 100BASE-TX Half Duplex | 支持 100M 半双工 |
| 12 | 10BASE-T Full Duplex | 支持 10M 全双工 |
| 11 | 10BASE-T Half Duplex | 支持 10M 半双工 |
| 10–7 | Reserved | 保留 |
| 6 | MF Preamble Suppression | 管理帧前导码抑制能力 |
| 5 | Auto-Negotiation Complete | 协商完成标志(1=完成) |
| 4 | Remote Fault | 远端故障指示 |
| 3 | Auto-Negotiation Ability | 自动协商能力(1=支持) |
| 2 | Link Status | 链路状态(1=已建立) |
| 1 | Jabber Detect | Jabber 检测 |
| 0 | Extended Capability | 扩展寄存器能力(1=支持 0x10–0x1F) |
3.2.3 寄存器 4:自动协商通告寄存器(ANAR)
ANAR(Auto-Negotiation Advertisement Register)用于通告本端支持的能力(速度、双工、流控等)。对端通过接收此寄存器的内容进行协商匹配。
| 位 | 名称 | 功能描述 |
|---|---|---|
| 15 | Next Page | 下一页使能 |
| 14 | Reserved | 保留 |
| 13–12 | Remote Fault | 远端故障编码 |
| 11–10 | Reserved | 保留 |
| 9 | Pause (Asymmetric) | 非对称流控 |
| 8 | Pause (Symmetric) | 对称流控 |
| 7 | 100BASE-T4 | 通告 T4 能力 |
| 6 | 100BASE-TX Full Duplex | 通告 100M 全双工 |
| 5 | 100BASE-TX Half Duplex | 通告 100M 半双工 |
| 4 | 10BASE-T Full Duplex | 通告 10M 全双工 |
| 3 | 10BASE-T Half Duplex | 通告 10M 半双工 |
| 2–0 | Selector Field | 协议选择器(00001=IEEE 802.3) |
3.2.4 寄存器 5:自动协商链路伙伴能力寄存器(ANLPAR)
ANLPAR(Auto-Negotiation Link Partner Ability Register)只读,反映对端 PHY 通告的能力。通过与 ANAR 进行优先级匹配,确定最终的协商结果。
3.2.5 寄存器 6:自动协商扩展状态寄存器(ANER)
ANER(Auto-Negotiation Expansion Register)提供协商过程的扩展状态信息,包括链路状态变化、并行检测标志等。
| 位 | 名称 | 功能描述 |
|---|---|---|
| 15–5 | Reserved | 保留 |
| 4 | Parallel Detection Fault | 并行检测故障 |
| 3 | LP NP Able | 对端支持下一页 |
| 2 | NP Able | 本端支持下一页 |
| 1 | Page Received | 接收到新页 |
| 0 | LP AN Able | 对端支持自动协商 |
3.2.6 寄存器 17/18/19:扩展状态与厂商专用
这三个寄存器在标准中属于扩展寄存器区域,但在多数 PHY 芯片中用于提供更详细的状态和调试信息:
- 寄存器 17 (Extended Status): 提供 1000BASE-T 的协商状态,包括 Master/Slave 配置、1000M 全双工/半双工能力指示。
- 寄存器 18 (PHY Specific Status): 厂商自定义,常用于读取当前实际协商速度、双工模式、MDI/MDIX 状态。
- 寄存器 19 (PHY Specific Control): 厂商自定义,用于控制中断使能、省电模式、交叉检测等高级功能。
下图展示了基本寄存器在链路协商过程中的数据流向与交互关系:
3.3 寄存器操作注意事项
- 复位自清零: BMCR 的位 15(Reset)和位 9(Restart Auto-Negotiation)均为自清零位,写入 1 后硬件自动清零,软件无需手动清除。
- 锁存位处理: BMSR 的位 2(Link Status)和位 5(Auto-Negotiation Complete)为锁存位,读取操作会清除锁存状态。调试时建议连续读取两次,取第二次的值作为当前状态。
- 协商完成判断: 不要仅依赖 BMSR 位 5,建议同时检查 ANER 位 0(LP AN Able)确认对端支持协商,避免误判。
- 厂商寄存器差异: 寄存器 17/18/19 的功能在不同厂商(如 Broadcom、Marvell、Realtek)之间存在差异,务必查阅对应 PHY 的数据手册。
3.4 寄存器读取代码示例
以下代码演示了通过 MDIO/MDC 总线读取 PHY 基本寄存器的典型流程(基于 Linux 内核 MDIO 子系统):
/* PHY 基本寄存器读取示例 */
#include <linux/mdio.h>
#include <linux/phy.h>
int phy_read_basic_regs(struct phy_device *phydev)
{
int bmcr, bmsr, anar, anlpar, aner;
/* 读取控制寄存器 */
bmcr = phy_read(phydev, MII_BMCR);
if (bmcr < 0)
return bmcr;
/* 读取状态寄存器(连续两次,清除锁存) */
bmsr = phy_read(phydev, MII_BMSR);
bmsr = phy_read(phydev, MII_BMSR);
/* 读取协商通告寄存器 */
anar = phy_read(phydev, MII_ADVERTISE);
/* 读取对端能力寄存器 */
anlpar = phy_read(phydev, MII_LPA);
/* 读取扩展状态寄存器 */
aner = phy_read(phydev, MII_EXPANSION);
/* 打印调试信息 */
phydev_info(phydev,
"BMCR=0x%04x, BMSR=0x%04x, ANAR=0x%04x, ANLPAR=0x%04x, ANER=0x%04x\n",
bmcr, bmsr, anar, anlpar, aner);
/* 检查协商状态 */
if (bmsr & BMSR_ANEGCOMPLETE)
phydev_info(phydev, "Auto-negotiation completed\n");
else
phydev_info(phydev, "Auto-negotiation in progress\n");
return 0;
}