主要思路:在驱动初始化函数中初始化定时器,但是不设置定时时间,定时时间在按键中断函数中来设置。这样一来在按键物理抖动的时候,中断叠加,一次等待中断还未结束,按键的抖动又产生中断,这样就会叠加,到最后只执行一次定时器中断函数,来处理按键按下之后的相关动作。
1.定义结构体 : static struct timer_list buttons_timer;这个结构体中存放定时器的各项参数
2.在驱动初始化函数中进行定时器初始化,其实只是定义定时器超时函数
<span style="white-space:pre"> </span>init_timer(&buttons_timer);
//buttons_timer.data = (unsigned long) SCpnt;
//buttons_timer.expires = jiffies + 100*HZ; /* 10s */
buttons_timer.function = (void (*)(unsigned long)) buttons_timer_function;
add_timer(&buttons_timer); //把定时器告诉内核,超时到,调用函数
3写出定时器超时处理函数
static void buttons_timer_function(unsigned long data)
{
struct pin_desc * pindesc = irq_pd;
unsigned int pinval;
if(!pindesc) //初始化中未设置超时时间,默认为0,所以一开始就满足超时函数执行,此时
return;//并没有按键中断,在这里判断只有按键中断才会执行处理函数
pinval = s3c2410_gpio_getpin(pindesc->pin);
if (pinval)
{
/* 松开 */
key_val = 0x80 | pindesc->key_val;
}
else
{
/* 按下 */
key_val = pindesc->key_val;
}
ev_press = 1; /* 表示中断发生了 */
wake_up_interruptible(&button_waitq); /* 唤醒休眠的进程 */
kill_fasync (&button_async, SIGIO, POLL_IN);
}