linux Phy驱动开发之mido总线介绍
一、 MDIO 总线概述
1.功能定位
MDIO(Management Data Input/Output)是 IEEE 802.3 定义的串行管理接口,用于 MAC 层与PHY 芯片间的寄存器配置和状态监控,属于物理层(PHY)的核心管理总线。
2.硬件连接
通过 MDC(时钟线)和 MDIO(数据线)实现同步通信,支持最多 32 个 PHY 设备共享总线。
二、 内核框架设计
1.三层抽象模型
1)MII Management 层:抽象为 struct mii_bus
,包含读写函数指针(如
read
/write
)和总线资源
2)PHY Device 层:抽象为 struct phy_device
存储 PHY 的硬件 ID、状态(如速度、双工模式)
3)PHY Driver 层:抽象为 struct phy_driver
,定义驱动匹配表(phy_id
和掩码)及操作函数(probe
、config_init
)。
2.总线匹配机制
MDIO 总线通过 mdio_bus_match()
函数比对phy_device->phy_id
与 phy_driver-
>phy_id_mask
,匹配成功后调用驱动的 probe
函数
三、 关键数据结构与API
1.核心结构体
1)struct mii_bus
:包含总线号、父设备、读写回调函数等
2)struct phy_device
:记录 PHY 地址、链接状态、中断号等硬件信息
3) struct phy_driver
:定义驱动名称、ID 掩码、电源管理回调等
2.注册流程
1)总线注册:mdio_bus_init()
初始化 MDIO 总线类型(mdio_bus_type
)
2)驱动注册:phy_driver_register()
将驱动添加到总线,并关联 probe
函数
四、 设备数据与驱动匹配
1.设备树配置
MDIO 控制器需在设备树中声明,包括寄存器地址、时钟配置等,例如:
mdio {compatible = "fsl,imx6q-mdio";reg = <0x021ec000 0x4000>;#address-cells = <1>;#size-cells = <0>;ethphy0: ethernet-phy@0 {reg = <0>;};
};
PHY 设备通过 reg
属性指定地址
2.匹配流程
1)内核启动时解析设备树,生成 phy_device
对象
2)总线扫描时调用 get_phy_id()
读取 PHY 寄存器 ID,与驱动表匹配
五、 总结
dump_stack+0x18/0x24__mdiobus_register+0x148/0x554 [libphy]__of_mdiobus_register+0xd4/0x440 [of_mdio]xxxx_mdio_probe+0x2d4/0x4bc [xxxx_mdio]platform_probe+0x68/0xc4really_probe+0x148/0x2b0__driver_probe_device+0xcc/0x12cdriver_probe_device+0xd8/0x15c__driver_attach+0x90/0x19c
bus_for_each_dev+0x7c/0xdc
driver_attach+0x24/0x30
bus_add_driver+0xe8/0x1f8
driver_register+0x5c/0x124
__platform_driver_register+0x28/0x34
xxxx_mdio_init+0x20/0x1000 [xxxx_mdio]
在__mdiobus_register中会调用mdiobus_scan_bus_c22的get_phy_device扫描mdio总线的上phy设备并获取的phy设备的id,id与phy设备driver的id匹配上就执行probe