前三篇文章完成了mdio子系统概述、mdio子系统驱动模型概述、mii_bus子模块方法及驱动实现分析,本篇文章我们主要进行mdio总线驱动实现分析、phy驱动实现分析等部分,涉及的内容如下:

一、mdio总线实现及相应方法分析

二、phy驱动实现相应方法的分析

三、phy驱动开发步骤说明

一、mdio总线实现及相应方法分析

既然mdio子模块属于总线型驱动,因此mdio子模块也是继承于linux设备-总线-驱动模型,从而实现自己的驱动模型,这在第二篇文章中也已经进行了说明,但第二篇文章主要介绍数据结构间的关联,本篇我们将介绍实现mdio总线、phy驱动等数据结构间关联的方法。下面我们看下mdio总线的定义及相应驱动接口的定义说明。

mdio_bus_type定义及说明

如下为mdio_bus_type的定义,mdio总线的实现相对也比较简单,连probe、remove接口都没有实现,而直接由phy_driver->probe/remove接口进行实现,mdio_bus_type主要实现如下两个功能:

  1. 定义dev_atrrs变量,针对所有注册在mdio_bus_type上的phy_device,均会创建该dev_attrs上定义的属性文件,该属性文件的名称为phy_id,该属性文件为只读属性文件,可获取该phy_device的phy id;
  2. 定义了match方法,用于进行phy_device、phy_driver的匹配检测操作。

mdio总线的device、driver注册与注销相关方法的实现流程说明

由于mdio_bus_type没有提供probe、remove方法,因此针对mdio_bus_type而言,其device、driver的注册与注销方法的处理流程有些许的不同。针对linux设备-总线-驱动模型而言,其提供了device_register/driver_register、device_unregister/driver_unregister方法,用于进行设备与驱动绑定与解绑操作,从而实现设备的探测与移除操作。如下图为mdio总线实现中device_register/driver_register、device_unregister/driver_unregister接口的处理流程如下图所示。

  1. 针对device_register/driver_register而言,主要涉及将device、driver添加至mdio_bus_type,并进行device与driver的匹配检测,待匹配成功后,则通过driver->probe接口最终调用phy_driver->probe接口(这一点可以理解为面向对象中的多态,而phy_driver为device_driver的子类,即通过父类device_driver->probe方法调用至子类phy_driver->probe方法)。
  2. 针对device_unregister/driver_unregister而言,主要用于将device或driver从mdio_bus_type上移除,并调用driver->remove接口实现移除工作(而driver->remove接口最终调用phy_driver->remove接口(这一点可以理解为面向对象中的多态,而phy_driver为device_driver的子类,即通过父类device_driver->remove方法调用至子类phy_driver->remove方法)

mdio总线的match方法说明

mdio总线的match方法为mdio_bus_match,mdio_bus_match的实现流程如下图所示,其主要实现如下三方面的匹配检测功能:

  1. 先进行设备树驱动模型的支持(若系统支持设备树,则先调用该接口进行匹配检测,主要是将phy_driver与phy_device设备树节点的compatible变量进行匹配检测),若匹配则返回匹配成功;
  2. 若a没有匹配成功,则确认phy_driver是否提供了匹配检测方法,若提供匹配检测方法,则再次进行匹配检测,若匹配成功,则返回成功;
  3. 若以上均没有匹配成功,则判断phy_device的phyid与phy_driver支持的phyid进行匹配检测,若匹配成功则返回成功。

phy驱动实现相应方法的分析

在前面我们也说了,可以将phy_driver理解为device_driver的子类,并实现了probe、remove接口,用以实现上一章节所说的多态。若下图所示,即为phy_driver与device_driver关联,针对phy_device与phy_driver而言,也提供了phy_device与phy_driver的注销方法,分别为phy_device_register、phy_drivers_register、phy_driver_unregister(因phy_device的注册是由mii_bus注册时通过调用mdiobus_register时完成phy_device的注册的,因此phy_device的注销也是在mdiobus_unregister中完成了,因此mdio子系统没有额外定义phy_device的注销接口)。

phy_device_register、phy_drivers_register接口分析

下图是这两个接口的处理流程图,下面进行详细说明:

针对phy_driver_register,主要完成如下工作:

  1. 设置phy_driver->driver的probe为phy_probe、remove为phy_remove,所依附的总线为mdio_bus_type,从而可将该phy_driver注册至mdio总线上;
  2. 调用driver_register接口,将该phy_driver->driver注册至mdio总线上,而关于driver_register的调用流程已经在上述mdio总线的device、driver注册与注销方法中说明。

针对phy_device_register而言,主要完成工作如下:

  1. 若phy_device已经与mii_bus完成绑定,则返回失败;
  2. 若该phy_device需要进行fixup,则调用phy_scan_fixups进行修正,一般在phy 芯片存在errata时,才进行修正;
  3. 调用device_add将该phy_device->dev注册至mdio总线(在调用phy_device_create创建一个phy_device时,已经设置phy_device->dev.bus为mdio_bus_type,因此在phy_device_register中无需再设置phy_device->dev.bus)

针对phy_device_register、phy_driver_register接口而言,也就是对device_register、driver_register的封装,以便作为mdio子模块的phy_device、phy_driver的注册接口

phy_driver_unregister接口分析

该接口就是对driver_unregister的封装,此处不再赘述。

三、phy驱动开发步骤说明

针对phy 驱动而言,主要实现两部分的内容:

  1. 实现probe、remove、suspend、resume接口,用于完成phy_driver的注册与注销,以及针对linux设备-总线-驱动模型的基础;
  2. 实现phy device处理相关的接口config_init、config_aneg、read_status、ack_interrupt、config_intr、did_interrupt、match_phy_device、ts_info、hwtstamp、rxtstamp、txtstamp、set_wol、get_wol。
  3. 其中config_init主要是对phy device进行一些初始化配置;
  4. 而config_aneg、read_status主要用于设置phy device的自适应机制已经获取phy的状态(主要用于获取适配速率、双工模式等),一般这两个接口直接使用genphy_config_aneg、genphy_read_status即可,触发该phy device有特殊的定义;
  5. 而ack_interrupt、config_intr、did_interrupt主要用于phy device的link up/down相关的中断处理,这个与具体的phy device有关,查看相应的芯片手册说明即可;
  6. 而针对ts_info、hwtstamp、rxtstamp、txtstamp、set_wol、get_wol主要是时间戳相关的处理,大多数phy device均不需实现这几个接口。
  7. match_phy_device主要用于实现phy_device与phy_driver的匹配检测,若一个phy_driver支持多个类型的phy_device,则最好实现该接口,若该phy_driver只适配某一个型号的phy_device,则不需要实现该接口,只需要设置支持的phy_id与phy_mask即可。

以上即是实现phy driver的大体步骤,一般情况下若phy device不是很特殊,完全可以不实现phy driver,而在mdiobus_register时针对没有匹配phy_driver的设备,会将其与genphy_driver进行绑定,而genphy_driver基本上对大多数phy device而言,均可以正常驱动。但若我们仅需要在phy driver的probe接口中进行一些配置(如设置phy device的led mode 等),则完全可以将config_ange、read_status等接口使用genphy_driver中的接口,仅实现probe接口即可。

以上便是本篇文章的主要内容,主要介绍mdio_bus_type的定义;phy_device与phy_driver的注册与注销流程以及phy_driver编写需实现的接口等内容,下一篇文章主要介绍mdio模型实现的phy 状态机,以及phy_device与net_device的绑定与解绑相关的内容。

Linux Mii management/mdio子系统分析之四 mdio总线及phy驱动模型及其开发流程相关推荐

  1. 智能分析网关微信端告警消息推送的开发流程

    智能分析网关是TSINGSEE青犀视频研发的AI边缘计算智能硬件设备,它具有AI智能检测与识别的能力,可对视频及图像中的人.车.物体.行为等进行检测识别与定位.追踪.统计,具体可包括人脸检测与识别.车 ...

  2. LINUX IIO子系统分析之四 IIO EVENT介绍

    上一章我们介绍了iio子系统中的iio trigger模块,本章我们将介绍iio event模块,iio event主要用于阈值监测.自由落体监测等监测功能.因为IIO EVENT涉及IIO DEVI ...

  3. linux内核分为子系统,Linux内核内存管理子系统分析【转】

    还是那张熟悉的老图:Linux内核子系统简介(由七个部分组成) Linux内存管理模型: 1. 内存管子系统职能: 1>  管理虚拟地址与物理地址的映射 2>  管理物理内存的分配 2. ...

  4. 【分析笔记】Linux 4.9 backlight 子系统分析

    相关信息 内核版本:Linux version 4.9.56 驱动文件:lichee\linux-4.9\drivers\video\backlight\backlight.c 驱动作用 对上,面对应 ...

  5. LINUX IIO子系统分析之五IIO BUFFER子模块实现分析

    上一章我们介绍了iio子系统中的iio event模块,本章我们将介绍iio buffer模块,iio buffer主要用于连续数据采集与缓存功能.IIO buffer模块借助IIO DEVICE字符 ...

  6. linux RTC 驱动模型分析

    linux RTC 驱动模型分析 RTC(real time clock)实时时钟,主要作用是给Linux系统提供时间.RTC因为是电池供电的,所以掉电后时间不丢失.Linux内核把RTC用作&quo ...

  7. LINUX SPI设备驱动模型分析之二 SPI总线模块分析

    上一篇文章我们简要介绍了SPI驱动模块,本章我们详细说明一下spi总线.设备.驱动模块的注册.注销以及这几个模块之间的关联. SPI总线的注册 spi模块也是基于LINUX设备-总线-驱动模型进行开发 ...

  8. Linux Phy 驱动解析

    文章目录 1. 简介 2. phy_device 2.1 mdio bus 2.2 mdio device 2.3 mdio driver 2.4 poll task 2.4.1 自协商配置 2.4. ...

  9. Linux phy驱动开发总结

    文章目录 基础 须知 数据结构 数据结构UML类图 MAC驱动 初始化简述 驱动实现 关于MAC连接PHY PHY驱动 动态注册 静态注册 通用PHY 参考模板 IP18xx驱动调试 须知: 问题 方 ...

  10. char添加一个字符_LINUX字符设备驱动模型分析(起始篇)

    在前面几个模块的介绍中,我们主要以vfs为起始,完成了sysfs.设备-总线-驱动模型.platform设备驱动模型.i2c设备驱动模型.spi设备驱动模型的分析.在对这些模块进行分析的时候,我们或多 ...

最新文章

  1. linux 查端口 三种,Linux查看端口常用的三种用例
  2. 重拾简单的linux指令之info 【转】
  3. rename 批量修改文件名简单用法
  4. php4和php5的区别,什么是PHP 4和PHP 5之间的区别是什么-php是什么文件
  5. 顶级程序员的心得ndash;Coders at Work
  6. Yolo家族算法分析
  7. 微信java创建菜单_微信自定义菜单的创建(JAVA版)
  8. 在PaaS上构建SaaS应用程序需要注意什么
  9. 17、手势(Gesture)
  10. 系泊系统设计建模matlab程序,系泊系统设计-数学建模论文.docx
  11. 用户管理及权限管理的意义
  12. 厦门大学c语言2017,厦门大学2017年各专业录取分数线
  13. c++多线程学习11 packaged_task与async
  14. 接上个文章(mzsock
  15. AI研究生的文学情怀,厦大硕士毕业生文言致谢聊三年求学路
  16. 【CXY】JAVA基础 之 JDBC
  17. 传智java测试题答案_传智播客Java基础第一阶段习题
  18. 紫光国微财报一枝独秀 2021年净利润三位数增长靠什么
  19. 考英语二的计算机学硕,考研201英语是英语一还是英语二?
  20. matlab中使用阈值二值化,腐蚀,膨胀,反色等操作进行图像处理,去噪声,网纹、摩尔纹等

热门文章

  1. 迭代法动态生成谢尔宾斯基三角形
  2. [Windows批处理]清除IE缓存
  3. SpringBoot 整合 Editormd(完整版)
  4. Idea新建项目和快捷键
  5. PSPICE仿真数据转MATLAB
  6. 中国银行 网银 控件造成 IE8 崩溃的解决办法
  7. 顶级期刊Nature、Science,如何一较高下?
  8. 还不知道IEEE、ACM、SCI、EI、nature、期刊、会议论文之间的关系?一幅关系图搞定~
  9. C语言实现平衡二叉树
  10. 《电脑书籍镜像下载3CD PDG格式》PDG电子书[ISO]