C 为什么第一次中断发生在注册时?

C 为什么第一次中断发生在注册时?,c,linux-kernel,kernel,linux-device-driver,C,Linux Kernel,Kernel,Linux Device Driver,我在内核模块中使用GPIO中断,每次我在第一次注册时得到中断(在请求时) 注册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, "irqn

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

注册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
#cat/proc/interrupts | grep irqname

没有那么多代码来解释确切的原因

一种可能的情况是, 在执行请求irq之前,您正在启用中断行和寄存器


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

没有多少代码来解释具体原因

一种可能的情况是, 在执行请求irq之前,您正在启用中断行和寄存器

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