【IMX6ULL驱动开发学习】03.Linux驱动开发之GPIO子系统、中断、定时器

news2024/10/7 18:28:31

一、GPIO子系统

1.1 引脚编号

在硬件上如何确定GPIO引脚?它属于哪组GPIO?它是这组GPIO里的哪个引脚?需要2个参数。但是在Linux软件上,可以使用引脚编号来表示。以100ask_ imx6ull为例在开发板上执行如下命令查看已经在使用的GPIO状态:可以看到在Linux系统中可以使用编号来访问某个GPIO。

cat /sys/kernel/debug/gpio

1.2 基于sysfs操作引脚

以100ask_imx6ull为例,它有一个按键,原理图如下:

 那么GPIO5_3的号码是4*32 + 3 =131,可以如下操作读取按键值:

echo 131 > /sys/class/gpio/export              // gpio_request
echo in > /sys/class/gpio/gpio110/direction    // gpio_direction_input
cat /sys/class/gpio/gpio110/value              // gpio_get_value
echo 131 > /sys/class/gpio/unexport            // gpio_free

作用分别是:申请引脚、设置成输入、获取电平状态、释放引脚

1.3 在驱动程序中调用GPIO子系统

在设备树中指定了GPIO引脚,在驱动代码中如何使用?也就是GPIO子系统的接口函数是什么?GPIO子系统有两套接口:基于描述符的(descriptor-based)、老的(legacy)。前者的函数都有前缀“ gpiod_”,它使用 gpio_desc 结构体来表示一个引脚;后者的函数都有前缀“ gpio_”,它使用一个整数来表示一个引脚。要操作一个引脚,首先要get引脚,然后设置方向,读值、写值。

驱动程序中要包含头文件,选用一个即可:

include <linux/gpio/consumer.h>     // descriptor-based
include <linux/gpio.h>              // legacy

下表列出常用的函数:

二、中断

2.1 使用中断的流程

  • 确定中断号
  • 注册中断处理函数,函数原型如下:
int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
	    const char *name, void *dev);
  • 在中断处理函数里:分辨中断、处理中断、清楚中断

 2.2 函数细节

request_irq函数的第1个参数是中断号,可以根据GPIO函数获得中断号:

int gpio_to_irq(unsigned int gpio); //使用该函数传入一个gpio的编码得到中断号

request_irq函数的第2个参数是函数指针: 中断函数会被内核调用

enum irqreturn {
	IRQ_NONE		= (0 << 0),
	IRQ_HANDLED		= (1 << 0),
	IRQ_WAKE_THREAD		= (1 << 1),
};
typedef enum irqreturn irqreturn_t;
typedef irqreturn_t (*irq_handler_t)(int irq, void *dev);

request_irq函数的第3个参数flag表示中断的触发类型:上升沿触发、下降沿触发、上升下降同时触发、高电平触发、低电平触发,有如下取值:

#define IRQF_TRIGGER_NONE	    0x00000000
#define IRQF_TRIGGER_RISING	    0x00000001
#define IRQF_TRIGGER_FALLING   	0x00000002
#define IRQF_TRIGGER_HIGH	    0x00000004
#define IRQF_TRIGGER_LOW	    0x00000008

#define IRQF_SHARED		        0x00000080

request_irq函数的第4个参数是中断的名字,可以在执行cat /proc/interrupts的结果里查看。

request_irq函数的第5个参数是给中断处理函数使用的(用户自行决定是否要传给中断函数的参数)。

三、定时器

定时器作用:超时后调用超时函数(相当于闹钟,时间到后你就要做某些事)。

两个要素:超时时间和超时函数。

应用:如按键消抖。

3.1 定时器函数

在内核中使用定时器很简单,涉及这些函数(参考内核源码include\linux\timer.h):

setup_timer(timer, fn, data);
void add_timer(struct timer_list *timer);
int mod_timer(struct timer_list *timer, unsigned long expires);
int del_timer(struct timer_list *timer);
  • 设置定时器:定时器结构体,定时器超时函数,传给超时函数的参数。
  • 向内核添加定时器。 timer->expires 表示超时时间。当超时时间到达,内核就会调用这个函数:timer->function(timer->data)。
  • 修改定时器的超时时间。
  • 删除定时器。

 3.2 使用定时器处理按键抖动

在实际的按键操作中,可能会有机械抖动:按下或松开一个按键,它的 GPIO 电平会反复变化,最后才稳定。一般是几十毫秒才会稳定。如果不处理抖动的话,用户只操作一次按键,中断程序可能会上报多个数据。怎么处理?

核心在于:在GPIO中断中并不立刻记录按键值,而是修改定时器超时时间,10ms 后再处理。

  • 如果 10ms 内又发生了 GPIO 中断,那就认为是抖动,这时再次修改超时时间为 10ms。
  • 只有 10ms 之内再无 GPIO 中断发生,那么定时器的函数才会被调用。在定时器函数中记录按键值。
     

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

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

相关文章

桥接模式-java实现

桥接模式 桥接模式的本质&#xff0c;是解决一个基类&#xff0c;存在多个扩展维度的的问题。 比如一个图形基类&#xff0c;从颜色方面扩展和从形状上扩展&#xff0c;我们都需要这两个维度进行扩展&#xff0c;这就意味着&#xff0c;我们需要创建一个图形子类的同时&#x…

手搓vue3组件_1.封装一个button

我的icepro参考地址,内有参考代码,有条件的割割点点star 实现要求: 基于vue3支持通过colors(更改颜色)支持点击事件…支持其他的自定义样式(例如圆角,size等等) 最基础的第一步: 父组件引入并使用: <template><div class"buttonLim">我的按钮:<ice-b…

Zabbix监控华为交换机DHCP接口地址池

一、背景 最近工作中遇到一个因为DHCP地址池满载、导致用户无法获取到IP地址的故障&#xff0c;所以在想通过zabbix 监控DHCP地址池的状态、当DHCP 地址池数量小于某个值时触发zabbix告警。 网上找了一下没有相关的文档、和对应的OID值、于是用Python 脚本的方式实现 二、实现效…

第二课-一键安装SD-Stable Diffusion 教程

前言 看完这篇文章并跟着操作,就可以在本地开始 SD 绘图了。 理论上来说,这篇课程结束,想要画什么图都可以画了。 启动器介绍 SD 是开源的,可以在 github 上找到。但直接下载源码安装,非常费劲,而且因为国内外差异,就是我这样的秃头程序员也难以应对。 所以,我们改…

Spring中Bean的“一生”(生命周期)

文章目录 一、图解二、文字解析总结 一、图解 >注&#xff1a;处于同一行的执行顺序是从左往右 二、文字解析 SpringBean的生命周期总体分为四个阶段&#xff1a;实例化>属性注入>初始化>销毁 Step1 实例化Bean&#xff1a;根据配置文件中Bean的定义&#xff0c;…

设计模式(3)装饰模式

一、介绍&#xff1a; 1、应用场景&#xff1a;把所需的功能按正确的顺序串联起来进行控制。动态地给一个对象添加一些额外的职责&#xff0c;就增加功能来说&#xff0c;装饰模式比生成子类更加灵活。 当需要给一个现有类添加附加职责&#xff0c;而又不能采用生成子类的方法…

[RCTF2019]DontEatMe

前言 一道迷宫题&#xff0c;但是输入被加密后使用&#xff0c;迷宫也需要在程序中找出并没有直接输出 分析 反调试 发现有两个比较特殊的地方&#xff0c;随机数和创建了新线程&#xff0c;随机数后面又被重新赋值给覆盖了&#xff0c;暂时不用管&#xff0c;ZwSetInformat…

业务需求紧急,IT部门缺失,企业如何应对"影子IT"危机?

在当今数字化时代&#xff0c;业务部门的需求通常非常紧急&#xff0c;但IT部门的排期却跟不上&#xff0c;导致业务部门焦头烂额。IT部门面临着诸多需求&#xff0c;无法在规定时间范围内满足每一个需求&#xff0c;因此未授权的应用程序安全监管也变得愈发困难。 影子IT的频发…

互联网电影购票选座后台管理系统源码开发

搭建一个互联网电影购票选座后台管理系统需要进行以下步骤&#xff1a; 1. 需求分析&#xff1a;首先要明确系统的功能和需求&#xff0c;包括电影列表管理、场次管理、座位管理、订单管理等。 2. 技术选型&#xff1a;选择适合的技术栈进行开发&#xff0c;包括后端开发语言…

铸铝齿轮泵比例流量阀放大器

液压齿轮泵是一种常用的液压泵&#xff0c;被广泛应用于各种低压系统中&#xff0c;如采矿、冶金、建筑、航空、航海、农林等机械的中、高压液压系统中。 液压齿轮泵的特点是结构简单&#xff0c;制造方便&#xff0c;价格低廉&#xff0c;体积小&#xff0c;重量轻&#xff0…

探析STM32标准库与HAL库之间的差异与优劣

引言&#xff1a; 在嵌入式开发领域&#xff0c;STMicroelectronics的STM32系列芯片广受欢迎。STM32提供了两种主要的软件库&#xff0c;即标准库和HAL库&#xff0c;用于开发各种应用。本文将探讨这两种库之间的差异&#xff0c;比较它们的优劣&#xff0c;并分析在选择库时需…

[HDLBits] Exams/m2014 q4e

Implement the following circuit: module top_module (input in1,input in2,output out);assign out!(in1||in2); endmodule

【MySQL】

这里写目录标题 MySQL架构一条sql执行流程MySQL数据存放电脑位置ibd文件结构行溢出是什么MySQL行记录存储格式索引为什么InnoDB选择B树作为索引数据结构什么时候需要创建索引优化索引方法InnoDB内部怎么存储数据B 树如何进行查询聚簇索引和二级索引为什么MySQL要采用B树作为索引…

【linux】ssh 和adb connect区别

问&#xff1a;ssh 与ping的区别 答&#xff1a;SSH&#xff08;Secure Shell&#xff09;和Ping是两种完全不同的网络工具。 SSH是一种加密的网络协议&#xff0c;用于安全地远程管理或访问远程计算机。它提供了一种安全的通信方式&#xff0c;可以在不安全的网络上进行远程登…

无涯教程-Perl - fileno函数

描述 此函数返回指定的FILEHANDLE的文件描述符号(由C和POSIX函数使用)。通常,这仅在使用select函数和任何低级tty函数时才有用。 语法 以下是此函数的简单语法- fileno FILEHANDLE返回值 此函数返回FILEHANDLE的文件描述符(数字),失败时不确定。 Perl 中的 fileno函数 - 无…

c#设计模式-行为型模式 之 观察者模式

定义&#xff1a; 又被称为发布-订阅&#xff08;Publish/Subscribe&#xff09;模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者 对象同时监听某一个主题对象。这个主题对象在状态变化时&#xff0c;会通知所有的观察者对象&#xff0c;使他们能够自 …

Go Gin 中使用 JWT

一、JWT JWT全称JSON Web Token是一种跨域认证解决方案&#xff0c;属于一个开放的标准&#xff0c;它规定了一种Token实现方式&#xff0c;目前多用于前后端分离项目和OAuth2.0业务场景下。 二、为什么要用在你的Gin中使用JWT 传统的Cookie-Sesson模式占用服务器内存, 拓展性…

C++ 多态性——纯虚函数与抽象类

抽象类是一种特殊的类&#xff0c;它为一个类族提供统一的操作界面。抽象类是为了抽象和设计的目的而建立的。可以说&#xff0c;建立抽象类&#xff0c;就是为了通过它多态地使用其中的成员函数。抽象类处于类层次的上层&#xff0c;一个抽象类自身无法实例化&#xff0c;也就…

提升招标文件准确性:校对软件助力招标流程优化

招标文件的准确性对于一个招标项目的成功非常重要。校对软件可以在优化招标流程中发挥关键作用&#xff0c;帮助提升招标文件的准确性和质量。以下是一些校对软件如何助力招标流程优化的方式&#xff1a; 1.拼写和语法检查&#xff1a;校对软件可以自动检测和纠正招标文件中的拼…

企业进销存管理流程有哪些? 附进销存管理系统

阅读本文&#xff0c;您可以了解&#xff1a;1、进销存的定义&#xff1b;2、进销存的流程 首先&#xff0c;在了解进销存流程之前&#xff0c;我们必须厘清一个问题&#xff1f; 什么是进销存&#xff1f; 进销存是一个企业管理中常用的术语&#xff0c;是指企业在经营过程中…