日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux 应用层gpio中断_如何在嵌入式Linux中检测GPIO线路上的中断?

發布時間:2024/4/17 linux 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 应用层gpio中断_如何在嵌入式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",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;

}

GPIO_39屬于存儲體GPIO2,相應的中斷號為32.但是,gpio_to_irq()的返回值為199.這是另一個引起關注的原因.

如果代碼中有問題或錯過了某些內容,請告訴我.

總結

以上是生活随笔為你收集整理的linux 应用层gpio中断_如何在嵌入式Linux中检测GPIO线路上的中断?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。