我在内核模块中使用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
答案 0 :(得分:1)
用于确切原因的代码较少。
可能的情况之一可能是, 在执行request_irq之前,您正在启用中断线和寄存器。
请确保在执行request_irq之前禁用所有中断寄存器/行(我相信你在驱动程序的探测回调函数中执行此操作),然后在调用设备的open方法时启用它们。