2011-08-17 13 views
5

पर जीपीआईओ आईआरक्यू मैं AT91SAM9M10-EKES मूल्यांकन बोर्ड पर एक जीपीआईओ आईआरक्यू प्रोग्राम करने की कोशिश कर रहा हूं। मैंने सफलतापूर्वक आईआरक्यू पंजीकृत किया, और आईआरक्यू काम कर रहा है। हालांकि, कुछ इंटरप्ट छूट गए हैं। मैं 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); 

इस पूरे ड्राइवर नहीं है, लेकिन यह वास्तविक बात यह है कि आईआरक्यू से संबंधित है। अगर किसी को कोड में कोई समस्या दिखाई देती है, या मुझे पता है कि मैं 4 इंटरप्ट क्यों खो देता हूं, तो कृपया उत्तर दें। मैं घंटों के लिए इस पर अटक कर रहा हूँ ... :(

धन्यवाद। रेमन।

उत्तर

4

मैं तुम्हें अपने बीच में आता है ट्रिगर कर रहे हैं मान एक बाहरी प्रणाली के साथ (शायद एक माइक्रोकंट्रोलर या कुछ जो GPIOS टॉगल कर सकता है)। चूंकि मुझे इंटरप्ट का असली एक नहीं दिख रहा है, मुझे लगता है कि बाहरी सिस्टम वा नहीं करता है यह एक नया ट्रिगर करने के लिए हस्तक्षेप के लिए संभाला जा सकता है।

प्रिंटक एक बहुत ही धीमा कार्य है और यही कारण है कि आप कुछ इंटरप्ट्स को याद कर सकते हैं: एक नया व्यक्ति तब भी ट्रिगर किया जा सकता है जब आप पिछले एक को संभालेंगे।

तो मैं सलाह देता हूं कि हैंडलर में प्रिंटक का उपयोग न करें। यदि आप इस तरह कुछ हासिल करना चाहते हैं, तो इंटरैक्ट हैंडलर के निचले हिस्से के रूप में एक टास्कलेट या वर्क्यूयू का उपयोग करना बेहतर होगा।

मैं केवल लिनक्स डिवाइस ड्राइवर्स के अध्याय 10 के पढ़ने की अनुशंसा कर सकता हूं।

ओह और वैसे, आपके आईआरक्यू हैंडलर को 0 वापस नहीं करना चाहिए, लेकिन IRQ_HANDLED।

+1

प्रिंटक कारण है !! यह काम करता हैं। धन्यवाद। – stdcall

+0

@ लोंगफील्ड: क्या आप कृपया इसका उत्तर दे सकते हैं http://stackoverflow.com/questions/24608817/interrupt-on-gpio-line-is-not-being- पता नहीं? –

1

ठीक है, वास्तव में, समस्या यह है कि मैं GPIO पिन का इस्तेमाल किया है, जबकि GPIO पिंस IRQF_TRIGGER_FALLING ध्वज का समर्थन नहीं करते है है, जो मैं वास्तव में क्या जरूरत है। इसलिए शायद, बाधा हैंडलर संकेत सही ढंग से नहीं पहचानता है। मुझे पता चला कि मैं बाहरी पिन का उपयोग करने के लिए सक्षम बनाता है IRQF_TRIGGER_FALLING के लिए की जरूरत है आईआरक्यू की।

+0

अरे मुझे एक ही समस्या है। क्या आप कृपया http://stackoverflow.com/questions/24608817/interrupt-on-gpio-line-is-not-being- पता नहीं –

संबंधित मुद्दे