diff --git a/13_irq/imx6uirq.c b/13_irq/imx6uirq.c index 29d52c24bbf6cc23dfdcc30150a80fa27474830d..16c7dc3f198c0890ad038cfb2ae2e32fcabd47ff 100644 --- a/13_irq/imx6uirq.c +++ b/13_irq/imx6uirq.c @@ -60,10 +60,22 @@ struct imx6uirq_dev imx6uirq; /* irq设备 */ static irqreturn_t key0_handler(int irq,void *dev_id) { struct imx6uirq_dev *dev = (struct imx6uirq_dev *)dev_id; - unsigned char keyvalue; + dev->curkeynum = 0; + dev->timer.data = (volatile long)dev_id; + + mod_timer(&dev->timer, jiffies + msecs_to_jiffies(10)); + + return IRQ_RETVAL(IRQ_HANDLED); +} + +void timer_function(unsigned long arg) +{ + struct imx6uirq_dev *dev = (struct imx6uirq_dev *)arg; + unsigned char keyvalue; + keyvalue = gpio_get_value(dev->irqkeydesc.gpio); if (keyvalue == 0) /* 按键被按下 */ { @@ -73,8 +85,6 @@ static irqreturn_t key0_handler(int irq,void *dev_id) atomic_set(&dev->keyvalue, 0x80 | dev->irqkeydesc.value); atomic_set(&dev->releasekey, 1);/* 松开标记 */ } - - return IRQ_RETVAL(IRQ_HANDLED); } static int keyio_init(void) @@ -114,6 +124,10 @@ static int keyio_init(void) return -EFAULT; } + /* 初始化定时器 */ + init_timer(&imx6uirq.timer); + imx6uirq.timer.function = timer_function; + return 0; } @@ -192,12 +206,14 @@ static __init imx6uirq_init(void) atomic_set(&imx6uirq.releasekey,0); keyio_init(); + return 0; } static __exit imx6uirq_exit(void) { - free_irq(imx6uirq.irqkeydesc.irqnum,&imx6uirq); + del_timer_sync(&imx6uirq.timer); + free_irq(imx6uirq.irqkeydesc.irqnum, &imx6uirq); gpio_free(imx6uirq.irqkeydesc.gpio ); // 注销字符设备驱动