嵌入式驱动开发之框架及调试技巧累积

框架准备

  • 基本的框架
    • app如何调用驱动机制
    • 字符设备驱动编写步骤
      • 1. 实现入口函数 XXX_init()和卸载函数 XXX_exit()
      • 2. 申请设备号 register_chrdev_region(与内核相关)
      • 3. 注册字符设备驱动 cdev_alloc / cdev_init /cdev_add(与内核相关)
      • 4. 利用udev/mdev机制创建设备文件(节点)class_create,device_create(与内核相关)
      • 5. 硬件部分初始化
      • 6. 构建file_operation结构(与内核相关)
      • 7. 实现硬件操作方法 XXX_open,XXX_read,XXX_write...(与硬件相关)
  • 通用GPIO驱动框架的问题及理解
    • setup_timer()函数
    • add_timer()函数
    • gpio_to_irq()函数或gpiod_to_irq()
    • request_irq()函数
    • register_chrdev()
    • class_create()函数
    • device_create()函数
    • 通用驱动框架总结
  • 所遇到的驱动方面的问题
    • 驱动里用的\_IOW()函数有什么用???
      • 这几个宏的使用格式
  • 嵌入式调试技巧 -- gcc工具
    • 1. 打印文件信息
    • 2. 字符串化操作符
    • 3. ## 连接操作符,详见c_test验证
    • 4. 使用do…while的宏定义
    • 5. 分级检查机制

知识储备。

基本的框架

在linux系统中,App无法操作硬件的,不具备相应的权限。在mmu(内存管理单元)作了划分的,应用层只能操作属于它的mmu部分。操作硬件只能是通过驱动程序。应用程序与驱动程序之间有严格的界限。驱动程序在内核中。

app如何调用驱动机制

如App使用open函数打开设备时,会先设置某个寄存器,会触发一个异常swi指令(此时由用户态切换到内核态才有更高的权限),此时会有中断服务程序被调用。然后根据先前设置的寄存器判断是什么操作;然后去读写硬件。

字符设备驱动编写步骤

1. 实现入口函数 XXX_init()和卸载函数 XXX_exit()

2. 申请设备号 register_chrdev_region(与内核相关)

静态分配设备号:在事先知道设备主设备号的情况下通过参数函数指定第一个设备号而向系统申请分配一定数目的设备号。
动态分配:alloc_chrdev_region():通过参数仅设置第一个次设备号(通常为0,事先不会知道主设备号)和要分配的设备数目而系统动态分配所需的设备号

3. 注册字符设备驱动 cdev_alloc / cdev_init /cdev_add(与内核相关)

4. 利用udev/mdev机制创建设备文件(节点)class_create,device_create(与内核相关)

5. 硬件部分初始化

io资源映射 ioremao,内核提供gpio库函数(与硬件相关)
注册中断(与硬件相关)
初始化等待队列(与内核相关)
初始化定时器(与内核相关)

6. 构建file_operation结构(与内核相关)

7. 实现硬件操作方法 XXX_open,XXX_read,XXX_write…(与硬件相关)

通用GPIO驱动框架的问题及理解

setup_timer()函数

原型:#define setup_timer(timer, fn, data) \ __setup_timer((timer), (fn), (data), 0)
第一个参数:是struct timer_list类型的变量,此变量用于存放动态定时器,是即将要被初始化的对象,其定义及详细解释参考
第二个参数是定时器到期时将要执行的函数,用于给定时器变量的function字段赋值。
第三个参数用于给定时器变量的data字段赋值

add_timer()函数

将定时器加入到定时器链表,并激活定时器

gpio_to_irq(

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

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

相关文章

C# 使用 AES 加解密文件

[作者:张赐荣] 对称加密是一种加密技术,它使用相同的密钥来加密和解密数据。换句话说,加密者和解密者需要共享同一个密钥,才能进行通信。 对称加密的优点是速度快,效率高,适合大量数据的加密。对称加密的缺点是密钥的管…

网络套接字编程(一)

网络套接字编程(一) 文章目录 网络套接字编程(一)预备知识源IP地址和目的IP地址端口号TCP/UDP协议特点网络字节序 socket编程socket常用APIsockaddr结构 简易UDP网络程序服务端创建套接字服务端绑定IP地址和端口号字符型IP地址VS整型IP地址服务端运行客户端创建套接字客户端绑定…

mfc140u.dll丢失怎么修复,mfc140u.dll文件有什么作用

今天我想和大家分享的是关于mfc140u.dll文件丢失的解决方法。在我们使用电脑的过程中,有时候会遇到一些错误提示,其中比较常见的就是“无法找到mfc140u.dll文件”。那么,这个文件是什么呢?它有什么作用呢? 首先&#…

【python代码】对图片进行数据增强(直方图均衡和加噪声)

文章目录 1. 代码 1. 代码 import os import cv2 import albumentations as A from tqdm import tqdm from glob import glob import numpy as np# 方法1:加入噪声 trans2 A.Compose([A.RandomBrightnessContrast(p0.5),A.HueSaturationValue(p0.5),A.OneOf([ A.A…

网络基础-2

IEEE制定了一个名为GARP的协议框架,该框架协议包含了两个具体协议,GMRP和GVRP。GVRP可以大大降低VLAN配置过程中的手工的工作量。 IP本身是一个协议文件的名称,该协议主要定义阐释了IP报文的格式。 类型网络号位数网络号个数主机号位数每个…

水溶性纳米银颗粒 纳米银颗粒 银纳米颗粒溶液

西)产品名称:水溶性纳米银颗粒 安)别名 :纳米银溶液 银纳米颗粒溶液 纳米银胶体等 瑞)浓度:0.1mg/mL 其它均可定制 禧)粒径:5nm 10nm 15nm 20nm 25nm 30nm 35nm 40nm 50nm 60nm 80…

Ceph入门到精通-文件条带化 stripe unit,chunk

文件条带化 以下文本描述了 Ceph 文件系统客户端中的文件是如何 存储在 RADOS 中的对象之间。 CEPH_FILE_LAYOUT Ceph 将给定文件的数据分布(条带化)到多个 的基础对象。文件数据映射到这些对象的方式 由ceph_file_layout结构定义。数据分布 是修改后…

0052【Edabit ★☆☆☆☆☆】Learn Lodash: _.drop, Drop the First Elements of an Array

0052【Edabit ★☆☆☆☆☆】Learn Lodash: _.drop, Drop the First Elements of an Array arrays Instructions According to the lodash documentation, _.drop creates a slice of an array with n elements dropped from the beginning. Your challenge is to write your…

RabbitMQ一条消息被多个消费者消费

前言:可略过 正常情况下交换机和queue绑定,消息经过交换机发送给指定的队列。队列的消息被监听消费后就被删除,queue的消息仅能被消费一次。 如何解决呢,如果单从queue的角度出发,可能会联想到fanout-广播模式&#xf…

1.6 基本安全设计准则

思维导图: 1.6 基本安全设计准则笔记 目标:理解和遵循一套广泛认可的安全设计准则,以指导保护机制的开发。 主要准则: 机制的经济性:安全机制应设计得简单、短小,便于测试和验证,减少漏洞和降…

【数据结构】顺序表实例探究

💗个人主页💗 ⭐个人专栏——数据结构学习⭐ 💫点击关注🤩一起学习C语言💯💫 目录 导读:1. 顺序表的基本内容1.1 概念及结构1.2 时间和空间复杂度1.3 基本操作1.4 顺序表的优缺点 2. 静态顺序表…

自动化测试注意事项

什么是自动化测? 做测试好几年了,真正学习和实践自动化测试一年,自我感觉这一个年中收获许多。一直想动笔写一篇文章分享自动化测试实践中的一些经验。终于决定花点时间来做这件事儿。 首先理清自动化测试的概念,广义上来讲&#…

华锐技术何志东:证券核心交易系统分布式改造将迎来规模化落地阶段

近年来,数字化转型成为证券业发展的下一战略高地,根据 2021 年证券业协会专项调查结果显示,71% 的券商将数字化转型列为公司战略任务。 在落地数字化转型战略过程中,证券业核心交易系统面临着不少挑战。构建新一代分布式核心交易…

06 MIT线性代数-线性无关,基和维数Independence, basis, and dimension

1. 线性无关 Independence Suppose A is m by n with m<n (more unknowns than equations) Then there are nonzero solutions to Ax0 Reason: there will be free variables! A中具有至少一个自由变量&#xff0c;那么Ax0一定具有非零解。A的列向量可以线性组合得到零向…

酷克数据出席永洪科技用户大会 携手驱动商业智能升级

10月27日&#xff0c;第7届永洪科技全国用户大会在北京召开。酷克数据作为国内云原生数仓代表企业&#xff0c;受邀出席本次大会&#xff0c;全面展示了云数仓领域最新前沿技术&#xff0c;并进行主题演讲。 携手合作 助力企业释放数据价值 数据仓库是商业智能&#xff08;BI…

Easy Javadoc插件的使用教程

目录 一、安装Easy Javadoc插件 二、配置注释模板 三、配置翻译 一、安装Easy Javadoc插件 在idea的File-Settings-Plugins中搜索Easy Javadoc插件&#xff0c;点击install进行安装&#xff0c;安装完成后需要restart IDE&#xff0c;重启后插件生效。 二、配置注释模板 …

openGauss学习笔记-111 openGauss 数据库管理-管理用户及权限-用户权限设置

文章目录 openGauss学习笔记-111 openGauss 数据库管理-管理用户及权限-用户权限设置111.1 给用户直接授予某对象的权限111.2 给用户指定角色111.3 回收用户权限 openGauss学习笔记-111 openGauss 数据库管理-管理用户及权限-用户权限设置 111.1 给用户直接授予某对象的权限 …

SIT3088E3.0V~5.5V 供电,ESD 15kV HBM,256 节点,14Mbps 半双工 RS485/RS422 收发器

SIT3088E 是一款 3.0V~5.5V 宽电源供电、总线端口 ESD 保护能力 HBM 达到 15kV 以上、总 线耐压范围达到 15V 、半双工、低功耗&#xff0c;功能完全满足 TIA/EIA-485 标准要求的 RS-485 收发器。 SIT3088E 包括一个驱动器和一个接收器&#xff0c;两者均可独立…

SpringCloud 微服务全栈体系(七)

第九章 Docker 一、什么是 Docker 微服务虽然具备各种各样的优势&#xff0c;但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中&#xff0c;依赖的组件非常多&#xff0c;不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署&#xff0c;环境不一定一致…

MySQL系列-架构体系、日志、事务

MySQL架构 server 层 &#xff1a;层包括连接器、查询缓存、分析器、优化器、执行器等&#xff0c;涵盖 MySQL 的大多数核心服务功能&#xff0c;以及所有的内置函数&#xff08;如日期、时间、数学和加密函数等&#xff09;&#xff0c;所有跨存储引擎的功能都在这一层实现&am…