当前位置: 首页 > news >正文

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 和掩码)及操作函数(probeconfig_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 

         

http://www.dtcms.com/a/327827.html

相关文章:

  • 打印流水号标签
  • 三防手机和防爆手机的本质区别是什么?
  • INSAR数据处理---ENVI5.6(Sarscape)
  • 【从零开始java学习|第三篇】变量与数据类型的关联
  • 秋招笔记-8.9
  • 【网络运维】Linux和自动化: Ansible基础实践
  • SynAdapt:通过合成连续思维链实现大语言模型的自适应推理
  • 机器学习第十课之TF-IDF算法(红楼梦文本分析)
  • 服务器节点技术解析:从架构原理到家庭实践的全维度指南
  • 文件IO函数实现
  • 异或和查询
  • 【报错处理】mount: /boot/efi: unknown filesystem type ‘LVM2_member‘.
  • ARM基础概念 异常处理01 day52
  • 前端项目一键换肤
  • Web 服务详解:HTTP 与 HTTPS 配置
  • SuperMap GIS基础产品FAQ集锦(20250804)
  • Java 中 Set 接口详解:知识点与注意事项
  • LangChain SQLChatMessageHistory:SQL数据库存储聊天历史详解
  • Day05 店铺营业状态设置 Redis
  • MQTTX使用wss的连接报错
  • Java -- List接口方法--遍历--ArrayList的注意事项
  • 贪心----4.划分字母区间
  • 方格网法土方计算不规则堆体
  • [ 前端JavaScript的事件流机制 ] - 捕获、冒泡及委托
  • 少数民族文字OCR识别技术实现及应用场景剖析
  • JMeter并发测试与多进程测试
  • __base__属性
  • ETCD的简介和使用
  • 42.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--扩展功能--集成网关--网关集成认证(一)
  • 1513-map 的三种声明定义方式 使用方式