1

我在内核模块中使用 GPIO 中断,每次我在第一次注册时(在 request_irq() 处)得到中断。

注册irq代码:

at91_set_gpio_input(AT91_PIN_PB12, 0);
at91_set_pulldown(AT91_PIN_PB12, 1);
at91_set_deglitch(AT91_PIN_PB12, 1);
request_irq(gpio_to_irq(AT91_PIN_PB12), &interrupt_handler, IRQF_TRIGGER_FALLING, "irqname", NULL)

控制台日志:

# cat /proc/interrupts | grep irqname 
                           <----- the "irqname" interrupt is not registred 
# insmod testmodule.ko
# cat /proc/interrupts | grep irqname
 76:         1      GPIO  irqname <------Why first interrupt hapened at registration
# rmmod testmodule
# insmod testmodule.ko
# cat /proc/interrupts | grep irqname
 76:         1      GPIO  irqname
# rmmod testmodule
# insmod testmodule.ko
# cat /proc/interrupts | grep irqname
 76:         1      GPIO  irqname
# rmmod testmodule
4

1 回答 1

1

确切原因的代码更少。

一种可能的情况是,您在执行 request_irq 之前启用了中断线和寄存器。

请确保在执行 request_irq 之前禁用所有中断寄存器/线路(我相信您在驱动程序的探测回调函数中执行此操作),然后在调用设备的 open 方法时启用它们。

于 2013-10-20T16:00:01.090 回答