2016-02-08 10 views
5

मैं लिनक्स के लिए एक पीसीआईई ड्राइवर लिख रहा हूं, वर्तमान में डीएमए के बिना, और पीसीआई डिवाइस को पढ़ने और लिखने के बारे में जानने की आवश्यकता है जब यह उपयोगकर्ता स्थान से सक्षम हो।पीसीआई चालक - उपयोगकर्ता स्थान कैसे पहुंचता है?

चालक मैं जांच() में मूल बातें कर में:

pci_enable_device(); 
pci_request_regions(); 
pci_iomap(); 

लेकिन तब मैं कैसे उपयोगकर्ता अंतरिक्ष से इस स्मृति पढ़ना और लिखना उपयोग करते हैं? क्या मैं अपने पीसीआई ड्राइवर में फाइल ऑपरेशंस जोड़ता हूं?

open('mapped memory location'); 
mmap(...); 

यदि ऐसा है तो स्थान क्या है: pci_iomap से स्मृति कुछ जगह है जहाँ उपयोगकर्ता अंतरिक्ष कोड कॉल कर सकते हैं दिखाई देती है?

नोट: PCIe डिवाइस इस तरह के ऑडियो, ईथरनेट, आदि

+0

सुनिश्चित नहीं है कि यह चीजों को करने का अनुशंसित तरीका है, लेकिन अन्य कर्नेल ड्राइवर वर्चुअल डिवाइस जैसे '/ dev/vboxnetctl 'का पर्दाफाश करते हैं, जो मुझे लगता है कि आप आदेश जारी कर सकते हैं। मुझे यकीन नहीं है कि लिनक्स कर्नेल किसी भी उपयोगकर्ता स्पेस प्रोग्राम को पीसीआईई डिवाइस को पढ़ने/लिखने की अनुमति देगा, ऐसा लगता है कि यह खतरनाक हो सकता है। –

+0

मैं उस पर भी देख रहा था। क्या मेरे डिवाइस को वहां दिखाने के लिए मुझे कुछ भी करने की ज़रूरत है? उदाहरण के लिए, मैं अपने ड्राइवर में कौन सी एपीआई कॉल करता हूं? – user2205930

+0

शायद विचारों के लिए वर्चुअलबॉक्स ड्राइवर स्रोत कोड पर नज़र डालें। –

उत्तर

0

आप register_chrdev और device_create जैसे कार्यों का उपयोग कर उपकरणों रजिस्टर कर सकते हैं के रूप में किसी भी लिनक्स उप-प्रणालियों में प्लग नहीं होंगे।

static int __init chr_dev_init(void) 
{ 
    int minor; 

    if (register_chrdev(MEM_MAJOR, "mem", &memory_fops)) 
     printk("unable to get major %d for memory devs\n", MEM_MAJOR); 

    mem_class = class_create(THIS_MODULE, "mem"); 
    if (IS_ERR(mem_class)) 
     return PTR_ERR(mem_class); 

    mem_class->devnode = mem_devnode; 
    for (minor = 1; minor < ARRAY_SIZE(devlist); minor++) { 
     if (!devlist[minor].name) 
      continue; 

     /* 
     * Create /dev/port? 
     */ 
     if ((minor == DEVPORT_MINOR) && !arch_has_dev_port()) 
      continue; 

     device_create(mem_class, NULL, MKDEV(MEM_MAJOR, minor), 
        NULL, devlist[minor].name); 
    } 

    return tty_init(); 
} 

fs_initcall(chr_dev_init); 
+0

हां, मैंने अंततः अपने पीसीआई डिवाइस के लिए एक चरित्र डिवाइस ड्राइवर बनाया। मैं और जानने के लिए दूसरों को लिनक्स डिवाइस ड्राइवर्स पुस्तक, अध्याय 3 पढ़ने के लिए अनुशंसा करता हूं। यह पुराना है लेकिन आप जाने के लिए कुछ मूल बातें चुन सकते हैं। – user2205930

2

तुम सिर्फ, उपयोगकर्ता अंतरिक्ष के लिए कर्नेल अंतरिक्ष से स्मृति निर्यात और बीच में आता है प्राप्त करने के लिए UIO driver के बारे में सोचना चाहते हैं: kernel source for /dev/null and /dev/mem पर विचार करें।

इसके साथ, सभी एक्सेस/dev/uioX फ़ाइल के माध्यम से किए जाएंगे। आप स्मृति निर्यात करने के लिए mmap() पर कर सकते हैं और आप इंटरप्ट को "पकड़ने" के लिए पढ़ सकते हैं (अवरुद्ध पढ़ने के साथ)।

यूआईओ पीसीआई के लिए पूरी तरह उपयुक्त है, इसके लिए कर्नेल में already is a driver है।

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