linux2.22.6内核驱动,应用层跟驱动通讯之----按键防抖动(短期内中断多次调用)

本文详细介绍了Linux内核驱动中如何实现按键防抖动,通过设置定时器在按键中断时避免因物理抖动引起的多次中断调用。在10ms内,每次中断都会更新定时器,确保最后的定时器在10ms后执行,从而有效地防止了按键抖动问题。同时,展示了中断服务函数、设备文件操作函数和定时器处理函数的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么要实现按键防抖动?因为按键是一个物理的弹片,按下去时候,或者回弹的时候,会抖动一下,然后会触发多次中断。

用定时器防抖动。

原理,进入按键中断的时候,开始一个定时器,这个定时器设置为10ms,10ms后就会执行定时器的函数。

第一次进入中断的时候,如果开始了一个10ms的定时器(标识#1),按键发生了抖动,在10ms内中断又被调用。

进入中断的时候,又会开始一个新的定时器(标识#2),这个时候上一个定时器(标识#1)就会被取消,以新的定时器(标识#2)

为准,如果10ms内发生了多次抖动,就会进入中断的时候,不断取消上一个定时器,以最后的一个定时器为准,10ms后就会执行定时器的函数。

---------------------------------------------------------

驱动函数:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/irq.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/arch/regs-gpio.h>
#include <asm/hardware.h>
#include <linux/poll.h>


static struct class *sixthdrv_class;
static struct class_device *sixthdrv_class_dev;
volatile unsigned long *gpfcon;
volatile unsigned long *gpfdat;
volatile unsigned long *gpgcon;
volatile unsigned long *gpgdat;
static struct timer_list buttons_timer;

static DECLARE_WAIT_QUEUE_HEAD(button_waitq);

/* 中断事件标志, 中断服务程序将它置1,sixth_drv_read将它清0 */
static volatile int ev_press = 0;
static struct fasync_struct *button_async;
struct pin_desc{
unsigned int

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值