Linux Mii management/mdio子系统分析之三 mii_bus注册、注销及其驱动开发流程

这篇具有很好参考价值的文章主要介绍了Linux Mii management/mdio子系统分析之三 mii_bus注册、注销及其驱动开发流程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

(转载)原文链接: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的注册与注销接口

      mii_bus主要提供了mdiobus_register、mdiobus_unregister。下面我们对这两个接口进行分析说明。在分析这两个接口之前,我们还是把上一篇文章中的mii_bus、device、mdio_bus_class等结构体之间的关联图贴在这儿,以便我们可以更好的理解mdiobus_register、mdiobus_unregister。

Linux Mii management/mdio子系统分析之三 mii_bus注册、注销及其驱动开发流程,Linux以太网,linux,驱动开发,运维

 

mdiobus_register接口分析

     该接口主要用于向系统中注册一个mii_bus device,并将该device注册至mdio_bus_class,完成以上操作后,即建立了如下图的数据结构间的关联图。该接口的处理流程如下图所示(该流程图屏蔽了一些合法性判断、返回值判断等信息):

  1. 调用device_register,将该mii_bus的device成员注册至系统的device_kset中,并完成与mdio_bus_class的关联;
  2. 针对phy address范围为[0-31],且mii_bus未设置忽略该phyid检测,则调用mdio_scan去搜索该phy addr下是否挂载了phy device(通过mii_bus->read接口,获取phy id),若获取到phy_id,则调用phy_device_register,将扫描到的phy_device注册至mdio_bus_type中(phy_device的注册我们在下一篇文章中介绍)。

通过以上两步,即完成了上述图片中mdio_bus_class、device_kset、mii_bus之间的关联,以及phy_device、mii_bus、phy_driver的关联。

 

 

Linux Mii management/mdio子系统分析之三 mii_bus注册、注销及其驱动开发流程,Linux以太网,linux,驱动开发,运维

 

 

mdiobus_unregister接口分析

该接口实现的功能刚发与mdiobus_registre相反,将上述建立的结构体变量之间的关联解除。下图为该接口的流程图。主要分为如下两部分:

  1. 调用device_del,注销该mii_bus;
  2. 针对该mii_bus所扫描到的phy_device,均调用device_unregister进行注销。

 

 

Linux Mii management/mdio子系统分析之三 mii_bus注册、注销及其驱动开发流程,Linux以太网,linux,驱动开发,运维

 

 

以上即为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自动完成搜索及注册与注销操作,不需要驱动人员参与。

 

 

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的读写控制命令。

 

Linux Mii management/mdio子系统分析之三 mii_bus注册、注销及其驱动开发流程,Linux以太网,linux,驱动开发,运维

 

 

那我们在做哪些驱动开发时,会用到这两个接口吗?比如我们的soc芯片通过mdio/mdc引脚连接了一个交换芯片,我们需要对该交换芯片进行配置,则可直接借助mdiobus_read/mdiobus_write实现与该交换芯片的命令交换(目前针对这一类驱动,linux系统提供了dsa驱动模块,在linux3.10时该模块仅作为Marvell相关交换芯片驱动使用,而在linux  5.2中已经有众多交换芯片驱动厂家支持了,后面我们在单独对dsa驱动进行分析)。这一类驱动的开发步骤如下:

  1. 创建一个platform_driver驱动,在该驱动的probe接口中执行如下操作:
    1. 根据platform device传递的参数(即mii_bus的id名称),从mdio_bus_class中查找到具体的mii_bus,并获取该变量;
    2. 创建对应的字符设备驱动,并把mii_bus作为该字符设备驱动的私有数据传递,而在该字符设备的read/write/ioctl接口中,即可借助mdiobus_read、mdiobus_write与mii_bus完成与具体的交换芯片的命令交换,实现对交换芯片的配置。

 

 

mii-bus驱动开发步骤说明

 

mii_bus结构体的定义如下,我们实现一个mii_bus驱动也就是实现该结构体类型的变量,并调用上述的mdiobus_register接口,即可完成mii_bus的注册。具体步骤如下:

  1. 需设置该mii_bus的名称与id,而在系统中可根据该id值搜索一个mii_bus;
  2. 完成read、write、reset方法,其中read、write主要用于与该mii_bus下的设备进行命令的交互;而reset方法主要用于对mii_bus的reset,关于这三个方法的实现,驱动开发人员可根据具体mac芯片的手册说明进行相应的开发操作。
  3. phy_mask主要用于设置需要忽略的phy addr,如我们需要忽略对phy addr 0的查找,则将phy_mask设置为0x01即可。
  4. 而irq主要指向一个数组,该数组中存储了每一个phy addr对应的irq,主要用于为每一个 phy addr对应的中断,该中断主要用于link up/down,针对该部分内容主要涉及到phy state machine,我们在后续章节中会详述该部分(大部分的mii_bus一般不提供该irq,但phy state machine提供了phy_poll机制,即是没有该irq,也可以进行phy link up/down,类似于mmc子模块中mmc card的poll机制)。

针对一个mii_bus类型的变量,只需要实现上述4步,然后再调用mdiobus_register接口,即可将该mii_bus注

册至系统中。

 

Linux Mii management/mdio子系统分析之三 mii_bus注册、注销及其驱动开发流程,Linux以太网,linux,驱动开发,运维

 

 

以上便是本篇文章的主要内容,主要涉及mii_bus的注册与注销、mii_bus驱动编写步骤等内容,该类驱动的实现也比较简单,只要按上述方法实现即可。文章来源地址https://www.toymoban.com/news/detail-793491.html

      本篇是mii management/mdio模块分析的第三篇文章,本章我们主要介绍mii-bus的注册与注销接口。在前面的介绍中也已经说过,我们可以将mii-bus理解为mdio总线的控制器的抽象,就像spi-master、i2c-adapter一样。

本篇文章主要涉及如下两部分:

 

mii-bus的注册与注销接口

 

mii-bus提供的方法说明

 

mii-bus驱动开发步骤说明

 

mii-bus的注册与注销接口

      mii_bus主要提供了mdiobus_register、mdiobus_unregister。下面我们对这两个接口进行分析说明。在分析这两个接口之前,我们还是把上一篇文章中的mii_bus、device、mdio_bus_class等结构体之间的关联图贴在这儿,以便我们可以更好的理解mdiobus_register、mdiobus_unregister。

Linux Mii management/mdio子系统分析之三 mii_bus注册、注销及其驱动开发流程,Linux以太网,linux,驱动开发,运维

 

mdiobus_register接口分析

     该接口主要用于向系统中注册一个mii_bus device,并将该device注册至mdio_bus_class,完成以上操作后,即建立了如下图的数据结构间的关联图。该接口的处理流程如下图所示(该流程图屏蔽了一些合法性判断、返回值判断等信息):

  1. 调用device_register,将该mii_bus的device成员注册至系统的device_kset中,并完成与mdio_bus_class的关联;
  2. 针对phy address范围为[0-31],且mii_bus未设置忽略该phyid检测,则调用mdio_scan去搜索该phy addr下是否挂载了phy device(通过mii_bus->read接口,获取phy id),若获取到phy_id,则调用phy_device_register,将扫描到的phy_device注册至mdio_bus_type中(phy_device的注册我们在下一篇文章中介绍)。

通过以上两步,即完成了上述图片中mdio_bus_class、device_kset、mii_bus之间的关联,以及phy_device、mii_bus、phy_driver的关联。

 

 

Linux Mii management/mdio子系统分析之三 mii_bus注册、注销及其驱动开发流程,Linux以太网,linux,驱动开发,运维

 

 

mdiobus_unregister接口分析

该接口实现的功能刚发与mdiobus_registre相反,将上述建立的结构体变量之间的关联解除。下图为该接口的流程图。主要分为如下两部分:

  1. 调用device_del,注销该mii_bus;
  2. 针对该mii_bus所扫描到的phy_device,均调用device_unregister进行注销。

 

 

Linux Mii management/mdio子系统分析之三 mii_bus注册、注销及其驱动开发流程,Linux以太网,linux,驱动开发,运维

 

 

以上即为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自动完成搜索及注册与注销操作,不需要驱动人员参与。

 

 

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的读写控制命令。

 

Linux Mii management/mdio子系统分析之三 mii_bus注册、注销及其驱动开发流程,Linux以太网,linux,驱动开发,运维

 

 

那我们在做哪些驱动开发时,会用到这两个接口吗?比如我们的soc芯片通过mdio/mdc引脚连接了一个交换芯片,我们需要对该交换芯片进行配置,则可直接借助mdiobus_read/mdiobus_write实现与该交换芯片的命令交换(目前针对这一类驱动,linux系统提供了dsa驱动模块,在linux3.10时该模块仅作为Marvell相关交换芯片驱动使用,而在linux  5.2中已经有众多交换芯片驱动厂家支持了,后面我们在单独对dsa驱动进行分析)。这一类驱动的开发步骤如下:

  1. 创建一个platform_driver驱动,在该驱动的probe接口中执行如下操作:
    1. 根据platform device传递的参数(即mii_bus的id名称),从mdio_bus_class中查找到具体的mii_bus,并获取该变量;
    2. 创建对应的字符设备驱动,并把mii_bus作为该字符设备驱动的私有数据传递,而在该字符设备的read/write/ioctl接口中,即可借助mdiobus_read、mdiobus_write与mii_bus完成与具体的交换芯片的命令交换,实现对交换芯片的配置。

 

 

mii-bus驱动开发步骤说明

 

mii_bus结构体的定义如下,我们实现一个mii_bus驱动也就是实现该结构体类型的变量,并调用上述的mdiobus_register接口,即可完成mii_bus的注册。具体步骤如下:

  1. 需设置该mii_bus的名称与id,而在系统中可根据该id值搜索一个mii_bus;
  2. 完成read、write、reset方法,其中read、write主要用于与该mii_bus下的设备进行命令的交互;而reset方法主要用于对mii_bus的reset,关于这三个方法的实现,驱动开发人员可根据具体mac芯片的手册说明进行相应的开发操作。
  3. phy_mask主要用于设置需要忽略的phy addr,如我们需要忽略对phy addr 0的查找,则将phy_mask设置为0x01即可。
  4. 而irq主要指向一个数组,该数组中存储了每一个phy addr对应的irq,主要用于为每一个 phy addr对应的中断,该中断主要用于link up/down,针对该部分内容主要涉及到phy state machine,我们在后续章节中会详述该部分(大部分的mii_bus一般不提供该irq,但phy state machine提供了phy_poll机制,即是没有该irq,也可以进行phy link up/down,类似于mmc子模块中mmc card的poll机制)。

针对一个mii_bus类型的变量,只需要实现上述4步,然后再调用mdiobus_register接口,即可将该mii_bus注

册至系统中。

 

Linux Mii management/mdio子系统分析之三 mii_bus注册、注销及其驱动开发流程,Linux以太网,linux,驱动开发,运维

 

 

以上便是本篇文章的主要内容,主要涉及mii_bus的注册与注销、mii_bus驱动编写步骤等内容,该类驱动的实现也比较简单,只要按上述方法实现即可。

到了这里,关于Linux Mii management/mdio子系统分析之三 mii_bus注册、注销及其驱动开发流程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Windows 11】安装 Android子系统 和 Linux子系统

    本文使用电脑系统: 主要就是安装一个名为: 适用于Android的Windows子系统 (WSA)的软件。 首先在电脑的设置里面:时间和语言——语言和地区里面把地区改为美国。 然后到微软商店搜索: Amazon AppStore 。 安装亚马逊应用商店的时候,会首先提示你安装前面说的WSA。如此,我

    2024年02月09日
    浏览(55)
  • OpenHarmony3.1安全子系统-签名系统分析

    应用签名系统主要负责鸿蒙hap应用包的签名完整性校验,以及应用来源识别等功能。 子系统间接口: 应用完整性校验模块给其他模块提供的接口; 完整性校验: 通过验签,保障应用包完整性,防篡改; 应用来源识别: 通过匹配签名证书链与可信源列表,识别应用来源。

    2024年02月05日
    浏览(47)
  • Window10安装linux子系统及子系统安装1Panel面板

    原文地址:Window10安装linux子系统及子系统安装1Panel面板 - Stars-One的杂货小窝 最近看到halo博客发布了2.10.0,终于是新增了个备份功能,于是有了念头想要升级下 但是目前我还是使用halo1.5版本,所以跨版本迁移可能会有问题,官方提议还是先用个测试环境进行测试验证是否有问题 但

    2024年02月08日
    浏览(53)
  • 字符设备驱动之输入子系统分析(二)

    作者: Bright-Ho 联系方式: 836665637@qq.com input 输入子系统框架分析(纯软件方面):   上一节,我们简单的描述的 什么是输入子系统 ; 什么是字符设备 ; 以及其作用 ;重点是我们讲到分析 输入子系统必须结合硬件设备来分析 ;那么这一节,我们主要讲解输入子系统的 软

    2024年02月15日
    浏览(36)
  • 字符设备驱动之输入子系统分析(一)

    作者: Bright-Ho 联系方式: 836665637@qq.com 前言背景描述: 虽然在网上看了很多有关输入子系统的资料和视频,但是真正的,系统的,全面的,来弄清输入子系统,还是要花些时间和精力的!现在我以一个初学者的角度来分析 input 输入子系统; 那么分析 input 输入子系统之前,

    2024年02月15日
    浏览(39)
  • Android13音频子系统分析(一)---整体架构

             目录 一、应用API层 二、Java框架层 三、Native核心层 3.1 AudioFlinger模块 3.2 AudioPolicyService模块 四、HAL层         本文基于AOSP13源码进行分析解读。所以与各个SoC平台厂商提供的运行在真实设备上的源码会有细微差异,但核心原理区别不大。         音频子系

    2024年02月07日
    浏览(51)
  • Linux reset子系统

    文章代码分析基于linux-5.19.13,架构基于aarch64(ARM64)。 复杂IC内部有很多具有独立功能的硬件模块,例如CPU cores、GPU cores、USB控制器、MMC控制器、等等,出于功耗、稳定性等方面的考虑,有些IC在内部为这些硬件模块设计了复位信号(reset signals),软件可通过寄存器(一般

    2024年02月16日
    浏览(41)
  • Linux Input子系统

    按键、鼠标、键盘、触摸屏等都属于输入(input)设备,Linux 内核为此专门做了一个叫做  input 子系统 的 框架 来处理输入事件。本质属于字符设备。 1. input子系统结构如下:  input 子系统分为 input 驱动层、input 核心层、input 事件处理层,最终给用户空间提供可访问的设备节点

    2024年02月10日
    浏览(44)
  • Linux内核(十四)Input 子系统详解 I —— 子系统介绍以及相关结构体解析

    input子系统就是管理输入的子系统 ,和Linux其他子系统一样,都是Linux内核针对某一类设备而创建的框架。 鼠标、键盘、触摸屏等都属于输入设备,Linux将这些设备的共同特性抽象出来,这就形成了input子系统的框架。 Linux内核只需要通过input框架向用户层上报输入事件 (如:

    2024年02月05日
    浏览(46)
  • Android13音频子系统分析(二)---初始化

    目录 一、AudioPolicyService初始化 1.1 AudioPolicyService::onFirstRef()函数 1.2 AudioCommandThread线程 1.3 AudioPolicyManager初始化 1.3.1 解析audio_policy_configuration.xml配置文件 1.3.2 解析audio_policy_engine_configuration.xml配置文件 1.3.3 AudioPolicyManager::onNewAudioModulesAvailableInt()函数 1.3.4 AudioPolicyManager::updateDe

    2024年02月03日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包