- 论坛徽章:
- 0
|
我们知道定时器处理函数只能执行一次,执行完后就会失效。若想循环使用需要重新启动定时器。而我最近看的一个按键驱动程序中,只有 init 函数中初始化了定时器。也就是说,按键第一次发生,响应了中断并且调用了定时器处理函数;而在按键第二次发生时,又是从 init 函数开始初始化定时器,然后跟第一次按键时那样执行下去???请问我的这个理解方式对吗? 如果不对请各位指正。
驱动程序片段如下:
static irqreturn_t button_irq (int irq, void *dev_id)
{
/* 10 ms 后启动定时器 */
irq_pd = (struct pin_desc *)dev_id;
mod_timer(&button_timer, jiffies + HZ/100);
return IRQ_RETVAL(IRQ_HANDLED);
}
…………
/* Handle the timer event */
static void buttons_timer_function(unsigned long unused)
{
struct pin_desc *pindesc = irq_pd;
unsigned int pinval;
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);
}
……………………
static int seventh_drv_init(int)
{
init_timer(&button_timer);
button_timer.function = &buttons_timer_function; /* timer handler */
add_timer(&button_timer);
return 0;
} |
|