Linux Mii management/mdio子系统分析之四 mdio总线及phy驱动模型及其开发流程
前三篇文章完成了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主要实现如下两个功能:
- 定义dev_atrrs变量,针对所有注册在mdio_bus_type上的phy_device,均会创建该dev_attrs上定义的属性文件,该属性文件的名称为phy_id,该属性文件为只读属性文件,可获取该phy_device的phy id;
- 定义了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接口的处理流程如下图所示。
- 针对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方法)。
- 针对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的实现流程如下图所示,其主要实现如下三方面的匹配检测功能:
- 先进行设备树驱动模型的支持(若系统支持设备树,则先调用该接口进行匹配检测,主要是将phy_driver与phy_device设备树节点的compatible变量进行匹配检测),若匹配则返回匹配成功;
- 若a没有匹配成功,则确认phy_driver是否提供了匹配检测方法,若提供匹配检测方法,则再次进行匹配检测,若匹配成功,则返回成功;
- 若以上均没有匹配成功,则判断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,主要完成如下工作:
- 设置phy_driver->driver的probe为phy_probe、remove为phy_remove,所依附的总线为mdio_bus_type,从而可将该phy_driver注册至mdio总线上;
- 调用driver_register接口,将该phy_driver->driver注册至mdio总线上,而关于driver_register的调用流程已经在上述mdio总线的device、driver注册与注销方法中说明。
针对phy_device_register而言,主要完成工作如下:
- 若phy_device已经与mii_bus完成绑定,则返回失败;
- 若该phy_device需要进行fixup,则调用phy_scan_fixups进行修正,一般在phy 芯片存在errata时,才进行修正;
- 调用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 驱动而言,主要实现两部分的内容:
- 实现probe、remove、suspend、resume接口,用于完成phy_driver的注册与注销,以及针对linux设备-总线-驱动模型的基础;
- 实现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。
- 其中config_init主要是对phy device进行一些初始化配置;
- 而config_aneg、read_status主要用于设置phy device的自适应机制已经获取phy的状态(主要用于获取适配速率、双工模式等),一般这两个接口直接使用genphy_config_aneg、genphy_read_status即可,触发该phy device有特殊的定义;
- 而ack_interrupt、config_intr、did_interrupt主要用于phy device的link up/down相关的中断处理,这个与具体的phy device有关,查看相应的芯片手册说明即可;
- 而针对ts_info、hwtstamp、rxtstamp、txtstamp、set_wol、get_wol主要是时间戳相关的处理,大多数phy device均不需实现这几个接口。
- 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驱动模型及其开发流程相关推荐
- 智能分析网关微信端告警消息推送的开发流程
智能分析网关是TSINGSEE青犀视频研发的AI边缘计算智能硬件设备,它具有AI智能检测与识别的能力,可对视频及图像中的人.车.物体.行为等进行检测识别与定位.追踪.统计,具体可包括人脸检测与识别.车 ...
- LINUX IIO子系统分析之四 IIO EVENT介绍
上一章我们介绍了iio子系统中的iio trigger模块,本章我们将介绍iio event模块,iio event主要用于阈值监测.自由落体监测等监测功能.因为IIO EVENT涉及IIO DEVI ...
- linux内核分为子系统,Linux内核内存管理子系统分析【转】
还是那张熟悉的老图:Linux内核子系统简介(由七个部分组成) Linux内存管理模型: 1. 内存管子系统职能: 1> 管理虚拟地址与物理地址的映射 2> 管理物理内存的分配 2. ...
- 【分析笔记】Linux 4.9 backlight 子系统分析
相关信息 内核版本:Linux version 4.9.56 驱动文件:lichee\linux-4.9\drivers\video\backlight\backlight.c 驱动作用 对上,面对应 ...
- LINUX IIO子系统分析之五IIO BUFFER子模块实现分析
上一章我们介绍了iio子系统中的iio event模块,本章我们将介绍iio buffer模块,iio buffer主要用于连续数据采集与缓存功能.IIO buffer模块借助IIO DEVICE字符 ...
- linux RTC 驱动模型分析
linux RTC 驱动模型分析 RTC(real time clock)实时时钟,主要作用是给Linux系统提供时间.RTC因为是电池供电的,所以掉电后时间不丢失.Linux内核把RTC用作&quo ...
- LINUX SPI设备驱动模型分析之二 SPI总线模块分析
上一篇文章我们简要介绍了SPI驱动模块,本章我们详细说明一下spi总线.设备.驱动模块的注册.注销以及这几个模块之间的关联. SPI总线的注册 spi模块也是基于LINUX设备-总线-驱动模型进行开发 ...
- 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. ...
- Linux phy驱动开发总结
文章目录 基础 须知 数据结构 数据结构UML类图 MAC驱动 初始化简述 驱动实现 关于MAC连接PHY PHY驱动 动态注册 静态注册 通用PHY 参考模板 IP18xx驱动调试 须知: 问题 方 ...
- char添加一个字符_LINUX字符设备驱动模型分析(起始篇)
在前面几个模块的介绍中,我们主要以vfs为起始,完成了sysfs.设备-总线-驱动模型.platform设备驱动模型.i2c设备驱动模型.spi设备驱动模型的分析.在对这些模块进行分析的时候,我们或多 ...
最新文章
- linux 查端口 三种,Linux查看端口常用的三种用例
- 重拾简单的linux指令之info 【转】
- rename 批量修改文件名简单用法
- php4和php5的区别,什么是PHP 4和PHP 5之间的区别是什么-php是什么文件
- 顶级程序员的心得ndash;Coders at Work
- Yolo家族算法分析
- 微信java创建菜单_微信自定义菜单的创建(JAVA版)
- 在PaaS上构建SaaS应用程序需要注意什么
- 17、手势(Gesture)
- 系泊系统设计建模matlab程序,系泊系统设计-数学建模论文.docx
- 用户管理及权限管理的意义
- 厦门大学c语言2017,厦门大学2017年各专业录取分数线
- c++多线程学习11 packaged_task与async
- 接上个文章(mzsock
- AI研究生的文学情怀,厦大硕士毕业生文言致谢聊三年求学路
- 【CXY】JAVA基础 之 JDBC
- 传智java测试题答案_传智播客Java基础第一阶段习题
- 紫光国微财报一枝独秀 2021年净利润三位数增长靠什么
- 考英语二的计算机学硕,考研201英语是英语一还是英语二?
- matlab中使用阈值二值化,腐蚀,膨胀,反色等操作进行图像处理,去噪声,网纹、摩尔纹等