![](/img/trans.png)
[英]Linux 4.5 GPIO Interrupt Through Devicetree on Xilinx Zynq Platform
[英]How to detecting interrupt on a GPIO line in Embedded Linux?
在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屬於存儲體GPIO2,相應的中斷號為32.但是, gpio_to_irq()
的返回值為199.這是另一個引起關注的原因。
如果代碼中有問題或錯過了某些內容,請告訴我。
明確地使GPIO引腳檢測下降沿。
在gpio模塊級別,必須啟用gpio的FALLING_DETECT 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.