Linux驱动之平台总线

news2024/11/16 21:53:08

文章目录

  • 前言
  • 一、什么是平台总线?
  • 二、平台总线相关的结构体
  • 三、平台总线的注册和注销
  • 四、总线平台的框架
  • 总结


前言

一个完整的驱动程序总是由三部分组成:设备、总线、驱动
设备就好比我们的硬件:比如oled ,那么总线就相当于iic总线,驱动就是我们编写的控制oled的代码。
那么今天要讲的平台总线又是什么呢?


一、什么是平台总线?

在 Linux 2.6 以后的设备驱动模型中,需关心总线、设备和驱动这 3 个实体,总线将设备和驱动绑定。在系统每注册一个设备的时候,会寻找与之匹配的驱动;相反的,在系统每注册一个驱动的时候,会寻找与之匹配的设备,而匹配由总线完成。

Linux 发明了一种虚拟的总线,称为 platform 总线,相应的设备称为 platform_device,而驱动成为 platform_driver。

平台总线模型就是把原来的驱动 C 文件给分成了两个 C 文件,一个是 device.c,一个是 driver.c 把稳定不变的放在 driver.c 里面,需要变得就放在了 device.c 里面
一般模型如下:
在这里插入图片描述

如果我们使用的设备树,那么device.c部分就会换成设备树用来描述硬件资源。


二、平台总线相关的结构体

在 Linux 内核中,用 platform_driver 结构体表示 platform 驱动,platform_driver 结构体定义指定名称的平台设备驱动注册函数和平台设备驱动注销函数

struct platform_driver {
/*当 driver 和 device 匹配成功的时候,就会执行 probe 函数*/
int (*probe)(struct platform_device *);
/*当 driver 和 device 任意一个 remove 的时候,就会执行这个函数*/
int (*remove)(struct platform_device *);
/*当设备收到 shutdown 命令的时候,就会执行这个函数*/
void (*shutdown)(struct platform_device *);
/*当设备收到 suspend 命令的时候,就会执行这个函数*/
int (*suspend)(struct platform_device *, pm_message_t state);
/*当设备收到 resume 命令的时候,就会执行这个函数*/
int (*resume)(struct platform_device *);
// 内置的 device_driver 结构体
struct device_driver driver;
// 该设备驱动支持的设备的列表 他是通过这个指针去指向 platform_device_id 类型的数组
const struct platform_device_id *id_table;
bool prevent_deferred_probe;
};

其中用的最多的就是int (*probe)(struct platform_device *);这个是总线匹配设备和驱动成功后进入的函数,struct device_driver driver;这个结构体是用来描述设备驱动的,具体如下:

struct device_driver {
	const char		*name;
	struct bus_type		*bus;

	struct module		*owner;//通常是THIS_MODULE
	const char		*mod_name;	/* used for built-in modules */

	bool suppress_bind_attrs;	/* disables bind/unbind via sysfs */
	enum probe_type probe_type;

	const struct of_device_id	*of_match_table;  //用来匹配设备树
	const struct acpi_device_id	*acpi_match_table;

	int (*probe) (struct device *dev);
	int (*remove) (struct device *dev);
	void (*shutdown) (struct device *dev);
	int (*suspend) (struct device *dev, pm_message_t state);
	int (*resume) (struct device *dev);
	const struct attribute_group **groups;

	const struct dev_pm_ops *pm;
	void (*coredump) (struct device *dev);

	struct driver_private *p;
};

三、平台总线的注册和注销

注册:

platform_driver_register

注销:

platform_driver_unregister

四、总线平台的框架

在之前的Linux中,还没有设备树,所以平台总线的框架也是要写两个.c文件,一个是device.c,另个就是我们的driver.c,它们之间是通过总线进行匹配的,如下:
在这里插入图片描述
在这里插入图片描述

名字相同的时候,当两个文件都加载到内核中就会自动匹配成功。

现在的话是使用设备树来替代device.c,如下:

在这里插入图片描述
在这里插入图片描述

这两个匹配成功之后就会进入probel函数

一般编写流程如下:
注册平台总线----->完善平台总线结构体-------->设置设备树--------->匹配成功之后进入probel函数------>编写自己代码


总结

平台总线是个虚拟的总线,并不是真实存在的,但是确实能够起到设备和驱动分离的效果,在以后有的驱动中基本上要和这个总线见面,所以掌握平台总线,还是很有必要。

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

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

相关文章

Faster RCNN网络源码解读(Ⅲ) --- 如何搭建自己的数据集

目录 一、如何生成类似pascal voc一样结构的文件(split_data.py) 二、如何创建属于自己的数据集(my_dataset.py) 2.1 代码 2.2 代码解释 2.2.1 初始化函数__init__ 2.2.2 parse_xml_to_dict函数(解析xml文件&…

35岁程序员还能找到工作吗?60%选择转岗项目经理!

我因为工作关系接触过大把的程序员朋友,知道他们都有35岁年龄焦虑,曾经他们在群里调侃程序员的尽头是开出租车和开饭店。毕竟一个公司的CTO只有一个,随着年龄的增长他们的体力和学新的技术都会明显吃力,慢慢就承受不起失业&#x…

[极客大挑战 2019]Havefun1、EasySQL(BUUCTF)

前言: 这篇文章还是是为了帮助一些 像我这样的菜鸟 找到简单的题解 今天是2022年的最后一天, 这一年我居然写了72篇文章 获得5枚勋章 还多了14个粉丝 好了不说了,上水题的题解 EasySQL题目描述 解题工具: 不需什么工具,如题名easy …

元宇宙产业委员会发布《第一届第六次主任委员会议公报》

2022年12月29日中国移动通信联合会元宇宙产业工作委员会第一届第六次主任委员会议书面召开,共同主席3人、学术指导3人、产业指导3人,联席主任委员3人、执行主任委员4人、常务副主任委员9家/人、副主任委员25家/人均以通信方式出席会议并表决相关事项。 …

深入分析Linux虚拟化KVM-Qemu之ARMv8虚拟化

说明: KVM版本:5.9.1 QEMU版本:5.0.0 工具:Source Insight 3.5, Visio 1. 概述 KVM虚拟化离不开底层硬件的支持,本文将介绍ARMv8架构处理器对虚拟化的支持,包括内存虚拟化、中断虚拟化、I/O虚…

BM33 二叉树的镜像

题目 操作给定的二叉树,将其变换为源二叉树的镜像。 数据范围:二叉树的节点数 0≤n≤1000, 二叉树每个节点的值 0≤val≤1000。 要求: 空间复杂度 O(n)。本题也有原地操作,即空间复杂度 O(1)的解法,时间…

windows系统中安装maven用来编译项目

1为什么要安装maven 作为一个编程小白,我们先看一下以前学java的时候,下载一个项目源码,是不是需要把所依赖的第三方jar包一起跟着源码打包放一起,这样别人的代码才能运行起来。这种方式不利于对jar包的管理,后来就出现…

力扣sql入门篇(三)

力扣sql入门篇(三) 1 修复表中的名字 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 SELECT user_id,CONCAT(upper(substring(name,1,1)),lower(substring(name,2,length(name)-1))) name FROM Users ORDER BY user_id;1.3 运行截图 2 按日期分组销…

计算机网络学习笔记(谢希仁版本)

计算机网络学习笔记 1. 概述 1.1 计算机网络在信息时代的作用 互联网基本特点: 连通性:互联网上用户不管距离多远,都能通信,就像这些用户终端都彼此连通 共享性:指资源共享,包含信息、软件、硬件等共享…

WebRTC的拥塞控制技术(Congestion Control)

\1. 概述 对于共享网络资源的各类应用来说,拥塞控制技术的使用有利于提高带宽利用率,同时也使得终端用户在使用网络时能够获得更好的体验。在协议层面上拥塞控制是TCP的一个总要的组成部分;但是对于非面向链接的传输层协议,如UDP&…

智慧城管违规摆摊沿街晾晒识别检测 python

智慧城管违规摆摊沿街晾晒识别检测通过opencvpython对现场画面中进行7*24小时不间断实时监测,当opencvpython城管违规摆摊沿街晾晒识别检测监测到沿街晾晒违规摆摊占道经营时,立即抓拍告警。OpenCV的全称是Open Source Computer Vision Library&#xff…

小侃设计模式(十九)-解释器模式

1.概述 解释器模式(Interpreter Pattern)是一种使用相对较少的模式,主要使用在编译解释等场景,例如:编译器、规则引擎解释、正则表达式解析等,这些语言又被称为领域特定语言(Domain Specific L…

【数据结构与算法】数据结构介绍与稀疏数组相关操作

文章目录一 数据结构介绍1 数据结构和算法的重要性2 数据结构和算法的关系3 线性结构和非线性结构(1)线性结构(2)非线性结构二 稀疏数组1 应用场景2 基本概念(1)基本介绍(2)压缩策略…

并发编程——1.进程与线程

目录1.进程与线程1.1.概述1.2.并行与并发本文笔记整理来自黑马视频https://www.bilibili.com/video/BV16J411h7Rd/?p1,相关资料可在视频评论区进行获取。 1.进程与线程 1.1.概述 (1)进程 程序由指令和数据组成,但这些指令要运…

2022 年度作品优秀大赏 | 开发者说·DTalk

岁聿云暮之际,回首 2022,开发者们一直在迈着坚定的步伐向顶峰攀登,我们也竭尽所能不断为大家提供帮助——操作系统 Android 13 完成 Beta 版到正式版的蜕变,开发工具 Flutter 3.3 全力支持您的跨平台之旅,应用平台 Goo…

并行、并发、同步、异步、阻塞、非阻塞

并行 是指两个或者多个事件在同一时刻发生。并行是在不同实体上的多个事件。 并行针对多核 CPU 而言,它指的是多个核心同时执行多个任务的能力 单核 CPU 无法并行,并行只可能发生在多核 CPU 中。 并发 是指两个或多个事件在同一时间间隔发生。并发是…

【观察】让行业AI“触手可及”,NVIDIA创新与实践“从未止步”

毫无疑问,今天AI正与产业结合得越来越紧密,从自动驾驶,到智慧医疗,智慧金融、智慧城市等,AI已经开始渗透到我们生活的方方面面。事实上,即便目前来自传统行业用户的AI转型需求尚未完全激活爆发,…

第一篇 AlexNet——论文翻译

文章目录摘要1 简介2 数据集3 架构 3.1 ReLU非线性3.2 多GPU训练3.3 局部响应归一化3.4 重叠池化3.5 整体架构4 减少过拟合4.1 数据增强4.2 失活(Dropout)5 学习细节6 结果6.1 定性评估7 探讨摘要 论文链接:http://www.cs.toronto.edu/~fritz/absps/imagenet.pdf …

VTK--交互方式vtkInteractorStyleTrackballCamera

前言:本博文主要介绍vtk中基于Camera的交互方式vtkInteractorStyleTrackballCamera 及其子类,小伙伴可以根据需求自定义交互方式。 目录 vtkInteractorStyleTrackballCamera vtkGeoInteractorStyle vtkInteractorStyleImage vtkInteractorStyleMult…

LeetCode刷题复盘笔记—一文搞懂动态规划之152. 乘积最大子数组问题(动态规划系列第三十六篇)

今日主要总结一下动态规划的一道题目,152. 乘积最大子数组 题目:152. 乘积最大子数组 Leetcode题目地址 题目描述: 给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字&…