std*_*all 5 irq linux-device-driver embedded-linux gpio arm9
我正在尝试在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);
Run Code Online (Sandbox Code Playgroud)
这不是整个驱动程序,但这是处理IRQ的实际部分.如果有人在代码中发现问题,或者可以建议一种方法来了解我失去4个中断的原因,请回复.我被困在这几个小时...... :(
谢谢.拉蒙.
我假设您正在使用外部系统(可能是微控制器或可以切换 GPIOS 的系统)触发中断。由于我没有看到中断的真正确认,因此我假设外部系统不会等待中断被处理以触发新的中断。
printk 是一个非常慢的函数,这就是为什么您可能会错过一些中断:当您仍在处理前一个中断时,可能会触发一个新的中断。
所以我建议不要在处理程序中使用 printk 。如果你想实现这样的目标,最好使用tasklet或workqueue作为中断处理程序的下半部分。
我只能推荐阅读《Linux 设备驱动程序》第 10 章。
哦,顺便说一句,您的 IRQ 处理程序不应返回 0,而应返回 IRQ_HANDLED。
| 归档时间: |
|
| 查看次数: |
5013 次 |
| 最近记录: |