当前位置: 首页 > 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.lryc.cn/news/618468.html

相关文章:

  • Spark on K8s 在vivo大数据平台的混部实战
  • GitLab CI + Docker 自动构建前端项目并部署 — 完整流程文档
  • 【数据结构】并查集:从入门到精通
  • nextTick和setTimeout的区别
  • 卓伊凡谈AI编程:历史、现状与未来展望-以前面向搜索引擎现在面向AI机器人-优雅草卓伊凡
  • IMU量程介绍
  • 悬空标记攻击 -- idekctf 2025 CTFinder
  • [激光原理与应用-255]:理论 - 几何光学 - CCD成像过程
  • 2025牛客暑期多校训练营3(FDJAEHB)
  • 3.8 vue2 devServer配置和 CDN 加载外部资源
  • JavaScript 实现模块懒加载的几种方式
  • Flink Redis维表:Broadcast Join与Lookup Join对比及SQL示例
  • nvm install 14.21.3 时npm 无法下载和识别
  • code-inspector-plugin插件
  • npm、pnpm、yarn区别
  • 【Linux系统】详解Ext2,文件系统
  • RabbitMQ-知识技能图谱(总结篇)
  • 智能家居Agent:物联网设备的统一控制与管理
  • 算法打卡力扣第88题:合并两个有序数组(easy)
  • 第五章 树与二叉树
  • 虚拟机高级玩法-网页也能运行虚拟机——WebAssembly
  • Day24|学习前端CSS
  • AI入门学习--AI模型评测
  • Java集合学习之forEach()遍历方法的底层原理
  • 深度解读 WizTelemetry 2.0:链路追踪如何让分布式系统“无所遁形”
  • 【2025最新版】Java基础知识学习路线图:从入门到精通的系统化指南
  • 深度贴:前端网络基础及进阶(2)
  • 【网络运维】Linux和自动化: Ansible基础实践
  • 【接口自动化】-11-接口加密签名 全局设置封装
  • 回归预测 | Matlab实现CNN-BiLSTM-self-Attention多变量回归预测