2013-10-20 21 views
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 

回答

1

有更少的代碼推測究竟爲什麼。

其中一種可能的情況是, 您在執行request_irq之前啓用了中斷線和寄存器。

請確保在執行request_irq(我相信您在驅動程序的探測回調函數中執行此操作)之前禁用所有中斷寄存器/行,然後在設備的open方法被調用時啓用它們。

相關問題