嵌入式Linux驱动开发——常见框架梳理

news2024/11/26 10:43:29

前言

本文主要介绍了Linux驱动开发中一些常用的驱动框架,platform、input、iic、spi等,硬件平台使用的是正点原子的imx6ull开发板。

一:Pinctrl子系统、Gpio子系统

不管什么框架最后都是要追溯到配置IO的电气属性和复用功能

如果要使用外部中断,设备树节点中还需添加相关信息,什么边沿触发

二:最简单字符驱动框架(不包含什么总线)

1:module_init和module_exit,驱动的入口和出口

2:习惯性构建一个结构体来管理相关资源(主次设备号、cdev、class、device、设备节点等)

3:file_operations结构体里面包含了该设备驱动的操作函数集合,可以按需进行实现

file_operations结构体的原型,里面都是一些函数指针

驱动实现部分操作函数 

4:init函数实现字符设备相关初始化

分配设备号、cdev_init、cdev_add、class_create、device_create

获取节点、获取gpio编号、申请gpio、设置输入输出模式

如果在某一过程申请资源失败要释放之前已经申请成功的资源

5:exit函数释放相关资源

三:定时器、中断配置

定时器和中断在驱动设备中要添加的内容

 

定时器初始化

重新修改定时器计数,使得可以多次定时

外部中断

四:platform总线驱动框架

1:首先是module_init和module_exit,初始化一个platform_driver结构体,主要初始化匹配列表和probe、remove函数

驱动中对应的compatible字段

设备树中设备对应的compatible字段

当加载驱动后就会通过compatible字段查找,驱动和设备就可通过platform总线进行匹配。后面就和最简单没有总线的框架一样、其实就是套了一层皮。

五:MISC杂项驱动框架(主设备号是10)

大框架还是platform驱动框架,要添加一个miscdevice类型结构体

在probe中注册、remove中销毁,减少了分配设备号、cdev、class、device那繁琐的一套

六:INPUT(主设备都是13)子系统驱动框架

设备结构体中要添加一个输入设备

在init中申请和注册、exit中取消注册和释放

设置事件和值(type、code、value)

使用input_event函数上报事件

上报的数据可以使用hexdump观察

应用层可以使用一个input_event结构体变量来接收上报的数据

七:IIC驱动框架

首先module_init和module_exit,添加一个i2c_driver,对应init完成i2c_add_driver,exit中完成i2c_del_driver

同样的,设备和驱动匹配还是要靠compatible属性

 ​​​

当设备树节点和驱动文件匹配之后,执行probe函数,会传入i2c_client类型的一个结构体指针,可以使用一个指针变量保存下来,当在i2c读写寄存器的时候会用得到。

设备中定义一个指针进行保存

I2C读数据

I2C写数据

八:SPI驱动框架

首先module_init和module_exit,创建一个spi_driver类型的结构体变量,init中spi_register_driver、exit中spi_unregister_driver

设备树相关信息

 ​​​​

当执行到probe函数的时候会传入一个spi_device类型的结构体,像i2c驱动一样找一个变量存起来

设备中定义一个指针用来接收spi_device类型的指针

设置spi设备的工作模式

spi读写寄存器可以使用内核自带的spi_read和spi_write,其中都要传入类型为spi_device的参数,就是在调用probe传入的那个。

总结

以上只是对学习驱动这段时间的一个梳理和回顾,想系统学习可以阅读正点的教程。

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

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

相关文章

一起学数据结构(1)——复杂度

目录 1. 时间复杂度: 1.1 时间复杂度的概念: 1.2 时间复杂度的表示及计算: 1.3 较为复杂的时间复杂度的计算: 2. 空间复杂度: 2.1 空间复杂度的概念: 2.2 空间复杂度的计算: 1. 时间复杂度…

Kubernetes 简介:容器编排与集群管理的进化

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

Mybatis-plus从入门到精通

1、什么是MyBatis-Plus MyBatis-Plus(简称MP)是一个基于MyBatis的增强工具,在MyBatis的基础上对其进行扩展,用于简化MyBatis操作,提高开发效率。它继承了MyBatis原生的所有特性,并且添加了一些额外的功能&…

《TCP IP网络编程》第十章

第 10 章 多进程服务器端 10.1 进程概念及应用 并发服务端的实现方法: 通过改进服务端,使其同时向所有发起请求的客户端提供服务,以提高平均满意度。而且,网络程序中数据通信时间比 CPU 运算时间占比更大,因此&#…

探析国内数字孪生引擎技术现状

在数字孪生软件来发中,渲染引擎是一个关键点,国内大多数字孪生平台引擎通常使用的是自研的渲染引擎或者采用开源的渲染引擎。下面通过一些常见的渲染引擎在国内数字孪生引擎中的应用带大家了解数字孪生软件开发的方式。 自研渲染引擎:许多数…

CNN + Vision Transformer 结合学习

介绍三篇结合使用CNNTransformer进行学习的论文:CvT(ICCV2021),Mobile-Former(CVPR2022),SegNetr(arXiv2307). CvT: Introducing Convolutions to Vision Transformers, …

利用 trait 实现多态

我在书上看到基于 std::io::Write 的示例,它是一个 trait 类型,内部声明了一些方法。和 go 语言不同,rust 中类型必须明确实现 trait 类型,而 go 语言属于 duck 模式。 std::io::Write下面的例子中调用 write_all 方式来演示&…

标签是系列色并且加粗帆软

标签是系列色并且加粗 function(){return <span style"color:this.color;">FR.contentFormat(this.value, #,##0)</span>;}

UI 自动化的 PageObject 设计模式

目录 前言&#xff1a; 什么是 PageObject 模型&#xff1f; 为什么使用 PageObject 模型&#xff1f; PO 模式优点 PageObject 实践 前言&#xff1a; UI 自动化是一种软件测试方法&#xff0c;它主要用于检查应用程序的用户界面是否符合预期。PageObject 是 UI 自动化中…

AI大模型时代下运维开发探索第一篇:ReAct工程初探

引子 人工智能大模型的出现&#xff0c;已渐渐地影响了我们的日常生活和工作方式。生活中无处不在的AI&#xff0c;使我们的生活变得更加智能和便捷。工作中&#xff0c;AI大模型的高效和精准&#xff0c;极大地提升了我们解决问题的效率。 是的&#xff0c;我们不能忽视AI大…

Delphi 开发者,显示图片请忘掉VCL中的 TImage 吧

目录 序言 使用TImageCollection和TVirtualImageList组件支持高分辨率图像 一、总览 二、使用图像收集组件TImageCollection 2.1 图像收集组件编辑器 2.2 将现有 TImageList 载入 TImageCollection 三、使用Virtual ImageList 组件 3.1 Virtual ImageList Component 编辑…

【数据结构】| 王道考研——树的前世今生

目录 一. &#x1f981; 前言二. &#x1f981; 各种树的知识点1. 树1.1 概念1.2 属性1.3 常考性质1.4 树转换成二叉树1.5 森林转换为二叉树1.6 二叉树转换为森林1.7 树的遍历1.8 森林的遍历 2. 二叉树2.1满二叉树2.2 完全二叉树2.3二叉排序树2.4 平衡二叉树2.5 二叉树常考性质…

IDEA使用lombok实体类加上@Data注解后无法找到get和set方法

文章目录 一、问题原因二、解决方法1.File→Settings2.Plugins→搜索"lombok"→Install3.Restart IDE&#xff08;重启IDEA&#xff09; 一、问题原因 IDEA没有安装lombok插件 二、解决方法 1.File→Settings 2.Plugins→搜索"lombok"→Install 3.Restart…

北斗定位导航系统,北斗模块应用领域发展概况_北斗二号模块,北斗三号模块

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、北斗系统概述1.1 空间段1.2 地面控制段1.3 用户段1.4 坐标系统1.5 时间系统 二、北斗系统定位导航授时服务2.1 服务概述2.2 服务区2.3 北斗信号频段2.4 北斗…

服务器中了Locked勒索病毒怎么解决,勒索病毒解密恢复方式与防护措施

服务器是企业重要数据存储和处理的关键设备&#xff0c;然而&#xff0c;众所周知&#xff0c;服务器系统并非完全免受网络攻击的。其中一种常见的威胁是勒索病毒&#xff0c;其中一种恶名昭彰的变种是Locked勒索病毒。Locked勒索病毒采用了对称AES与非对称RSA的加密形式&#…

【C++入门到精通】C++入门 —— 引用、内联函数

目录 一、引用 1.引用的概念 2.引用的特性 3.常引用 4.引用的使用场景 ⭕做参数 ⭕做返回值 5.传值、传引用效率比较 值和引用的作为返回值类型的性能比较 6.引用和指针的区别 引用和指针的不同点 二、内联函数 1.内联函数的概念 2.内联函数的特性 3.宏与内联函数 …

RocketMQ教程-(5)-功能特性-顺序消息

顺序消息为 Apache RocketMQ 中的高级特性消息&#xff0c;本文为您介绍顺序消息的应用场景、功能原理、使用限制、使用方法和使用建议。 应用场景​ 在有序事件处理、撮合交易、数据实时增量同步等场景下&#xff0c;异构系统间需要维持强一致的状态同步&#xff0c;上游的事…

13.4.2 【Linux】sudo

相对于 su 需要了解新切换的使用者密码 &#xff08;常常是需要 root 的密码&#xff09;&#xff0c; sudo 的执行则仅需要自己的密码即可。sudo 可以让你以其他用户的身份执行指令 &#xff08;通常是使用 root 的身份来执行指令&#xff09;&#xff0c;因此并非所有人都能够…

Spring 多数据源方法级别注解实现

Spring框架提供了多种数据源管理方式&#xff0c;其中多数据源管理是其中之一。多数据源管理允许应用程序使用多个数据源&#xff0c;而不是只使用一个数据源&#xff0c;从而提高了应用程序的灵活性和可靠性。 多数据源管理的主要目的是让应用程序能够在不同的数据库之间切换&…

SpringCache 框架使用以及序列化和缓存过期时间问题的解决

目录 为什么使用Spring Cache 如何使用Spring Cache 1 加依赖 2 开启缓存 3 加缓存注解 序列化以及过期时间等问题 解决方案&#xff1a;自定义序列化方式 1.自定义序列化方式并设置白名单 2.配置并设置缓存的过期时间 为什么使用Spring Cache 缓存有诸多的好处&#x…