在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",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",GPIO_NO); } GPIO_IRQ = gpio_to_irq(GPIO_NO); if(GPIO_IRQ < 0) { printk(KERN_INFO "%s: Mapping GPIO_%d to IRQ Failed\n",GPIO_NO); return -1; } else { printk(KERN_INFO "%s: Mapping GPIO_%d to IRQ_%d successful\n",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",GPIO_IRQ); return -1; } else { printk(KERN_INFO "%s: requesting GPIO_IRQ %d successful\n",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",irq); /* I know that I've to remove this printk statement */ return IRQ_HANDLED; }
@H_404_12@GPIO_39属于存储体GPIO2,相应的中断号为32.但是,gpio_to_irq()的返回值为199.这是另一个引起关注的原因.
最佳答案
明确地使GPIO引脚检测下降沿.
在gpio模块级别,必须启用gpio的FALLING_DETECT.