Próbuję zaprogramować przerwanie GPIO na tablicy ewaluacyjnej AT91SAM9M10-EKES. Pomyślnie zarejestrowałem IRQ, a IRQ działa. Jednak niektóre przerwania są pomijane. Wysyłam 26, a ja się tylko 22.GPIO IRQ na opartym na ARM wbudowanym systemie Linux
kodu:
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);
To nie jest cała kierowcą, ale jest to rzeczywista część, która zajmuje się IRQ. Jeśli ktoś zauważy problem z kodem lub może zasugerować, w jaki sposób mogę stracić 4 przerwania, odpowiedz. Utknąłem na to godzinami ... :(
Dzięki. Ramon.
the printk jest powodem !! to działa. dzięki. – stdcall
@Longfield: Czy możesz odpowiedzieć na to http://stackoverflow.com/questions/24608817/interrupt-on-gpio-line-is-not-being-detected? –