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

本文探讨在Linux应用层处理GPIO中断的问题。在Pandaboard OMAP4平台的GPIO_39上,作者遇到每隔10ms产生的中断无法被软件检测到的困扰。文章详细展示了如何配置GPIO为输入,并尝试映射GPIO到中断号以及注册中断处理程序,但最终在中断处理程序中未触发预期行为。问题可能存在于代码中某个环节,作者寻求帮助找出问题所在。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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.这是另一个引起关注的原因.

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值