Linux下platform总线

一. 简介

前面我们讲了设备驱动的分离,并且引出了总线 (bus) 、驱动 (driver) 和设备 (device) 模型,比如 I2C SPI USB 等总线。
但是,在 SOC 中有些外设是没有总线这个概念的,但是又要使用总 线、驱动和设备模型该怎么办呢?
为了解决此问题, Linux 提出了 platform 这个虚拟总线,相应 的就有 platform_driver platform_device

本文来学习 Linux内核中的 platform总线。

二.  Linux下platform总线

1. platform总线的结构体

Linux 系统内核使用 bus_type 结构体表示总线,此结构体定义在文件 include/linux/device.h ,bus_type 结构体内容如下:
struct bus_type {const char		*name;const char		*dev_name;struct device		*dev_root;struct device_attribute	*dev_attrs;	/* use dev_groups instead */const struct attribute_group **bus_groups;const struct attribute_group **dev_groups;const struct attribute_group **drv_groups;int (*match)(struct device *dev, struct device_driver *drv);int (*uevent)(struct device *dev, struct kobj_uevent_env *env);int (*probe)(struct device *dev);int (*remove)(struct device *dev);void (*shutdown)(struct device *dev);int (*online)(struct device *dev);int (*offline)(struct device *dev);int (*suspend)(struct device *dev, pm_message_t state);int (*resume)(struct device *dev);const struct dev_pm_ops *pm;const struct iommu_ops *iommu_ops;struct subsys_private *p;struct lock_class_key lock_key;
};

10 行,match 函数,此函数就是完成设备和驱动之间匹配的。总线就是使用 match 函数来根据注册的设备来查找对应的驱动,或者根据注册的驱动来查找相应的设备,因此,每一条总线都必须实现此函数。

match 函数有 两个参数:dev drv,这两个参数分别为 device device_driver 类型,也就是设备和驱动。

platform 总线 bus_type 的一个具体实例,定义在文件 drivers/base/platform.c platform 总线定义如下:
struct bus_type platform_bus_type = {.name		= "platform",.dev_groups	= platform_dev_groups,.match		= platform_match,.uevent		= platform_uevent,.pm		= &platform_dev_pm_ops,
};

platform_bus_type 就是 platform 平台总线。 其中, platform_match 就是匹配函数。

2. 驱动与设备是如何匹配的?

我们来看 一下驱动和设备是如何匹配的, platform_match 函数定义在文件 drivers/base/platform.c 中,函 数内容如下所示:
static int platform_match(struct device *dev, struct device_driver *drv)
{struct platform_device *pdev = to_platform_device(dev);struct platform_driver *pdrv = to_platform_driver(drv);/* When driver_override is set, only bind to the matching driver */if (pdev->driver_override)return !strcmp(pdev->driver_override, drv->name);/* Attempt an OF style match first */if (of_driver_match_device(dev, drv))return 1;/* Then try ACPI style match */if (acpi_driver_match_device(dev, drv))return 1;/* Then try to match against the id table */if (pdrv->id_table)return platform_match_id(pdrv->id_table, pdev) != NULL;/* fall-back to driver name match */return (strcmp(pdev->name, drv->name) == 0);
}

驱动和设备的匹配有四种方法,我们依次来看一下:
11~12 行,第一种匹配方式, OF 类型的匹配,也就是设备树采用的匹配方式,
of_driver_match_device 函数定义在文件 include/linux/of_device.h 中。
device_driver 结构体 ( 表示 设备驱动 ) 中有个名为 of_match_table 的成员变量,此成员变量保存着驱动的 compatible 匹配表, 设备树中的每个设备节点的 compatible 属性会和 of_match_table 表中的所有成员比较,查看是 否有相同的条目,如果有的话,就表示设备和此驱动匹配,设备和驱动匹配成功以后 probe 函数 就会执行。

15~16 行,第二种匹配方式, ACPI 匹配方式。

19~20 行,第三种匹配方式, id_table 匹配,每个 platform_driver 结构体有一个 id_table
成员变量,顾名思义,保存了很多 id 信息。这些 id 信息存放着这个 platform 驱动所支持的驱 动类型。

23 行,第四种匹配方式,如果第三种匹配方式的 id_table 不存在的话,就直接比较驱动和 设备的 name 字段,看看是不是相等,如果相等的话就匹配成功。

对于支持设备树的 Linux 版本号,一般设备驱动为了兼容性,都支持设备树和无设备树两种匹配方式。
也就是第一种匹配方式一般都会存在,第三种和第四种只要存在一种就可以,一般用的最多的还是第四种,也就是直接比较驱动和设备的 name 字段,毕竟这种方式最简单了。

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

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

相关文章

String类及其常用方法

文章目录 1.String类的特性与使用1.1 String类的特性1.2 String对象的创建方式1.3 String 的使用(不同的拼接操作) 2.String常用方法2.1 String的常用方法一2.2 String常用方法二2.3 String常用方法三 1.String类的特性与使用 1.1 String类的特性 Stri…

第三百八十五回

文章目录 1.概念介绍2.使用方法3.示例代码 我们在上一章回中介绍了Snackbar Widget相关的内容,本章回中将介绍TimePickerDialog Widget.闲话休提,让我们一起Talk Flutter吧。 1.概念介绍 我们在这里说的TimePickerDialog是一种弹出窗口,只不过窗口的内容…

客户端 生成二维码 APP 扫码登录逻辑

目录 一、二维码登录逻辑 1、生成二维码 1)、随机用户 2)、将假用户信息,作为输入信息保存在二维码中 3)、获得生成的二维码buffer 4)、二维码图片buffer保存到文件中 5)、控件中显示 生成的二维码图片 2、使用假用户,和服务器建立临时长连接 1)、使用假用户ID…

torch.backends.cudnn.benchmark 作用

相关参数 torch.backends.cudnn.enabled torch.backends.cudnn.benchmark torch.backends.cudnn.deterministictorch.backends.cudnn.benchmark True:将会让程序在开始时花费一点额外时间,为整个网络的每个卷积层搜索最适合它的卷积实现算法&#xff0c…

MinIO权限提升漏洞CVE-2024-24747详细解决办法

漏洞名称: MinIO权限提升漏洞(CVE-2024-24747) 漏洞简介 2024年2月2日,深瞳漏洞实验室监测到一则MinIO 存在权限提升漏洞的信息,漏洞编号:CVE-2024-24747,漏洞威胁等级:高危。 该漏洞是由于用户创建的访…

秒懂SpringBoot之如何获取线上服务的build与git信息

[版权申明] 非商业目的注明出处可自由转载 出自:shusheng007 文章目录 概述解决方案启用Actuator暴露build相关信息暴露git相关信息总结源码概述 最近团队遇到一个问题,发现通过CI/CD发布的服务里面不包含自己的功能代码,于是两个小哥就开始扯皮了:开发说他的代码没有部署…

C#写入和调用方法

一、编写方法 在C#中,方法是在类或结构体内部定义的代码块,用于执行特定的操作。方法通常包括以下几个要素: 访问修饰符:指定方法的访问级别,如 public、private、protected 等。返回类型:指定方法返回的…

吴恩达机器学习-可选的实验室-正则化成本和梯度(Regularized Cost and Gradient)

文章目录 目标添加正则化正则化代价函数正则化梯度下降重新运行过拟合示例恭喜 目标 在本实验中,你将: 用正则化项扩展前面的线性和逻辑代价函数。重新运行前面添加正则化项的过拟合示例。 import numpy as np %matplotlib widget import matplotlib.pyplot as p…

GUI编程--PyQt5--QTabWidget

文章目录 组件使用信号样式设置 组件使用 QTabWidget 页签 信号 self._ui Ui_Sub() self._ui.setupUi(right) # 切换tab页 self._ui.tabWidget.currentChanged.connect(self.tab_slot)def tab_slot(self):cur_index self._ui.tabWidget.currentIndex()tab_name self._ui…

Redis 八种常用数据类型详解

夯实基础,这篇文章带着大家回顾一下 Redis 中的 8 种常用数据类型: 5 种基础数据类型:String(字符串)、List(列表)、Set(集合)、Hash(散列)、Zse…

JS ATM练习案例(复习循环知识)

需求:用户可以选择存钱、取钱、查看余额和退出功能。 分析:1循环时反复出现提示框,所以提示框写到循环里面。 2.退出的条件是4,所以是4就会结束循环 3.提前准备一个金额预存储 4取钱为减法操作,存钱为加法操作&#xf…

微信小程序修改placeholder样式

微信小程序有既定的修改placeholder的标签 一、placeholder-style直接修改样式 <input type"text" placeholder"请输入" placeholder-style"color:#e2e2e2;"></input>二、placeholder-class设置样式类 <input type"text&…

九数分三组

枚举三位数时&#xff0c;不用写三个循环&#xff0c;写出最小和最大数循环就行。在这题里要求三个数中不能有重复的数字&#xff0c;先转换为字符串&#xff0c;再转换为字符数组进行排序&#xff0c;最后比较字符串就可以得出结果。这题把结果和原因调换了一下

Python学习日记之学习turtle库(下 篇)

前言&#xff1a; 书接上篇&#xff0c;我们继续来了解Python内置库 turtle功能库。在前面的文章中&#xff0c;我们初步的了解了一下 turtle库&#xff0c;画布和画笔相关的函数&#xff0c;那么我们继续来深入了解一下吧。 详情见&#xff1a; Python学习日记之学习turtle库…

车载诊断协议DoIP系列 —— AL IPv6地址分配通用DoIP报头结构

车载诊断协议DoIP系列 —— AL IPv6地址分配&通用DoIP报头结构 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自…

深度学习进阶:揭秘强化学习原理,实战应用全解析!

作为机器学习领域的一大分支&#xff0c;强化学习以其独特的学习方式吸引了众多研究者和实践者的目光。强化学习&#xff0c;顾名思义&#xff0c;是通过不断地强化与环境的交互来优化决策策略。在这个过程中&#xff0c;智能体通过试错&#xff0c;根据环境给出的奖励信号来调…

逆变器功率软起斜率要求

安规说明 在NB32004中&#xff0c;有明确要求&#xff0c;有功功率调整速率不得超过正负10%Pn/min&#xff0c;包括起停机。 控制对象 控制功率最终是通过调整D轴电流给定来达到限制功率的目的&#xff0c;所以我们只要让D轴的电流给定限幅值按照10%/min增加就好了。 具体实…

媒体单位专用小记者报名及各类活动报名系统介绍

媒体单位专用小记者报名及各类活动报名系统介绍 小记者活动鼓励孩子们关注生活和社会&#xff0c;丰富成长体验&#xff0c;开启心智&#xff0c;淬砺思想。这不仅有助于提高他们的理性思辨力&#xff0c;还能培养他们的社会责任感和公民意识。小记者活动为学生提供了一个全新…

51单片机系列-单片机定时器

&#x1f308;个人主页&#xff1a;会编辑的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” 软件延时的缺点 延时过程中&#xff0c;CPU时间被占用&#xff0c;无法进行其他任务&#xff0c;导致系统效率降低&#xff0c;延时时间越长&#xff0c;该缺点就越明显&…

【GO语言卵细胞级别教程】10.探索Go语言中神奇的Map类型:解密键值对的魔力(含习题)

【GO语言卵细胞级别教程】10.探索Go语言中神奇的Map类型&#xff1a;解密键值对的魔力&#xff08;含习题&#xff09; 文章目录 【GO语言卵细胞级别教程】10.探索Go语言中神奇的Map类型&#xff1a;解密键值对的魔力&#xff08;含习题&#xff09;1.简介2. 基本语法3.Map基本…