为什么要实现按键防抖动?因为按键是一个物理的弹片,按下去时候,或者回弹的时候,会抖动一下,然后会触发多次中断。
用定时器防抖动。
原理,进入按键中断的时候,开始一个定时器,这个定时器设置为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