free_irq后无法访问/ proc / interrupt

时间:2013-04-20 23:45:54

标签: linux-kernel linux-device-driver interrupt raspberry-pi

我正在为 Raspberry Pi上的 GPIO 引脚附加的 ov7670 CMOS元素编写内核 v4l2 驱动程序。我设置了三条 IRQ 行( Pixel Href Vsync

以下是我要求他们的方式:

ret = request_irq(  PX_IRQ, 
                    ov7670rpi_pixel_interrupt,
                    irq_flags,
                     "ov7670rpi_px",
                     ov7670rpi_pixel_interrupt);

ret = request_irq(  HREF_IRQ, 
                    ov7670rpi_href_interrupt,
                    irq_flags,
                     "ov7670rpi_href",
                     ov7670rpi_href_interrupt);

ret = request_irq(  VSYNC_IRQ,
                    ov7670rpi_vsync_interrupt,
                    irq_flags,
                     "ov7670rpi_vsync",
                     ov7670rpi_vsync_interrupt);

现在好了:

#cat /proc/interrupts
           CPU0       
3:       4168   ARMCTRL  BCM2708 Timer Tick
9:          0   ARMCTRL  ov7670rpipx
10:          0   ARMCTRL  ov7670rpihref
11:          0   ARMCTRL  ov7670rpivsync
32:      68523   ARMCTRL  dwc_otg, dwc_otg_pcd, dwc_otg_hcd:usb1
52:          0   ARMCTRL  BCM2708 GPIO catchall handler
65:        543   ARMCTRL  ARM Mailbox IRQ
66:          2   ARMCTRL  VCHIQ doorbell
75:          1   ARMCTRL
77:       3439   ARMCTRL  bcm2708_sdhci (dma)
79:          0   ARMCTRL  bcm2708_i2c.0, bcm2708_i2c.1
80:          0   ARMCTRL  bcm2708_spi.0
83:         21   ARMCTRL  uart-pl011
84:       7436   ARMCTRL  mmc0
FIQ:              usb_fiq
Err:          0

看起来不错。

这是我禁用IRQ的方法:

/* Disable Interrupts */
free_irq(PX_IRQ, ov7670rpi_pixel_interrupt);
free_irq(HREF_IRQ, ov7670rpi_href_interrupt);
free_irq(VSYNC_IRQ, ov7670rpi_vsync_interrupt);

我也尝试过:

/* Disable Interrupts */
free_irq(PX_IRQ, NULL);
free_irq(HREF_IRQ, NULL);
free_irq(VSYNC_IRQ, NULL);

这两种方式都可以使模块卸载后无法访问 / proc / interrupts 。当我尝试cat /proc/interrupts时,他们会锁定系统。

1 个答案:

答案 0 :(得分:1)

执行此操作的正确方法是将gpio_request()GPIO numbers一起使用。

 #define PX_GPIO 9
 #define HREF_GPIO 10
 #define VSYNC_GPIO 11

 gpio_request(PX_GPIO, "v4l_rpi_px");
 gpio_input(PX_GPIO);
 gpio_request(HREF_GPIO, "v4l_rpi_href");
 gpio_input(HREF_GPIO);
 gpio_request(VSYNC_GPIO, "v4l_rpi_vsync");
 gpio_input(VSYNC_GPIO);

 /* Now, gpio_to_irq() can be used. */
 ret = request_irq(gpio_to_irq(PX_GPIO), 
                ov7670rpi_pixel_interrupt,
                irq_flags,
                 "ov7670rpi_px",
                 ov7670rpi_pixel_interrupt);
 /* etc. */

bcm2708_gpio.c提供 GPIO中断控制器,如this question中所述。另请参阅GPIO documentation

您的主中断控制器 ARMCTRL 将中断52作为 BCM2708 GPIO catchall handler 。此IRQ 链接并支持每个 gpio 行的IRQ。 GPIO的控制器将在/proc/interrupts中以 GPIO 的不同方式列出。