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 时,建议先读取寄存器 0x02(PHY ID High)和 0x03(PHY ID Low),确认 PHY 型号与驱动匹配,再操作其他寄存器。

下图展示了 PHY 寄存器地址空间的整体结构,以及基本寄存器与扩展寄存器的分布关系:

PHY 寄存器地址空间结构 基本寄存器 0x00 – 0x0F IEEE 802.3 强制 控制 / 状态 / 标识 协商 / 中断 / 链路 共 16 个寄存器 扩展寄存器 0x10 – 0x1F IEEE 802.3 可选 扩展状态 能力指示 共 16 个寄存器 厂商专用寄存器 0x20 – 0xFF 厂商自定义 调试 / 测试 高级特性控制 最多 224 个寄存器 说明:基本寄存器是 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 保留或厂商自定义
调试示例: 强制设置 100M 全双工(关闭协商)时,写入 BMCR = 0x2100(位 13=1, 位 12=0, 位 8=1)。读取 BMCR 确认写入是否生效,常用于排查协商失败问题。

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)
注意: 位 2(Link Status)是锁存位——链路断开时清零,重新建立后不会自动置位,必须通过读取操作清除锁存。调试时建议连续读取两次,第二次的值才是当前真实链路状态。

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 进行优先级匹配,确定最终的协商结果。

调试技巧: 当协商失败时,分别读取本端 ANAR(寄存器 4)和对端 ANLPAR(寄存器 5),对比双方通告的能力集。常见失败原因:一方只通告 100M 全双工,另一方只通告 10M 半双工,无交集导致协商失败。

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): 厂商自定义,用于控制中断使能、省电模式、交叉检测等高级功能。
实战建议: 在调试链路中断触发问题时,寄存器 18 和 19 往往是关键突破口。例如,通过寄存器 19 使能链路变化中断,再通过寄存器 18 读取中断状态位,可以快速定位中断源。

下图展示了基本寄存器在链路协商过程中的数据流向与交互关系:

基本寄存器在链路协商中的交互流程 本端 PHY BMCR (Reg 0) → 配置 BMSR (Reg 1) → 状态 ANAR (Reg 4) → 通告 对端 PHY ANLPAR (Reg 5) → 能力 ANER (Reg 6) → 扩展 状态反馈 协商结果 速度 / 双工 / 流控匹配 调试入口:读取 BMSR 位 5(协商完成)→ 读取 ANLPAR 对比 ANAR → 检查 ANER 位 4(并行检测故障)

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 的数据手册。
常见陷阱: 某些 PHY 在协商过程中 BMSR 位 2(Link Status)会短暂置 0,此时读取 ANLPAR 可能返回无效数据。正确做法是等待 BMSR 位 5 置 1 后,再读取 ANLPAR 获取对端能力。

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;
}
代码要点: 注意 BMSR 的两次读取操作——第一次用于清除锁存,第二次获取真实状态。这是 PHY 驱动开发中极易忽略的细节。