Linux驱动学习笔记(六)

news2025/3/23 13:48:24
平台总线

1.平台总线模型也叫platform总线模型,平台总线是Linux系统虚拟出来的总线, 引入总线的概念可以对驱动代码和设备信息进行分离。平台总线模型将一个驱动分成了两个部分:platform_device和platform_driver,例如可使用文件device.c和driver.c来分别描述这两部分,device.c用来描述硬件,driver.c用来控制硬件,平台总线通过字符串比较来match,将name相同的device.c和driver.c匹配到一起来控制硬件。

2.platform设备驱动(device.c)里面写的是硬件资源,这里的硬件资源指的是寄存器地址,中断号以及其他硬件资源等。在Linux内核里面用struct platform_device结构体来描述硬件资源。这个结构体定义在include/linux/platform_device.h文件当中,如下图:

在struct platform_device中,name为设备名称,总线进行匹配时,会比较设备和驱动的名称是否一致。设备驱动注册成功之后,可以在/sys/bus/platform/devices/目录下看到对应的name;id是一个编号,Linux用这个id来区分同名设备,id会跟在设备名后面以后缀形式显示,若将id设置为-1表示设备名后面没有后缀;id_auto表示是否自动设置id,若设置了设备名后面会跟上auto的后缀;dev表示设备的通用属性部分,struct device结构定义在include/linux/device.h中,必须实现该结构体中的void  (*release)(struct device *dev);成员函数,否则驱动会报错;resource用于定义硬件资源信息,struct resource定义在include/linux/ioport.h中,如下图:

在struct resource结构体中,start和end分别表示资源的起始信息和终止信息,name表示存储的资源名,flags表示存储资源的类型,可取下图中的值(只截取了一部分,具体参考include/linux/ioport.h):

struct platform_device中的num_resources记录资源的总个数。/sys/bus/platform/devices/目录下的内容示例如下:

如上图中的alarmtimer.0.auto表示一个名为alarmtimer的设备,编号为0,标号是自动分配的。int platform_device_register(struct platform_device *device)和void platform_device_unregister(struct platform_device *device)函数分别用于注册和卸载platform设备(device.c)(可参考讯为Linux驱动视频第六期P2)。

3.platform设备驱动(driver.c)里面写的是软件驱动,在driver.c文件中首先需要定义一个platform_driver结构体,然后去实现这个结构体中的各个成员变量,当driver.c和device.c匹配成功以后,会执行driver.c里面的probe函数,所以probe函数是必须被实现的。platform_driver定义在include/linux/platform_device.h文件当中,如下图:

struct platform_driver结构体中的probe函数在device.c和driver.c匹配成功时会被自动执行,不论先insmod加载device.ko还是先insmod加载driver.ko都会执行probe函数。remove函数在platform_driver_unregister()被调用时会被执行。id_table用于记录一组待匹配的设备名。struct device_driver定义在include/linux/device/driver.h,它也有一个name成员记录设备名,但是优先级没有id_table高,匹配时会优先使用id_table中的名字。int platform_driver_register(struct platform_driver *driver)和void platform_driver_unregister(struct platform_driver *driver)函数分别用于注册和卸载platform设备(driver.c)。设备驱动注册成功之后,可以在/sys/bus/platform/drivers/目录下看到对应的name(可参考讯为Linux驱动视频第六期P4)。在probe函数中可以通过其实参直接获取platform_device中的硬件信息,也可以通过函数struct resource *platform_get_resource(struct platform_device *,unsigned int,unsigned int);获取,该函数的第一个参数是指向目标platform_device的指针,第二个参数是目标资源的类型,例如IORESOURCE_IRQ,第三个参数是目标资源在同类资源中的索引号(注意是同类资源,索引从0开始,具体可参考讯为Linux驱动视频第六期P6)。可以将平台总线模型与前几期的字符设备、杂项设备、并发与竞争、中断等知识结合起来使用,具体可参考讯为Linux驱动视频第六期P8、P10。

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

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

相关文章

w264民族婚纱预定系统

🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…

Compose 实践与探索十五 —— 自定义触摸

1、自定义触摸与一维滑动监测 之前我们在讲 Modifier 时讲过如下与手势检测相关的 Modifier: Modifier.clickable { } Modifier.combinedClickable { } Modifier.pointerInput {detectTapGestures { } }这里对以上内容就不再赘述了,直接去讲解更复杂的…

炫酷的3D按钮效果实现 - CSS3高级特性应用

炫酷的3D按钮效果实现 - CSS3高级特性应用 这里写目录标题 炫酷的3D按钮效果实现 - CSS3高级特性应用项目介绍核心技术实现1. 基础结构设计2. 视觉效果实现2.1 背景渐变2.2 立体感营造 3. 交互动效设计3.1 悬停效果3.2 按压效果 技术要点分析1. 深度层次感2. 动画过渡3. 性能优…

teaming技术

一.介绍 在CentOS 6与RHEL 6系统中,双网卡绑定采用的是bonding技术。到了CentOS 7,不仅能继续沿用bonding,还新增了teaming技术。在此推荐使用teaming,因其在查看与监控方面更为便捷 。 二.原理 这里介绍两种最常见的双网卡绑定…

【JavaEE进阶】Linux常用命令

目录 🍃前言 🌴pwd 与 ls 🚩pwd 🚩ls 🎍cd 🌲mkdir与touch 🚩mkdir 🚩touch 🍀cat与rm 🚩cat 🚩rm 🎋vim 🚩…

【FastGPT】利用知识库创建AI智能助手

【FastGPT】利用知识库创建AI智能助手 摘要创建知识库上传文档创建应用准备提示词准备开场白关联知识库AI回答效果 摘要 关于FastGPT的部署,官方提供了docker-compose方式的部署文档,如果使用的是podman和podman-compose的同学,可以参考这篇…

【DeepSeek 学c++】dynamic_cast 原理

用于向下转化。 父类引用指向指类对象 假设父亲是a, 子类是b. B* pb new B; 子类对象 A* pa 父类引用指向子类对象, 那么向上转化 Apa pb 这个是自动完成的,隐式转化,不需要dynamic_cast 向下转化指的是 A pa new B。 这个是指向子类对象…

【递归,搜索与回溯算法篇】- 名词解释

一. 递归 1. 什么是递归? 定义: 函数自己调用自己的情况关键点: ➀终止条件: 必须明确递归出口,避免无限递归 ➁子问题拆分: 问题需能分解成结构相同的更小的子问题缺点: ➀栈溢出风险&#x…

Beans模块之工厂模块注解模块@Qualifier

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…

数据结构---图的深度优先遍历(DFS)

一、与树的深度优先遍历之间的联系 1.类似于树的先根遍历。 递归访问各个结点: 2.图的深度优先遍历 先设置一个数组,初始值全部设置为false,先访问一个结点,在用一个循环,依次检查和这个结点相邻的其他结点&#xff0c…

健康养生:拥抱生活,从呵护身心开始

在这个瞬息万变的时代,人们好似不停旋转的陀螺,在忙碌中迷失了对健康的关注。然而,健康养生绝非可有可无的点缀,它是幸福生活的基石,如同阳光与空气,滋养并支撑着我们的生命。当我们懂得拥抱健康养生&#…

QT网页显示的几种方法及对比

一.直接跳转打开网页 1.使用QDesktopServices::openUrl调用系统浏览器 原理:直接调用操作系统默认浏览器打开指定URL,不在应用程序内嵌入网页。 优点: 实现简单,无需额外模块或依赖。 适用于仅需跳转外部浏览器的场景。 缺点&…

Linux python 安装 conda(内部自带的有python的版本了)

位置网站 https://repo.anaconda.com/miniconda/也可以在https://www.anaconda.com/download/success 官方下载之后方linux中 切换路径之后 执行 bash Miniconda3-py310_25.1.1-2-Linux-x86_64.sh [rootVM-4-5-centos ~]# [rootVM-4-5-centos ~]# uname -a Linux VM-4-5-cen…

git原理与常用命令及其使用

认识工作区、暂存区、版本库 ⼯作区:是在电脑上你要写代码或⽂件的⽬录。 暂存区:英⽂叫 stage 或 index。⼀般存放在 .git ⽬录下的 index ⽂件(.git/index)中,我们 把暂存区有时也叫作索引(index&#xf…

19681 01背包

19681 01背包 ⭐️难度:中等 🌟考点:动态规划、01背包 📖 📚 import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class Main {static int N 10001…

Guava:Google开源的Java工具库,太强大了

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

蓝桥杯每日一题----海底高铁

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 题目链接 P3406 海底高铁 - 洛谷https://www.luogu.com.cn/problem/P3406 解题思路 在这道题来说,主要使用的想法就是使用一维的差分数组,这道题中有两个买…

触动精灵对某东cookie读取并解密--记lua调用C语言

在Mac上构建Lua扩展模块:AES解密与Base64解码实战 今天我要分享一个实用技术:如何在Mac系统上为Lua编写和编译C扩展模块,特别是实现一个某东iOS PIN码解密功能的扩展。这对于需要在Lua环境中执行高性能计算或使用底层系统功能的开发者非常有…

【设计模式】三十二、策略模式

系列文章|源码 https://github.com/tyronczt/design-mode-learn 文章目录 系列文章|源码一、模式定义与核心思想二、模式结构与Java实现1. 核心角色2. Java代码示例 三、策略模式的五大核心优势四、适用场景五、与其他模式的对比六、最佳实践建议总结 🚀进阶版【更…

Cyberchef实用功能之-json line格式文件美化和查询

本文将介绍一下如何使用cyberchef对json line格式数据进行美化方便阅读,以及json line格式数据的批量查询操作。 之前的文章介绍了json格式数据的美化和查询,即Cyberchef实用功能之-json解析美化和转换,Cyberchef实用功能之-批量提取json数据…