Linux 驱动开发基础知识——总线设备驱动模型(七)

news2025/1/16 8:10:45

 个人名片:

🦁作者简介:学生
🐯个人主页:妄北y

🐧个人QQ:2061314755

🐻个人邮箱:2061314755@qq.com
🦉个人WeChat:Vir2021GKBS
🐼本文由妄北y原创,首发CSDN🎊🎊🎊
🐨座右铭:大多数人想要改造这个世界,但却罕有人想改造自己。

专栏导航:

妄北y系列专栏导航:

C/C++的基础算法:C/C++是一种常用的编程语言,可以用于实现各种算法,这里我们对一些基础算法进行了详细的介绍与分享。🎇🎇🎇

QT基础入门学习:对QT的基础图形化页面设计进行了一个简单的学习与认识,利用QT的基础知识进行了翻金币小游戏的制作🤹🤹🤹

Linux基础编程:初步认识什么是Linux,为什么学Linux,安装环境,进行基础命令的学习,入门级的shell编程。🍻🍻🍻

Linux应用开发基础开发:分享Linux的基本概念、命令行操作、文件系统、用户和权限管理等,网络编程相关知识,TCP/IP 协议、套接字(Socket)编程等,可以实现网络通信功能。💐💐💐

Linux项目开发:Linux基础知识的实践,做项目是最锻炼能力的一个学习方法,这里我们会学习到一些简单基础的项目开发与应用,而且都是毕业设计级别的哦。🤸🤸🤸


非常期待和您一起在这个小小的互联网世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨ 

文章介绍:

🎉本篇文章对Linux驱动基础学习的相关知识进行分享!🥳🥳🥳

前面我们已经对驱动的基础写法有了一个初步的了解,但是我们之前的写法扩展性特别低,当我们将我们的驱动用在其他开发板时候就可能需要再次修改代码,现在我们需要对驱动的框架进行更细致的学习,这样才能更增强它的扩展性,更加易于扩展。

如果您觉得文章不错,期待你的一键三连哦,你的鼓励是我创作动力的源泉,让我们一起加油,一起奔跑,让我们顶峰相见!!!💪💪💪

🎁感谢大家点赞👍收藏⭐评论✍️

一、驱动编写的 3 种方法

        以 LED 驱动为例。

1.1 传统方式

优缺点:

        使用哪个引脚,怎么操作引脚,都写死在代码中。

        最简单,不考虑扩展性,可以快速实现功能。

        修改引脚时,需要重新编译。

1.2 总线设备驱动模型

         引入 platform_device/platform_driver,将“资源”与“驱动”分离开

优缺点:

        代码稍微复杂,但是易于扩展。

        冗余代码太多,修改引脚时设备端的代码需要重新编译。

        更换引脚时,图 9.3 中的 led_drv.c 基本不用改,但是需要修改 led_dev.c

1.3 设备树

优缺点:

        通过配置文件──设备树来定义“资源”

        代码稍微复杂,但是易于扩展。

        无冗余代码,修改引脚时只需要修改 dts 文件并编译得到 dtb 文件,把它传 给内核。

        无需重新编译内核/驱动。

二、在 Linux 中实现“分离”:Bus/Dev/Drv 模型

2.1 匹配规则 

2.1.1 最先比较

        platform_device.driver_override platform_driver.driver.name

        可以设置 platform_device driver_override,强制选择某个 platform_driver

2.1.2 然后比较

        platform_device. nameplatform_driver.id_table[i].name

        platform_driver.id_table 是“platform_device_id”指针,表示该 drv 支持若干个 device,它里面列出了各个 device{.name, .driver_data},其中的“name”表示该 drv 支持的设备的名字driver_data 是些提供给该 device 的私有数据

2.1.3  最后比较

        platform_device.name platform_driver.driver.name

        platform_driver.id_table 可能为空, 这时可以根据 platform_driver.driver.name 来寻找同名的 platform_device

2.2.4 函数调用关系

platform_device_register
platform_device_add
     device_add
         bus_add_device // 放入链表
         bus_probe_device // probe 枚举设备,即找到匹配的(dev, drv)
             device_initial_probe
                 __device_attach
                     bus_for_each_drv(...,__device_attach_driver,...)
                         __device_attach_driver
                             driver_match_device(drv, dev) // 是否匹配
                             driver_probe_device // 调用 drv 的 probe
platform_driver_register
__platform_driver_register
     driver_register
         bus_add_driver // 放入链表
             driver_attach(drv)
                 bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);
                     __driver_attach
                         driver_match_device(drv, dev) // 是否匹配
                         driver_probe_device // 调用 drv 的 probe

2.2 常用函数

2.2.1 注册/反注册

platform_device_register/ platform_device_unregister
platform_driver_register/ platform_driver_unregister
platform_add_devices // 注册多个 device

2.2.2  获得资源

返回该 dev 中某类型(type)资源中的第几个(num)

struct resource *platform_get_resource(struct platform_device *dev, unsigned int 
                                        type,
                                        unsigned int num)

返回该 dev 所用的第几个(num)中断: 

int platform_get_irq(struct platform_device *dev, unsigned int num)

通过名字(name)返回该dev 的某类型(type)资源: 

struct resource *platform_get_resource_byname(struct platform_device *dev, 
                                                unsigned int type, 
                                                const char *name)

通过名字(name)返回该 dev 的中断号: 

int platform_get_irq_byname(struct platform_device *dev, const char *name)

三、怎么写程序 

3.1 分配/设置/注册 platform_device 结构体

         在里面定义所用资源,指定设备名字。

3.2 分配/设置/注册 platform_driver 结构体

        在其中的 probe 函数里,分配/设置/注册 file_operations 结构体。

        并从 platform_device 中确实所用硬件资源。

        指定 platform_driver 的名字

大佬觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥任务在无形中完成,价值在无形中升华,让我们一起加油吧!🌙🌙🌙

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

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

相关文章

一道CTF签到题

点击题目的签到,提示: 看来需要修改请求的源地址: 上来我先尝试了我最常用的xff,结果不行,于是尝试了其他的几个常用请求头: 1.host头 如果后端从host取值来判断是否是本地就可以通过此方法进行绕过&…

简洁思路推理 KMP 算法——子字符串匹配

例题 28. 找出字符串中第一个匹配项的下标 暴力遍历解法 枚举原串 ss 中的每个字符作为「发起点」,每次从原串的「发起点」和匹配串的「首位」开始尝试匹配: 匹配成功:返回本次匹配的原串「发起点」。 匹配失败:枚举原串的下一个…

Python实战:将爬虫获取到的数据存到数据库中

在前几篇 Python 实战中,我们直接把爬虫获取到的数据存储到 excel 文件或者 csv 文件中。今天,我们将爬虫获取到的数据存储到数据库中。 而存到数据库中,我们可以选择 MySQL、PostgreSQL、SqLite、Sql Server 等数据库。 在这些数据库中 Sq…

重装Windows系统出现Windows无法安装到这个磁盘,选中的磁盘采用GPT分区

文章目录 1.问题描述2.问题解决 1.问题描述 重装Windows系统时,出现Windows无法安装到这个磁盘,选中的磁盘采用GPT分区这个提示 2.问题解决 1.shiftF10,打开命令行 2.输入:diskpart (打开分区工具) 3.输入:list di…

C语言“%”运算符是否可以对小数进行运算?

一、问题 “&#xff05;”运算符是否可以对⼩数进⾏运算&#xff1f; 二、解答 “&#xff05;”运算符&#xff0c;称为求余运算符或者模运算符&#xff0c;要求“&#xff05;”两侧都为整型数据&#xff0c;否则将会产⽣错误 #include <stdio.h> int main() {floa…

电路笔记 :MOS场效应晶体管+红外遥控+AMS1117 电源模块

三极管&#xff08;BJT&#xff0c;Bipolar Junction Transistor&#xff09;和 MOSFET&#xff08;Metal-Oxide-Semiconductor Field-Effect Transistor&#xff09;是两种不同类型的晶体管&#xff0c;它们在工作原理、性能特性和应用方面有一些重要的区别。 结构和工作原理…

Qt项目文件以及对象树

"在哪里走散&#xff0c;你都会找到我~" 前篇&#xff0c;我们仅仅对Qt创建了第一个简单的项目。相比于使用其他IDE创建工程项目&#xff0c;Qt会为自动创建诸如&#xff1a;.pro、.h\.cpp、.iu等文件&#xff0c;这些文件到底是什么&#xff1f;我们在使用Qt时 应该…

欢迎来到 Greasy Fork,这里是一个提供用户脚本的网站。

官方地址&#xff1a; https://greasyfork.org/zh-CN 欢迎来到 Greasy Fork&#xff0c;这里是一个提供用户脚本的网站。 脚本适用于&#xff1a; baidu.com bilibili.com qq.com iqiyi.com sohu.com 更多… 用户脚本是什么&#xff1f; 用户脚本是一段代码&#xff0c;它们能…

前端——CSS

目录 文章目录 前言 一.CSS简介 1.CSS选择器 2.CSS选择器语法 3.CSS样式引入 4.CSS 高级选择器 二.CSS样式 1.字体 ​编辑 2.文本 3. 背景 4.边框 5.边距 6.浮动 7.清除浮动 8.定位 9. 列表样式 10.伪类样式 三.盒子模型 四.CSS3新特性 1.边框 2.盒子阴影 …

win11设置mysql开机自启

目录 命令式 1、打开命令提示符或 PowerShell&#xff1a; 2、使用管理员权限运行命令行工具&#xff1a; 3、设置 MySQL 服务为开机自启动&#xff1a; 4、启动 MySQL 服务&#xff1a; 5、 验证设置是否生效&#xff1a; 操作视图式 1、右击任务栏 ---> 选择任务管…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--强化学习、模仿学习、机器人、开放词汇

专属领域论文订阅 关注{晓理紫|小李子}&#xff0c;每日更新论文&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 如果你感觉对你有所帮助&#xff0c;请关注我&#xff0c;每日准时为你推送最新论文。 分类: 大语言模型LLM视觉模型VLM扩散模型视觉…

经典目标检测YOLO系列(三)YOLOV3的复现(1)总体网络架构及前向处理过程

经典目标检测YOLO系列(三)YOLOV3的复现(1)总体网络架构及前向处理过程 和之前实现的YOLOv2一样&#xff0c;根据《YOLO目标检测》(ISBN:9787115627094)一书&#xff0c;在不脱离YOLOv3的大部分核心理念的前提下&#xff0c;重构一款较新的YOLOv3检测器&#xff0c;来对YOLOv3有…

网络安全科普:SSL证书保护我们的网上冲浪安全

当我们在线上愉快冲浪时&#xff0c;各类网站数不胜数&#xff0c;但是如何判定该站点是安全还是有风险呢&#xff1f; 当当当&#xff0c;SSL数字证书登场&#xff01;&#xff01; SSL证书也称为数字证书&#xff0c;是一种用于保护网站和用户之间通信安全的加密协议。由权…

SERVLET生命周期API

SERVLET生命周期API 在servlet的生命周期中,将发生创建Servlet上下文、创建会话、向Servlet上下文添加属性等各种事件。在servlet的生命周期内发生事件时,Web容器将通知侦听器类。要接收事件的通知,侦听器类需要扩展Servlet API的侦听器接口。 1. 事件类型 servlet生命周期…

DeepL 解除翻译文档的编辑限制

在使用DeepL官网翻译文档时&#xff0c;您可能会遇到无法编辑的问题。本文将详细介绍如何解除密码限制&#xff0c;使DeepL翻译文档变得可编辑。 第一步&#xff1a;文档翻译和下载 将需要翻译的文档上传至DeepL&#xff0c;进行整篇文档翻译。完成翻译后&#xff0c;下载翻译…

yum指令——Linux的软件包管理器

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 什么是软件包yum指令1.yum 是什么&#xff1f;2.Linux系统&#xff08;Centos&#xff09;的生态 3.yum的相关操作安装卸载yum的相关操作小结 软件源安…

[攻防世界]-Web:inget解析

查看网页 很明显&#xff0c;他是要我们输入id 这里我尝试了直接爆破&#xff0c;没有成功 解法一&#xff08;用万能密码&#xff09;&#xff1a; payload如下&#xff1a; 我这里还尝试了id1 or true # 没有成功&#xff0c;应该是题目把#给过滤了 解法二&#xff1a; …

【Javaweb程序设计】【C00165】基于SSM的高考志愿辅助填报系统(论文+PPT)

基于SSM的高考志愿辅助填报系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的高考志愿辅助填报系统 本系统分为前台系统模块、后台管理员模块以及后台学生模块 前台系统模块&#xff1a;当游客打开系统的网址后&…

网络编程套接字(2)

UDP数据报套接字编程 API介绍 DatagramSocket DatagramSocket是UDP的Socket,用于发送和接收数据报. 操作系统中有一类文件,就叫做socket文件(普通文件/目录文件:在硬盘上的) socket文件:抽象的表示了网卡这样的硬件设备 DatagramSocket就是对socket文件进行读写,也就是借助网…

【Java】Spring注解开发

一、Spring注解开发 1 注解开发定义Bean对象【重点】 目的&#xff1a;xml配置Bean对象有些繁琐&#xff0c;使用注解简化Bean对象的定义 问题导入 问题1&#xff1a;使用什么标签进行Spring注解包扫描&#xff1f; 问题2&#xff1a;Component注解和Controller、Service、R…