GitHub: MDIO
Email: BuddyZhang1 buddy.zhang@aliyun.com
目录
专业术语
MDIO 原理
Uboot 中通过工具访问 MDIO
Uboot 中通过源码访问 MDIO
Kernel 中通过源码访问 MDIO
用户空间中通过工具访问 MDIO
用户空间中通过源码访问 MDIO
Arduino 中通过源码访问 MDIO
附录
专业术语
MDIO: Management Data Input/Output.
SMI: Serial Management Interface.
MIIM: Media Independent Interface Management.
MAC: Media Access Control.
PHY: Ethernet physical layer.
MII: Media Independent Interface.
RMII: Reduced media-independent interface.
GMII: Gigabit media-independent interface.
RGMII: Reduced Gigabit media-independent interface.
XGMII: 10-Gigabit media-independent interface.
SGMII: Serial Gigabit media-independent interface.
XAUI: 10 Gigabit Attachment Unit Interface.
RXAUI: Reduced Pin eXtended Attachment Unit Interface.
MDIO 原理
MII
MII 是一个标准接口,用于连接 MAC 和 PHY。MII 是 IEEE-802.3 定义的以太网标准,
MII 接口可以同时控制多个 PHY。
MII 包含两个接口:
一个数据接口,用户 MAC 和 PHY 之间收发 Ethernet 数据
一个管理接口,这个管理接口通常称为 MDIO,MIIM 或者 SMI。这个接口用于 MAC
从 PHY 读取相关管理寄存器的值,或者往 PHY 管理寄存器上写入数据。
原始的 MMI 传输网络数据部分使用两对 4-bit 线 (4 根用于发送数据,4 根用于接收数
据),数据只有 100 Mib/s 的吞吐量。在原始 MII 基础上,拓展支持了衰减信号和增加
速度,当前各种新传输接口:RMII,RGMII,XGMII,SGMII。这些数据信号接口虽然速度
等有所改变,但 MMIM 部分还是共同使用 MIDO 接口进行管理数据的传输。
MDIO
MDIO 也被称为 MIIM,或者 SMI,它是 IEEE802.3 定义标准 MII 接口的一部分,用于
MAC 配置 PHY。MDIO 具有两个信号线,分别如下:
MDC 时钟线:MDIO 的时钟信号,由 MAC 驱动 PHY
MDIO 数据线:双向数据线,用于在 MAC 和 PHY 之间传输配置信息
MDIO 总线只支持 MAC 作为主设备,PHY 作为从设备。MIDO 支持两种时序,分别为
Clause 22 和 Clause 45.
MDIO clause 22
MDIO clause 22 是 MDIO 使用的一种信号时序,在这个信号时序模式,MAC 先向 MDIO
信号线上拍 32 个周期,接着传输 16 bit 的控制位。16 个信号位包含了两个开始位,
2 个访问控制位,5 bits 的 PHY 地址,5 bits 的寄存器地址,以及 2 bits 的翻转位。
当进行写操作的时候,MAC 在接下来的周期中提供地址和数据;当进行读操作的时候,
PHY 会翻转 MDIO 之后向 MDIO 信号线上发送数据。
MDIO Read
MDIO Write
MDIO Clause 45
MDIO 也支持 Clause 45 时序,其是 Clause 22 的拓展协议。与 Clause 22 不同的是,
16 位中的起始位:Clause 22 是 00, 而 Clause 45 是 01.
详细 MDIO Clause 45 和 Clause 22 时序,请查阅:
了解与MDIO/MDC接口相关的22号、45号条款
MDIO Clause 45 And Clause 22
Uboot 中访问 MDIO (SMI/MIIM)
项目开发中,经常要在 uboot 阶段通过 MDIO 总线去配置 PHY 或者 SWITCH。开发者可
以参照本节内容,通过源码或者工具去访问 MDIO 总线。
工具访问 MDIO
uboot 提供了 mii 工具去操作 MDIO 总线,用法如下:
列出可用的网卡
mii device 命令可以列出所有可用的网卡,命令模式如下:
例如,Soc 上可用的网卡:
列出 PHY 信息
当找打可用的网卡之后,可以使用 “mii info” 命令查看 PHY 相关的信息,命令模式如
下:
MDIO 读
mii read 命令可以进行 MDIO 读操作,该操作可以访问 PHY 或 SWITCH 的寄存器,
命令模式如下:
例如,Soc 的 MDIO 0 总线上包含一个 MV88e6185 PHY,PHY ID 寄存器地址为 0x2 和
0x3,通过 mii 工具读操作如下:
MDIO 写
mii write 命令可以进行 MDIO 写操作,该操作可以写 PHY 或 SWITCH 的寄存器,
命令模式如下:
例如,向 MDIO 0 上,PHY 0 的 0x16 寄存器写值,该寄存器是切页寄存器:
Uboot 源码访问 MDIO
有时项目需求,需要在 uboot 源码中访问 MDIO,开发者可以参考下面代码进行 MDIO
操作:
Kernel 中访问 MDIO
内核中 MDIO 的驱动一般和 PHY 驱动或者网卡驱动一同使用,开发者可以参考下面驱动
模型来使用 MDIO
Makefile
上述源码可以之间编译到内核源码树或外部编译,外部编译适用如下命令:
MDIO 驱动模型分析
内核为 MDIO 子系统提供了以下接口供 MDIO 的分配,注册,释放,和销毁的操作。当
MDIO 注册成功,网卡或 CPU 的 MAC 就可以通过 MDIO 总线去配置 PHY 或者 SWITCH。
mdiobus_alloc() 分配一个 mdio bus 结构
mdiobus_free() 释放一个 mdio bus
mdiobus_register() 注册一个 mdio bus
mdiobus_unregister() 注销一个 mdio bus
用户空间工具访问 MDIO (SMI/MIIM)
用户空间提供了多个工具操作 PHY,例如 mii-diag, mii-tool 和
ethtool,这些工具都可以操作一个可用的 PHY。使用如下:
mii-diag
用户空源码间访问 MDIO (SMI/MIIM)
用户空间在源码中直接访问 MDIO 的方法比较难找,但这里提供了一个思路,开发者可以
参照这个源码,就可以在用户空间操作 MDIO 总线。
首先,开发者可以编译一个内核驱动,然后这个驱动将 MDIO 总线导出到用户空间,源码
如下:
Makefile
将上面的源码编译进内核之后,开发者可以在用户空间按如下方法对 MDIO 进行读写操
作。
MDIO 读
MDIO 读命令格式如下:
例如,从 PHY 0 上读取 ID 寄存器
MDIO 写
MDIO 写命令格式如下:
例如,往 PHY 0 的 22 号寄存器上写值
Dump 操作
将所有 PHY 的所有寄存器都 Dump 出来,命令模式如下:
Arduino 上访问 MDIO
Arduino 上访问 MDIO 的方法可以拓展到 MCU 上访问 MDIO 的方法。这里使用硬件的方
式,通过直接拍周期信号产生 MDIO 的读写时序。开发者可以参照如下代码:
Arduino 可以作为一个 MDIO调试器,加速网卡,PHY,SWITCH 等外部调试的速度。
附录
Media-independent interface
Management Data Input/Output
MDIO Clause 22 and 45
BiscuitOS Home
BiscuitOS Driver
BiscuitOS Kernel Build
Linux Kernel
Bootlin: Elixir Cross Referencer
本文章由作者:佐须之男 整理编辑,原文地址: uboot、内核、用户态MDIO (SMI/MIIM)研究心得
本站的文章和资源来自互联网或者站长的原创,按照 CC BY -NC -SA 3.0 CN协议发布和共享,转载或引用本站文章应遵循相同协议。如果有侵犯版权的资 源请尽快联系站长,我们会在24h内删除有争议的资源。欢迎大家多多交流,期待共同学习进步。