如何在嵌入式Linux中检测GPIO线路上的中断?

如何在嵌入式Linux中检测GPIO线路上的中断?,第1张

概述在 pandaboard OMAP4中,GPIO_39上每隔10ms产生一次中断.我已在Linux驱动程序代码中为此注册了处理程序,但由于未检测到中断,因此未处理该处理程序. 我确保在硬件级别(通过探测gpio引脚)确实正在生成中断.只是软件无法检测到它. 我在驱动程序代码中有以下内容. #define GPIO_NO 39 iowrite16(0x3, gpio_39_addres 在 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.这是另一个引起关注的原因.

如果代码中有问题或错过了某些内容,请告诉我.

解决方法 明确地使GPIO引脚检测下降沿.

在gpio模块级别,必须启用gpio的FALliNG_DETECT.

总结

以上是内存溢出为你收集整理的如何在嵌入式Linux中检测GPIO线路上的中断?全部内容,希望文章能够帮你解决如何在嵌入式Linux中检测GPIO线路上的中断?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1030551.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存