如何在embedded式Linux中检测GPIO线上的中断?

pandaboard OMAP4的GPIO_39上每隔10ms产生一个中断。 我已经在Linux驱动代码中注册了一个处理程序,但是由于没有检测到中断,处理程序没有被调用。

我在硬件层面(通过探测gpio引脚)确定中断实际上正在产生。 只是软件无法检测到它。

我有我的驱动程序代码中的以下内容。

#define GPIO_NO 39 iowrite16(0x3, gpio_39_address + 2); /* Configured the pin 22 to be used as gpio. */ ret = gpio_request(GPIO_NO, "Claiming GPIO"); if(ret < 0) { printk(KERN_ALERT "%s: Claiming GPIO_%d failed\n", __func__, GPIO_NO); return -1; } else { printk(KERN_INFO "%s: Claiming GPIO_%d successful\n", __func__, GPIO_NO); } ret = gpio_direction_input(GPIO_NO); if(ret < 0) { printk(KERN_INFO "%s: Setting GPIO direction to input failed\n", __func__); return -1; } else { printk(KERN_INFO "%s: Direction of GPIO_%d set to input\n", __func__, GPIO_NO); } GPIO_IRQ = gpio_to_irq(GPIO_NO); if(GPIO_IRQ < 0) { printk(KERN_INFO "%s: Mapping GPIO_%d to IRQ failed\n", __func__, GPIO_NO); return -1; } else { printk(KERN_INFO "%s: Mapping GPIO_%d to IRQ_%d successful\n", __func__, GPIO_NO, GPIO_IRQ); } if((request_irq(GPIO_IRQ, ten_ms_int, IRQF_TRIGGER_FALLING, DEVICE_NAME, NULL))) { printk(KERN_ALERT "%s: requeseting GPIO_IRQ %d failed\n", __func__, GPIO_IRQ); return -1; } else { printk(KERN_INFO "%s: requesting GPIO_IRQ %d successful\n", __func__, GPIO_IRQ); } irqreturn_t ten_ms_int(int irq, void *dev_id) { T_UINT32 l; /* Enable spi channel */ l = ioread32(spi_base + SPI_CHCONF0); l |= SPI_CHCONF0_FORCE; iowrite32(l, (spi_base + SPI_CHCONF0)); l = ioread32(spi_base + SPI_CHCTRL0); l |= SPI_CHCTRL_EN; iowrite32(l, (spi_base + SPI_CHCTRL0)); /* Enable dma channel 0 */ l = ioread32(sdma_base + SDMA_CCR(CHANNEL0)); l |= SDMA_CCR_ENABLE; iowrite32(l, sdma_base + SDMA_CCR(CHANNEL0)); /* Enable dma channel 1 */ l = ioread32(sdma_base + SDMA_CCR(CHANNEL1)); l |= SDMA_CCR_ENABLE; iowrite32(l, sdma_base + SDMA_CCR(CHANNEL1)); //printk(KERN_INFO "%s: 10ms interrupt detected %d\n", __func__, irq); /* I know that I've to remove this printk statement */ return IRQ_HANDLED; } 

GPIO_39属于bank GPIO2,相应的中断号是32.但是, gpio_to_irq()的返回值是199.这是另一个值得关注的原因。

请告诉我,如果代码中有什么错误或者我错过了什么。

Solutions Collecting From Web of "如何在embedded式Linux中检测GPIO线上的中断?"

明确地使GPIO引脚检测下降沿。

在gpio模块级别,需要启用gpio的FALLING_DETECT