【问题标题】:GPIO IRQ on ARM based Embedded Linux基于 ARM 的嵌入式 Linux 上的 GPIO IRQ
【发布时间】:2011-08-17 11:30:04
【问题描述】:

我正在尝试在 AT91SAM9M10-EKES 评估板上对 GPIO IRQ 进行编程。 我成功注册了 IRQ,并且 IRQ 正在工作。 但是,会遗漏一些中断。我发送 26 个,但我只收到 22 个。

代码:

static irqreturn_t wiegand_interrupt(int irq, void *dev_id){
  atomic_inc(&counter);
  printk(KERN_WARNING "IRQ recieved, counting... %d\n",atomic_read(&counter));
  return 0;
}
irq1 = gpio_to_irq(AT91_PIN_PA21);
if (irq1 < 0) {
    err = irq1;
    printk("Unable to get irq number for GPIO %d, error %d\n",AT91_PIN_PA21, err);
    goto fail;
}

err = request_irq(irq1,wiegand_interrupt,0 ,"wiegand",NULL);

irq2 = gpio_to_irq(AT91_PIN_PA20);
if (irq2 < 0) {
    err = irq2;
    printk("Unable to get irq number for GPIO %d, error %d\n",AT91_PIN_PA21, err);
    goto fail;
}

err = request_irq(irq2,wiegand_interrupt,0 ,"wiegand",NULL);

这不是整个驱动程序,而是处理 IRQ 的实际部分。 如果有人在代码中看到问题,或者可以提出一种方法来了解我为什么会丢失 4 个中断,请回复。我被困在这几个小时... :(

谢谢。 拉蒙。

【问题讨论】:

    标签: linux-device-driver embedded-linux irq arm9 gpio


    【解决方案1】:

    我假设您正在使用外部系统(可能是微控制器或可以切换 GPIOS 的东西)触发中断。由于我没有看到真正的中断确认,我假设外部系统不会等待处理中断来触发新的中断。

    printk 是一个非常慢的函数,这就是为什么您可能会错过一些中断:当您仍在处理前一个中断时,可能会触发一个新中断。

    所以我建议不要在处理程序中使用 printk。如果你想实现这样的事情,最好使用 tasklet 或 workqueue 作为中断处理程序的下半部分。

    我只能推荐阅读 Linux 设备驱动的第 10 章。

    哦,顺便说一句,你的 IRQ 处理程序不应该返回 0,而是 IRQ_HANDLED。

    【讨论】:

    【解决方案2】:

    好的,实际上,问题是我使用了 GPIO 引脚,而 GPIO 引脚不支持 IRQF_TRIGGER_FALLING 标志,这正是我所需要的。因此,中断处理程序可能无法正确识别信号。 我发现我需要使用 IRQF_TRIGGER_FALLING 的外部引脚来启用 IRQ。

    【讨论】:

    猜你喜欢
    • 2012-09-12
    • 2011-03-06
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多