Linux Mii management/mdio子系统分析之二 mdio总线-设备-驱动模型分析

news2024/12/24 8:38:44

Linux Mii management/mdio子系统分析之二 mdio总线-设备-驱动模型分析


(转载)原文链接: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等数据结构之间的关联,介绍该子系统的驱动模型,接着再对具体的数据结构进行分析。

如下图即为这些数据结构间的关联,主要涉及两个方面:

  1. mdio子系统的驱动模型,主要继承于linux系统的设备-总线-驱动模型,因此通过继承device、device_driver数据结构的定义,完成了mdio_bus_type、device、device_driver的关联,并使用设备-总线-驱动提供的方法完成这些数据结构间的绑定与解绑操作(device_register、driver_register、bus->probe、bus->remove等接口);
  2. 与之前介绍的mmc、spi、i2c驱动模型类似,mdio驱动模型也定义了phy_device、phy_driver、mii_bus之间的关联,phy_device通过其成员变量,完成了与mii_bus、phy_driver之间的关联:
    1. phy_device通过其bus指针,可获取其所依附的mii management,即可使用mii_bus提供给的read/write方法;
    2. phy_device通过其drv指针,可获取该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操作,实现驱动与设备的绑定与解绑操作。下面我们分析下这几个数据结构的定义。

 

struct mii_bus

该数据结构对应一个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的探测操作。

 

 

 

Struct phy_driver分析

该结构体的定义如下,主要涉及如下几个方面:

  1. 定义了该驱动所识别的phy device对应的id;
  2. 定义了device_driver类型的变量,主要用于继承linux设备-总线-驱动模型,实现mdio总线-phy-device、phy-driver的绑定、解绑等操作;
  3. 定义了probe、remove、suspend、resume等方法(device_driver中也定义了这些方法),而phy_driver也定义这些方法,可以理解为面向对象的多态行为(借助mdio_bus的probe/remove/suspend/resume,最终调用具体phy_driver的方法);
  4. 定义了针对phy_device的操作方法(phy初始化、phy自适应配置、phy自适应状态的获取等接口)

 

 

struct phy_device分析

该数据结构是针对phy设备的抽象。该数据结构主要涉及如下几个方面:

  1. 该数据结构可理解为是phy_driver、mii_bus、device的子类,因此可以使用mii_bus的read/write方法,实现对phy的访问,也可以使用phy_driver的方法,实现对phy的配置操作(配置phy的传输模式(10M/100M/1000M等)、自适应、工作模式(半双工/全双工))
  2. state表示phy的状态(PHY_DOWN、PHY_UP、PHY_RUNNING、PHY_AN、PHY_FORCING...)
  3. phy_id为phy的厂家标识;
  4. speed、duplex、pause、link、autoneg等变量表示phy的工作速率、工作模式、链接状态、是否自适应等信息;
  5. attached_dev表示该phy所对应的网络设备;

 

 

以上便是这几个数据结构的定义,根据这些数据结构的定义及他们之间的关联,基本上可理解

mdio子系统驱动模型的内容。

 

二、mdio bus 定义及说明

mdio_bus的定义如下,主要实现内如下:

  1. 仅实现了match接口与电源管理相关的接口,而针对设备探测与移除的接口(probe、remove)均没有实现,因此在调用device_register、driver_register进行设备与驱动注册匹配时,则调用device_driver->probe/remove接口实现设备的探测操作,针对phy_driver而言,其phy_driver->driver->probe/remove定义为phy_probe/phy_remove,而这两个接口最终会调用phy_driver->probe/remove接口进行设备的探测与移除操作;
  2. 定义了默认设备属性(即所有注册至mdio_bus上的设备,均需要为该设备创建该默认属性文件,这部分内容可参考我之前写的设备驱动模型相关的文章,此处不再细说),该默认属性定义如下,即phy_id的只读属性,可读取该phy_device对应的phyid;

 

 

 

 

三、mdio_bus_class

与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系统中总线类的设备驱动模型基本上就可以快速理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1389087.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3.3.2 CSMA/ CD协议

3.3.2 CSMA/ CD协议 CSMA/CD(Carrier Sense Multiple Access with Collision Detection):载波监听多点接入/碰撞检测。 检测到碰撞后: 适配器立即停止发送。(碰撞点后面的信号会一直叠加)等待一段随机时间…

【AI】 AIOTSummary

智能物联网(AIoT)是2018年兴起的概念,指系统通过各种信息传感器实时采集 各类信息(一般是在监控、互动、连接情境下的),在终端设备、边缘域或云中心 通过机器学习对数据进行智能化分析,包括定位、比对、预测、调度等。智能物联网(AIoT)是2018年兴起的概念,指系统通过…

你还没脱单,这些软件都得背锅

不管你是否认可情人节概念,是否会在这天与自己的那个ta相聚,每个成年人都会或多或少地思考自己的感情问题。 在互联网兴盛之前,人与人的交往大都依靠职场关系和熟人介绍来结识新的对象,但也有媒人、婚姻介绍所等专门的职业为适龄…

服务异步通讯——springcloud

服务异步通讯——springcloud 文章目录 服务异步通讯——springcloud初始MQRabbitMQ快速入门单机部署1.1.下载镜像安装MQ SpringAMQPwork Queue 工作队列Fanout Exchange广播模式DirectExchange路由模式TopicExchange话题模式 消息转换器 初始MQ RabbitMQ快速入门 官网https:/…

科研绘图(八)线性热图

线性热图(Linear Heat Map)是一种数据可视化技术,用于展示数值在一维线性空间上的分布情况。它通常用于展示沿着一条线(例如时间线或任何一维序列)的数据密度或强度变化。线性热图与传统的二维热图不同,后者…

Sectigo多域名通配符证书买一年送一个月

Sectigo随着互联网的发展也在飞速发展,旗下颁发了多种单域名SSL证书、多域名SSL证书和通配符SSL证书产品。Sectigo旗下的SSL证书产品丰富,为了满足一些域名多,子域名也比较多的企事业单位的需求,推出了一种多域名通配符SSL证书。今…

Linux内核架构和工作原理详解(一)

简介 作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。目前支持模块的动态装卸(裁剪)。Linux内核就是基于这个策略实现的。Linux进程1.采用层次结构,每个进程都依赖于一个父进程。内核启动init程序…

simulink之state

状态 状态描述了无功系统的运行模式。在Stateflow图表中,状态用于顺序设计,以创建状态转换图。 状态可以是激活状态,也可以是非激活状态。一个状态的激活或不激活可以根据事件和条件而变化。事件的发生通过使状态变为激活或非激活来驱动状态…

跨境电商多账号防关联攻略分享,盘点那些可以多账号登录的指纹浏览器

在跨境电商行业中,卖家常常需要在电商平台上同时运营多个店铺,但像亚马逊这样的平台都禁止同一个卖家在同一个站点上开设多家店铺,这一做法也常常会带来账号关联的风险,而关联的后果可能非常严重。那么拥有多个账号的跨境卖家应该…

多级缓存(nginx本地缓存、JVM进程缓存、redis缓存)

文章目录 整体示意图1.nginx缓存2.进程缓存Caffeine示例 3.Lua语法(为了在nginx中做编程)4.OpenResty5.封装向Tomcat发送的Http请求,获取数据6.Tomcat集群的负载均衡7.redis缓存8.查询Redis缓存9.Nginx本地缓存 整体示意图 1.nginx缓存 2.进程缓存 Caffeine示例 3.…

多级缓存架构(二)Caffeine进程缓存

文章目录 一、引入依赖二、实现进程缓存1. 配置Config类2. 修改controller 三、运行四、测试 通过本文章&#xff0c;可以完成多级缓存架构中的进程缓存。 一、引入依赖 在item-service中引入caffeine依赖 <dependency><groupId>com.github.ben-manes.caffeine…

企业内部知识库搭建方法,一般人都不知道

让我们想象一下&#xff0c;你是一家创业公司的创始人或者是已有企业的CEO&#xff0c;你是否遇到过这样的问题&#xff0c;公司的员工有时候互相之间的信息交流不够顺畅&#xff0c;不同部门之间的知识沟通不够清晰&#xff1f; 或者是新加入的员工刚开始工作几个月都处在一个…

网络部署实战具体学习内容总结

网络部署实战具体学习内容总结 &#x1f4bb;网络部署实战课程通常旨在教授学生如何规划、配置、维护和优化计算机网络。这些课程涵盖了广泛的主题&#xff0c;以确保学生具备网络部署和管理所需的技能。 网络部署实战课程具体学习内容&#x1f447; 1️⃣网络架构设计及网络原…

遥测终端机选择要点:功能、稳定性与成本的综合考量

在当今的智能化时代&#xff0c;遥测终端机作为数据采集、传输和处理的关键设备&#xff0c;广泛应用于水利、气象、环保等领域。然而&#xff0c;面对市场上琳琅满目的遥测终端机产品&#xff0c;如何选择一款性能优良、稳定性高且成本合理的设备成为摆在用户面前的一大难题。…

第一篇:node的背景及版本的检查

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 前言 Node.js 是一个基于 Chrome V8 JavaScript 引擎…

制造业CRM系统选型技巧-这四个功能更加重要

目前&#xff0c;促进制造业数字化转型是时代的发展方向。为了实现这一趋势&#xff0c;CRM管理系统在制造业中的运用至关重要。那样&#xff0c;制造业CRM应该如何选择呢&#xff1f;高度关注这种业务艰难和解决方案&#xff1a;全方位客户管理、灵便订制作用、高效客户服务以…

【SpringBoot3】Spring Boot 3.0 介绍以及新特性

文章目录 一、Spring Boot 3.01、介绍2、Spring Boot 核心概念3、Spring Boot 3.0 新特性 二、Spring Boot Starter1、介绍2、Starter 命名规则3、官方提供了哪些Starter 三、spring-boot-starter-parent 说明四、示例&#xff1a;创建web项目参考 一、Spring Boot 3.0 1、介绍…

【健康小贴士】关节炎是不是冻出来的?

大家冬天肯定被父母唠叨过&#xff1a; 「天气这么冷&#xff0c;裤子穿这么短&#xff0c;小心得关节炎&#xff01;」 ❌这种说法其实是不对的或者并不全面&#xff0c;答案来了&#x1f440;

鸿蒙开发笔记(七):应用状态管理,LocalStorage及AppStorage的使用

开发者要实现应用级的&#xff0c;或者多个页面的状态数据共享&#xff0c;就需要用到应用级别的状态管理的概念。ArkTS根据不同特性&#xff0c;提供了多种应用状态管理的能力&#xff1a; LocalStorage&#xff1a;页面级UI状态存储&#xff0c;通常用于UIAbility内、页面间的…

win10系统postgresql重装软件后原数据如何迁移

1、备份postgresql安装目录下的data文件夹 2、重新安装postgresql同一版本的软件 3、停止postgresql-x64-12服务 4、替换data文件夹 删除postgresql安装后新的的data文件夹 删除后将第一步备份的data文件夹粘贴过来&#xff0c;还是同一位置 5、启动postgresql-x64-12服务 …