2013-03-06 14 views
9

मैं एक साधारण कर्नेल मॉड्यूल लिख रहा हूं, जो एक इंटरप्ट पंजीकृत कर सकता है और इसे संभाल सकता है।सरल इंटरप्ट हैंडलर: request_irq त्रुटि कोड -22

ERROR: Cannot request IRQ 30 - code -22 , EIO 5 , EINVAL 22

मेरा मानना ​​है कि इस त्रुटि कोड का EINVAL (अवैध तर्क)

कृपया बताने के लिए बराबर है: हालांकि, जब मैं request_irq कार्यप्रणाली को कॉल करके व्यवधान रजिस्टर करने के लिए प्रयास करते हैं, यह त्रुटि कोड -22 रिटर्न मैं, मैं क्या गलत कर रहा हूँ।

#include <linux/init.h> 
#include <linux/module.h> 
#include <linux/irq.h> 
#include <linux/io.h> 
#include <linux/irqdomain.h> 
#include <linux/interrupt.h> 
#include <linux/of.h> 
#include <linux/of_address.h> 

#include <asm/exception.h> 
#include <asm/mach/irq.h> 

void int068_interrupt(int irq, void *dev_id, struct pt_regs *regs) 
{ 
    printk("Interrupt should be handled there\n"); 
} 

static int __init 
clcdint_init(void) 
{ 
    unsigned int irq; 
    unsigned int irqflags; 
    int ret; 

    irq=68; 
    irqflags=IRQF_SHARED | IRQF_NO_SUSPEND; 

    ret = request_irq(irq, int068_interrupt, 
      irqflags, "clcdint-int068", NULL); 

    if (ret!=0) { 
      printk("ERROR: Cannot request IRQ %d", irq); 
      printk(" - code %d , EIO %d , EINVAL %d\n", ret, EIO, EINVAL); 
    } 

    printk("CLCDINT_INIT\n"); 
    return 0; 
} 

module_init(clcdint_init); 

static void __exit 
clcdint_exit(void) 
{ 
    unsigned int irq; 
    irq=68; 
    free_irq(irq, NULL); 
    printk("CLCDINT_EXIT\n"); 
} 

module_exit(clcdint_exit); 

उत्तर

12

आप एक शून्य संदर्भ (request_irq() कॉल के अंतिम पैरामीटर) जब एक साझा बाधा लाइन के साथ काम कर (IRQF_SHARED झंडे पर है) पारित नहीं कर सकते हैं: यहाँ एक मॉड्यूल है।

समझने के लिए कि निम्नलिखित परिदृश्य पर विचार क्यों करें: आपके पास एक ही आईआरक्यू साझा करने वाले दो समान नेटवर्क कार्ड हैं। एक ही ड्राइवर एक ही इंटरप्ट हैंडलर फ़ंक्शन, एक ही irq संख्या और वही विवरण पास करेगा। संदर्भ पैरामीटर के अलावा पंजीकरण के दो उदाहरणों को अलग करने का कोई तरीका नहीं है।

इसलिए, सावधानी के रूप में, यदि आप IRQF_SHARED ध्वज पास करते हैं तो आप एक पूर्ण संदर्भ पैरामीटर पास नहीं कर सकते हैं।

+0

आपको बहुत बहुत धन्यवाद! मैंने 'irqflags = IRQF_NO_SUSPEND' बदल दिया है, 'अंत में यह काम कर रहा है! –

+0

अंतिम टिप्पणी में उल्लिखित परिवर्तन को लागू करने के बाद भी, मुझे अभी भी एक ही त्रुटि संदेश मिल रहा है ("त्रुटि: आईआरक्यू 68 - कोड -22, ईआईओ 5, ईनवल 22" का अनुरोध नहीं कर सकता)। क्या आप जानते हैं कि इसका कारण क्या हो सकता है? (बीटीडब्ल्यू, मैं कर्नेल संस्करण 2.6.32 का उपयोग कर रहा हूं, इसलिए कुछ शामिल फाइलें यहां मौजूद नहीं हैं, शायद यह प्रासंगिक है) – jaff

+0

समस्या आईआरक्यू संख्या के साथ करना था। Http://www.webopedia.com/quick_ref/IRQnumbers.asp पर देखने और आईआरक्यू संख्या को 10 में बदलकर, 0 एफ 68 के बजाय, सबकुछ काम कर रहा है। – jaff

-2

irqflags में unsigned int का एक प्रकार है, लेकिन मूल रूप से इसका प्रकार long था।

निम्न कथन का प्रयास करें, यह निश्चित रूप से काम करेगा:

request_irq(irq, int068_interrupt,IRQF_SHARED | IRQF_NO_SUSPEND, "clcdint-int068", NULL);

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