2011-08-17 21 views
5

AT91SAM9M10-EKES değerlendirme panosunda bir GPIO IRQ programlamaya çalışıyorum. IRQ başarıyla kaydedildi ve IRQ çalışıyor. Ancak, bazı kesmeler cevapsız. Ben 26 yolluyorum, ve sadece 22.ARM tabanlı Gömülü Linux üzerinde GPIO IRQ

kodu almak:

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); 

Bütün bu sürücü değil, ama bu IRQ ile ilgilenen gerçek bir parçasıdır. Birisi kodda bir sorun görüyorsa veya neden 4 kesintiyi kaybettiğimi bilmenin bir yolunu önerebilirse, lütfen cevap verin. Ben ... :(

teşekkürler. Ramon saatlerce bu şaşırıp.

cevap

4

ben size kesmeleri tetiklediğini varsayalım öğrendim harici bir sistemle (belki de bir mikrodenetleyici veya GPIOS'u değiştirebilen bir şey) .Bu kesimin gerçek bir ack'ını görmediğim için, dış sistemin beklemediğini kabul ediyorum. Belki de yeni bir tane tetiklemek için müdahale edilecek.

printk çok yavaş bir işlevdir ve bu yüzden bazı kesintileri kaçırırsınız: Bir öncekiyle çalışırken yeni bir tanesi tetiklenebilir.

Bu nedenle, işleyicide printk kullanmamanızı öneririz. Böyle bir şey elde etmek istiyorsanız, kesme işleyicisinin alt yarısı olarak bir görev veya çalışma alanı kullanmak daha iyi olacaktır.

Sadece Linux Aygıt Sürücüleri'nin 10. Bölümünün okunmasını önerebilirim.

Bu arada, IRQ işleyiciniz 0 değil IRQ_HANDLED döndürmelidir.

+1

'a bakabilir misiniz? işe yarıyor. Teşekkürler. – stdcall

+0

@Longfield: Bu http://stackoverflow.com/questions/24608817/interrupt-on-gpio-line-is-not-being-detected adresine cevap verebilir misiniz? –

1

Tamam, aslında, sorun GPIO pin IRQF_TRIGGER_FALLING bayrağı desteklemez ise, GPIO işaretçilerine kullanılan olmasıdır , hangi tam olarak neye ihtiyacım. yüzden muhtemelen, kesme işleyici doğru sinyalini tanımıyor. ben IRQF_TRIGGER_FALLING sağlayan harici işaretçilerine kullanmak gerektiğini IRQ'larla.

+0

Hey Ben de benzer bir sorunum var. Http://stackoverflow.com/questions/24608817/interrupt-on-gpio-line-is-not-being-detected –

İlgili konular