(转载)原文链接:https://blog.csdn.net/u014044624/article/details/123303174
????? 本篇是mii management/mdio模块分析的第三篇文章,本章我们主要介绍mii-bus的注册与注销接口。在前面的介绍中也已经说过,我们可以将mii-bus理解为mdio总线的控制器的抽象,就像spi-master、i2c-adapter一样。
本篇文章主要涉及如下两部分:
?
mii-bus的注册与注销接口
?
mii-bus提供的方法说明
?
mii-bus驱动开发步骤说明
?
? ? ? mii_bus主要提供了mdiobus_register、mdiobus_unregister。下面我们对这两个接口进行分析说明。在分析这两个接口之前,我们还是把上一篇文章中的mii_bus、device、mdio_bus_class等结构体之间的关联图贴在这儿,以便我们可以更好的理解mdiobus_register、mdiobus_unregister。
?
? ? ?该接口主要用于向系统中注册一个mii_bus device,并将该device注册至mdio_bus_class,完成以上操作后,即建立了如下图的数据结构间的关联图。该接口的处理流程如下图所示(该流程图屏蔽了一些合法性判断、返回值判断等信息):
通过以上两步,即完成了上述图片中mdio_bus_class、device_kset、mii_bus之间的关联,以及phy_device、mii_bus、phy_driver的关联。
?
?
?
?
该接口实现的功能刚发与mdiobus_registre相反,将上述建立的结构体变量之间的关联解除。下图为该接口的流程图。主要分为如下两部分:
?
?
?
?
以上即为mii_bus的注册与注销方法,我们需要注意的一点是:
? ? ? 在进行mii_bus的注册中,会扫描该mdio总线上挂载的每一个phy设备,若存在则将该设备注册至mdio_bus_type上。这是与spi_master、i2c_adapter所不同的,在spi_master、i2c_adapter中需要驱动开发人员在板级文件或者设备树配置文件上显示完成spi device、i2c device的注册,而phy_device的注册与注销由mii_bus自动完成搜索及注册与注销操作,不需要驱动人员参与。
?
?
? ? ? ? 与spi-master、i2c-adapter一样,mii-bus也提供了mdio-bus的访问方法,通过mii-bus提供的访问方法,即可访问该mdio总线上挂接的phy设备。系统主要提供了mdio bus read、write方法,名称分别为mdiobus_read、mdiobus_write,这两个接口主要是调用具体mii_bus的read/write方法,实现对phy device的读写控制命令。
?
?
?
那我们在做哪些驱动开发时,会用到这两个接口吗?比如我们的soc芯片通过mdio/mdc引脚连接了一个交换芯片,我们需要对该交换芯片进行配置,则可直接借助mdiobus_read/mdiobus_write实现与该交换芯片的命令交换(目前针对这一类驱动,linux系统提供了dsa驱动模块,在linux3.10时该模块仅作为Marvell相关交换芯片驱动使用,而在linux? 5.2中已经有众多交换芯片驱动厂家支持了,后面我们在单独对dsa驱动进行分析)。这一类驱动的开发步骤如下:
?
?
?
mii_bus结构体的定义如下,我们实现一个mii_bus驱动也就是实现该结构体类型的变量,并调用上述的mdiobus_register接口,即可完成mii_bus的注册。具体步骤如下:
针对一个mii_bus类型的变量,只需要实现上述4步,然后再调用mdiobus_register接口,即可将该mii_bus注
册至系统中。
?
?
?
以上便是本篇文章的主要内容,主要涉及mii_bus的注册与注销、mii_bus驱动编写步骤等内容,该类驱动的实现也比较简单,只要按上述方法实现即可。