以太网 MDIO 接口的功能说明
MDIO(管理数据输入输出)接口的主要作用是配置网络物理层芯片(PHY)的工作状态,具体包括:
自动协商功能 通过读写 PHY 芯片的内部寄存器,自动匹配网络设备间的通信参数(如速率、双工模式等)。
PHY 芯片识别 通过地址识别确定连接的 PHY 芯片型号,确保后续配置操作针对正确的设备。
MDIO 数据帧类型分为两种:
Clause 22:用于百兆和千兆以太网设备
Clause 45:专为千兆以上高速以太网设计
简单来说,MDIO 就像一个"配置助手",负责根据网络需求自动设置 PHY 芯片的工作参数,并通过不同协议(Clause 22/45)适配不同速度的网络设备。
一、Clause 22
Clause 22 简介 Clause 22 是最基础的 MDIO 通信协议,也叫 MDC/MDIO 协议。它通过两根线工作:
MDC 线:提供时钟信号
MDIO 线:传输数据
主要特点
速度低:最快 25MHz,实际常用速度为 2.5MHz(即 2.5Mbps)
设备数量:最多可连接 32 个网络物理层芯片(PHY)
简单通用:电路设计简单,成本低,被大多数以太网设备广泛使用
优势 ✅ 经过长期验证,稳定性好,适用于传统网络设备 ✅ 硬件实现容易,生产成本比新协议更低
二、Clause 45
Clause 45 是 IEEE 802.3an 标准推出的新协议,主要特点包括:
四线通信:使用 MDC、MDIO 两根基础信号线,以及扩展的数据和时钟信号线。
高速传输:数据传输速度最高可达 1 GHz,满足高带宽需求。
功能增强:支持远程设备管理、复杂控制等高级操作。
多设备支持:可管理最多 128 个物理设备(PHY),适合大规模网络部署。
优势:
速度快:适合需要高速传输的场景,如数据中心或高清视频传输。
扩展性强:能同时管理大量设备,特别适合大型网络或数据中心环境。
简单来说,它就是一款更快、更智能的通信协议,能高效管理更多设备并传输更大数据量。
三、Clause 22 vs. Clause 45
- MDIO(管理数据输入输出)是一种两线制的通信总线,专门用于配置网络设备中的物理层芯片(PHY 芯片)。它的运作方式如下:
线缆构成
一条是数据线(MDIO),负责双向收发数据
另一条是时钟线(MDC),为数据传输提供同步时钟,速度通常在几兆赫兹(不同芯片可能有差异)
数据传输方式 数据传输严格跟随 MDC 时钟信号同步进行,就像时钟滴答声控制数据的发送和接收节奏。
协议演变
早期使用 Clause 22 协议,但它的寄存器数量有限
后来升级为 Clause 45 协议,增加了更多寄存器空间,同时能兼容旧版 Clause 22 设备
简单来说,MDIO 就像一条双车道数据公路,其中一条车道负责运输数据,另一条车道提供导航信号。而协议的升级则像是拓宽了公路并保留了旧路标识,让新老车辆都能通行。

四、Clause 22 数据帧格式

STA:Station ManagementMMD:MDIO Managed DevicePRE:帧前导码,为32个连续 “1” 比特。ST:帧开始标志,Clause 22的开始标志为比特 “01”。OP:操作码,CL22中比特 “10” 表示此帧为一读操作帧,比特 “01” 表示此帧为一写操作帧。PHYAD:MMD的物理地址,5个比特,每个MMD都把自己的地址与这5个比特进行比较,若匹配则响应后面的操作,若不匹配,则忽略掉后面的操作。REGAD:用来选MMD的32个寄存器中的某个寄存器的地址。TA:状态转换域,若为读操作,则第一比特时MDIO为高阻态,第二比特时由MMD使MDIO置 “0”。若为写操作,则MDIO仍由STA控制,连续输出 “10” 两个比特。DATA:帧的寄存器的数据域,16比特,若为读操作,则为MMD送到STA的数据,若为写操作,则为 STA 送到 MMD 数据。IDLE:帧结束后的空闲状态,此时MDIO无源驱动,处高阻状态。
clause 22 里面的 PHYAD 通常由 PHY 设备的硬件配置去决定的,值大小为 0-31. 注意 PHYAD 与 PHY ID 不要弄混了。 其中 phy_addr 可以通过 ethtool eth0 获取 PHYAD 值:
五、Clause 45 数据帧格式

STA:Station ManagementMMD:MDIO Managed DevicePRE:帧前导码,为32个连续 “1” 比特。ST:帧开始标志, 为了区别CL22,Clause 45的开始标志为比特 “00”。OP:操作码,Clause 45有 4 种操作码,比特 “00” 表示设置当前寄存器地址,比特 “01” 表示写当前寄存器。比特 “11” 表示读当前寄存器,比特 “11” 表示读当前寄存器读完后把当前寄存器的值加1,用于顺序读。PRTAD:Port Address,端口地址, 也称物理地址。DEVAD:器件地址,CL45新增概念,各值与器件对应如下。REGAD:用来选MMD的65536个寄存器中的某个寄存器的地址。TA:状态转换域,若为读操作,则第一比特时MDIO为高阻态,第二比特时由MMD使MDIO置 “0”。若为写操作,则MDIO仍由STA控制,连续输出 “10” 两个比特。DATA:帧的寄存器的数据域,16比特,若为读操作,则为MMD送到STA的数据,若为写操作,则为STA送到MMD数据。IDLE:帧结束后的空闲状态,此时MDIO无源驱动,处高阻状态。
六、如何通过 Clause 22 方式访问 Clause 45

这种间接的访问方式,其实通过 REG13 和 REG14 的配合访问,类似 C 语言的指针。

例如访问:device1, reg2 的内容 第一步,设置 REG13,其中 bit15:14 = 0:0 表示这是地址,device 对应 device=1 第二步,把需要操作的寄存器 reg=2 的地址写入 REG14 第三步,设置 REG13,其中 0x4000 表示 bit 15:14 = 0:1 表示这个是数据,并且地址不增加。 第四步,直接读取 REG14,相当于间接读了 REG2 的内容,就是 REG2 的内容了。
device = 1;
reg = 2;
mdiobus_write(bus, addr, 0xd, device)
mdiobus_write(bus, addr, 0xe, reg)
mdiobus_write(bus, addr, 0xd, 0x4000 + device)
phy_id[i] = mdiobus_read(bus, addr, 0x0e) & 0xffff;2
3
4
5
6