【IMX6ULL驱动开发学习】11.驱动设计之面向对象_分层思想(学习设备树过渡部分)

news2024/11/14 11:12:33

一个可移植性好的驱动程序,应该有三个部分组成
1、驱动框架程序(xxx_drv.c) — 对接应用层的 open read write 函数,不做GPIO具体操作
2、硬件操作程序(xxx_chip_gpio.c)— 执行具体的GPIO操作,初始化、读写
3、硬件资源定义程序(xxx_board.c,这在之后就过渡成了设备树)— 为第二层提供硬件资源,哪一组GPIO?第几个引脚?

经过分层之后,我们需要添加一个新的外设时,只需要做两个步骤:
(1)在 xxx_board.c 中添加硬件引脚资源
(2)在 xxx_chip_gpio.c 中添加具体的GPIO初始化、控制等操作
驱动层的 xxx_drv.c 根本不需要怎么修改


前几天自己总结了个图,也是帮助自己梳理思路
看上去有些乱,不过只要学过韦东山老师视频的
https://www.bilibili.com/video/BV1w4411B7a4?p=105&vd_source=fcd24cb292784bee4d86583df11ae49f
耐心看看应该会觉得思路清晰的
下图看不清楚,图片下载地址在这里
驱动分层框架图下载: 驱动分层框架图.jpg (图片有80多M,请耐心加载哦)
全部代码在我的 gitee 仓库中的 “09.led_platform_drv_chip_board_demo” 文件夹中,需要自取
gitee 仓库:https://gitee.com/chenshao777/imx6-ull_-drivers
在这里插入图片描述
粗略的解释一下流程,细说的话太麻烦了,这里主要介绍驱动分层思想的大概流程,也是为自己今后复习的时候帮助回忆

驱动分层思想

1、 首先是驱动程序(xxx_drv.c)的 file_operations 结构体,该结构体关联了应用层的文件IO函数与驱动层的函数
在这里插入图片描述
以led驱动为例

应用层驱动层
openled_open
readled_read
writeled_write

2、 硬件操作程序(xxx_chip_gpio.c)中的 platform_driver 结构体,加载完ko文件后(即驱动文件),内核会自动帮它寻找 name 匹配的 platform_device 结构体,从其中获取到硬件资源,然后创建设备节点(/dev/ledx)
在这里插入图片描述
匹配到硬件资源层的 platform_device 结构体后,内核会自动调用其 probe 函数,在 probe 函数中创建设备节点
PS:创建设备节点需要驱动框架层的设备类对象,所以这里需要在设备框架层中为硬件操作层提供对应函数
在这里插入图片描述


3、硬件资源定义程序中platform_device 结构体,该结构体中定义了与硬件操作层中 platform_driver 对应的 name 成员和硬件引脚资源 resource

在这里插入图片描述
PS:注意要设置 dev 成员下的 release 属性,如果不加的话卸载驱动时会报警告
在这里插入图片描述
4、硬件资源层中硬件资源的定义,硬件资源有个特定的结构体 resource ,可以参照Linux内核中其他文件对其的定义来写。
在这里插入图片描述
PS:GPIO_PIN是一个宏,为了方便将GPIO组和是第几个引脚组合起来而定义

#define     GPIO_PIN(g,p)     ((g << 16) | p)

5、 更多的细节在图片中看吧,今天先写到这里,下一篇博客介绍设备树的使用

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

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

相关文章

传输层解析

目录 传输层解析 传输层概述 传输层的作用 传输层的协议 TCP协议概述 UDP协议概述 TCP协议 TCP的封装格式 TCP的连接与断开 TCP的流控与差错控制 TCP的计时器 TCP的应用 UDP协议 UDP的封装格式 UDP的应用 UDP的流程与差错控制 传输层解析 传输层概述 传输层的…

一招搞定电脑提示“由于找不到XINPUT1_3.dll,无法继续执行代码”问题

玩游戏或者运行程序软件的时候&#xff0c;电脑提示“由于找不到XINPUT1_3.dll&#xff0c;无法继续执行代码”是怎么回事呢&#xff1f;其实xinput1_3.dll是Windows操作系统中的一个动态链接库文件&#xff0c;它是DirectX API的一部分&#xff0c;用于提供对输入设备的支持&a…

CSS之定位

作用&#xff1a;灵活的改变盒子在网页中的位置 实现&#xff1a; 1.定位模式&#xff1a;position 2.边偏移&#xff1a;设置盒子的位置 leftrighttopbottom 相对定位 position: relative 特点&#xff1a; 不脱标&#xff0c;占用自己原来位置显示模式特点保持不变设…

【Python】异常处理 ⑤ ( 异常传递 | 异常处理顺序 | 代码示例 )

文章目录 一、Python 异常传递1、异常传递性2、代码示例 - 异常传递性3、代码示例 - 在指定位置处理异常 一、Python 异常传递 1、异常传递性 在 Python 中 , 异常是具有传递性的 , 该特性是 Python 中的一个重要特性 , 它使得代码更加健壮和可靠 ; 异常传递 指的是 在代码中捕…

提高办公效率用什么?表单开发工具好不好用?

在办公流程化繁盛发展的今天&#xff0c;越来越多的企业希望通过专业的软件和工具提升办公协作效率&#xff0c;朝着数字化和流程化管理的方向靠近。那么&#xff0c;如何提高办公效率&#xff1f;如何提高表格制作质量和效率&#xff1f;表单开发工具是专业的办公软件平台之一…

ORACLE透明网关ODBC连接MYSQL

客户需求oracle访问mysql数据&#xff0c;客户是linux7.3 11.2.0.4单实例&#xff0c;字符集GBK&#xff0c;mysql是5.7.31&#xff0c;字符集UTF8&#xff0c;下面结合网上的文档和自己的实践&#xff0c;配置过程如下 1.安装oracle透明网关 首先在oracle服务器上面安装ora…

【看完就会】Jmeter接口测试之断言详解

什么是断言&#xff1f; 断言&#xff0c;这是一个软件术语&#xff0c;简单来说&#xff0c;就是依靠软件程序自动判断操作结果的正确性。在接口测试中&#xff0c;这里的断言就是判断接口请求是否符合预期&#xff0c;从而判断接口用例是否执行通过。 你应该也听过一个概念…

【JS经验分享】你真的会写JS吗?满满干货,建议读三遍(1)

大家好&#xff0c;最近准备总结一下JS的经验&#xff0c;分享分享&#xff0c;有不对的欢迎讨论哈~ JS作为前端的基础技能&#xff0c;每一位前端开发都要运用熟练&#xff0c;但你真的会写JS吗&#xff1f;js全称JavaScript&#xff0c;是运行在浏览器上的脚本语言&#xff0…

SAP MM 物料主数据配置

物料主数据的管理不仅仅需要引起MM顾问的重视&#xff0c;同样也需要SAP的客户足够重视。 在SAP的实施过程中。客户通常需要将一个或多个历史系统的数据根据规则转换成SAP的主数据 一个实施项目的成功与否的基本就是&#xff0c;数据是否被正确的导入 1.配置一个新的物料类型…

三个美观的个人博客网站源码

怎么让源码更适合你&#xff1f;改造&#xff01; 名称&#xff1a; 二开版UI漂亮的PHP博客论坛网站源码 介绍&#xff1a;可切换皮肤界面 下载&#xff1a;https://wwwf.lanzout.com/ihLNM10bfgnc 二、名称&#xff1a;Emlog Pro博客管理系统源码绿色版下载 介绍&#xff1…

【模拟CMOS集成电路设计】带隙基准(Bandgap)设计与仿真

【模拟CMOS集成电路设计】带隙基准&#xff08;Bandgap&#xff09;设计与仿真 前言一、 设计指标二、 电路分析三、 仿真测试3.1测试电路图3.2测试结果(1)基准温度系数仿真(2)瞬态启动仿真(3)静态电流仿真(4)线性调整率仿真(5)电源抑制PSR仿真 四、测试结果五、总结附录MOS器件…

地埋式积水监测系统在城市道路中的应用

伴随着汛期的到来&#xff0c;多地遭到大雨及暴雨的袭击&#xff0c;导致城市内涝现象频繁发生&#xff0c;使整个城市陷入瘫痪状态&#xff1b;交通道路受阻&#xff0c;严重影响了市民的生活&#xff0c;国家有关部门也因此出台了不少相关防涝政策。 积水监测系统可以加强城…

《WebGIS快速开发教程第二版》完成修订了

端午节过后各位小伙伴可能也要慢慢回归工作了&#xff0c;尽管不想工作不想烧脑但是没有办法&#xff0c;该干的活一样也少不了是吧&#x1f92a;。 趁着空闲时间我完成了《WebGIS快速开发教程》这本书 的修改工作。相对于第一版&#xff0c;第二版进行了如下改动&#xff1a;…

加密与解密 调试篇 静态分析技术 (三)枚举/IDC/插件

目录 1.枚举类型 2.FLIRT 1.应用FLIRT签名 3.IDC脚本 IDC分析加密代码 4.插件 5.IDA调试器 1.加载目标文件 2.调试器界面 ​编辑 3.调试跟踪 4.断点 5.跟踪 1.枚举类型 这是一段c语言源代码 #include <stdio.h> int main(void) {enum weekday { MONDAY, TUE…

Redis入门(6)-ZSet

Redis中的Zset是有序的、可重复的&#xff08;元素不能重但score可重&#xff09;&#xff0c;其中每个元素都有一个分值score&#xff0c;Redis会根据其score对其进行从小到大的排序。 1.zadd key score member [score member] 添加元素 zadd subject 3 JAVA 2 C 1 mysql…

操作系统——磁盘调度算法的模拟与实现

一、实验题目 磁盘调度算法的模拟与实现 二、实验目的 (1) 了解磁盘结构以及磁盘上数据的组织方式。 (2) 掌握磁盘访问时间的计算方式。 (3) 掌握常用磁盘调度算法及其相关特性。 三、总体设计&#xff08;含背景知识或基本原理与算法、或模块介绍、设计步骤等&#xf…

计算机网络--网络编程(1)

简单认识一下传输层中的UDP和TCP&#xff1a; TCP&#xff1a;有链接&#xff0c;可靠传输&#xff0c;面向字节流&#xff0c;全双工 UDP&#xff1a;无连接&#xff0c;不可靠传输&#xff0c;面向数据报&#xff0c;全双工 有链接类似于打电话&#xff0c;通了就是有链接。…

软件测试项目中如何做好单元测试

前言 如《Unit Testing》书里提到&#xff0c;学习单元测试不应该仅仅停留在技术层面&#xff0c;比如你喜欢的测试框架&#xff0c;mocking 库等等&#xff0c;单元测试远远不止「写测试」这件事&#xff0c;你需要一直努力在单元测试中投入的时间回报最大化&#xff0c;尽量…

kotlin Flow系列之-SharedFlow

文章目录 前言SharedFlow之创建SharedFlow之缓存系统buffer&Slots SharedFlow源码发送数据接收数据SharedFlow存在的bug 前言 Kotlin中Flow被分为冷流 热流 两大类。比如经常被使用的flow{}函数就可以创建一个冷流。而本文的主角SharedFlow就是一个热流。冷流需要调用Flow…

Makefile基本原理详解及使用

1、什么是 Makefile 一个企业级项目&#xff0c;通常会有很多源文件&#xff0c;有时也会按功能、类型、模块分门别类的放在不同的目录中&#xff0c;有时候也会在一个目录里存放了多个程序的源代码。 这时&#xff0c;如何对这些代码的编译就成了个问题。Makefile 就是为这个问…