(转载)原文链接:https://blog.csdn.net/u014044624/article/details/123303139
? ? ? 接着上篇文章继续分析mdio子系统,本章主要介绍mdio子系统的驱动模型,当然了介绍mdio子系统的驱动模型,就绕不开linux系统设备-总线-驱动模型,所有的总线类的驱动,基本上都可以理解为继承自linux系统设备-总线-驱动模型。
本篇主要介绍如下几部分的内容:
一、总线-设备-驱动-控制器模型分析
二、总线定义
三、class定义
?
? ? ? ?针对驱动模型而言,基本上通过其数据结构的定义及关联,即可窥知一二(结构体一般封装了数据与方法,基本上熟悉数据结构间的关联,也就对其模型有了理解)。下面我们先建立phy_device、phy_driver、mdio_bus、mii_bus、device、device_driver等数据结构之间的关联,介绍该子系统的驱动模型,接着再对具体的数据结构进行分析。
如下图即为这些数据结构间的关联,主要涉及两个方面:
?phy_device通过与mii_bus、phy_driver的关联,即可实现针对该phy_device的命令设置、状态获取等操作,因此在网口驱动实现时,每一个网口对应的net_device均通过其私有指针,绑定对应的phy_device,通过该phy_device类型变量,即可获取该网口对应phy的信息。
?
以上即是mdio子系统的驱动模型,该子系统的数据结构(phy_device、phy_driver、mdio_bus_type)通过继承linux设备-总线-驱动模型的结构体,即可借助其方法完成针对phy_device的probe/remove操作,实现驱动与设备的绑定与解绑操作。下面我们分析下这几个数据结构的定义。
?
该数据结构对应一个mii management控制器的抽象,定义的数据和方法说明如下:
?
id:表示该mii_bus的id信息(如针对ti cpsw的mii_bus,其id值为cpmac-mii;针对fixed-mii-bus,其值为fixed-0)
read:该mii management提供的读方法,借助该接口,可访问挂载至该mii management上的phy-device;
write:该miimanagement提供的写方法,借助该接口,可修改挂载至该mii management上的phy-device;
reset:是对该mii management控制器的复位方法;
phy_map:该数组成员用于指示目前已扫描到的挂载至该控制器下的phy-device;
phy_mask:用于表示忽略该控制器下某一个phy addr对应的phy-device的探测操作。
?
?
?
该结构体的定义如下,主要涉及如下几个方面:
?
?
该数据结构是针对phy设备的抽象。该数据结构主要涉及如下几个方面:
?
?
以上便是这几个数据结构的定义,根据这些数据结构的定义及他们之间的关联,基本上可理解
mdio子系统驱动模型的内容。
?
mdio_bus的定义如下,主要实现内如下:
?
?
?
?
与spi、mmc子系统类似,mdio子系统针对mii_bus,也创建了对应的类,名称为“mdio_bus”,该类的定义如下:
?
? ? ? 针对mdio_bus_class而言,所有创建的mii_bus,均需要链接至该类,而mii_bus继承自device结构体,而所有的device类型的变量均属于device_kset,而所有的device类型变量与class的关联是通过sym_link实现关联的。如下图即为mii_bus、mii_bus->dev、mdio_bus_class的关联。借助于mii_bus->dev->kobj->kref(引用计数),mii_bus的释放由linux设备-总线-驱动模型的kref进行关联,当mii_bus的引用计数为0时,则触发其relese接口,通过如下图的调用,最终调用mdio_bus_class->dev_release,即mdiobus_release接口,该接口则完成mii_bus类型变量的内存释放操作。
?
?
?
?
? ? ? ? 以上即为本篇文章的内容,主要介绍mii management/mdio子系统的驱动模型及相关的数据结构的介绍;并介绍mdio_bus_type、mdio_bus_class的定义等内容。本篇文章中的介绍也涉及了linux设备-总线-驱动模型、linux sysfs相关内容,若需要对这两部分内容的分析,请参考之前写的文章,强烈建议大家学习下这两部分的内容,只要把这两部分的内容理解了,针对linux系统中总线类的设备驱动模型基本上就可以快速理解。