我正在为 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
时,他们会锁定系统。
答案 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 的不同方式列出。