USB ड्राइवर को डिवाइस में कैसे असाइन करें


30

यह प्रश्न दोतरफा है:

सबसे पहले, आप USB डिवाइस से ड्राइवर को मैन्युअल रूप से कैसे अलग करते हैं और एक अलग संलग्न करते हैं? उदाहरण के लिए, मेरे पास एक उपकरण है जो कनेक्ट होने पर स्वचालित रूप से यूएसबी-स्टोरेज ड्राइवर का उपयोग करता है।

usbview उत्पादन

Vendor Id: xxxx
Product Id: xxxx
...
    Number of Interfaces: 2
    Interface Number: 0
        Name: usb-storage
        Number of Endpoints: 2
        ...
    Interface Number: 1
        Name: (none)
        Number of Endpoints: 2
        ...

मैं USB- स्टोरेज ड्राइवर का उपयोग नहीं करना चाहता, इसलिए अपने एप्लिकेशन में मैं libusbUSB- स्टोरेज ड्राइवर को अलग करने के लिए लाइब्रेरी का उपयोग करता हूं और फिर मैं इंटरफ़ेस का दावा करता हूं। मैं तब अपने USB डिवाइस और अपने होस्ट लिनक्स सिस्टम पर चलने वाले एप्लिकेशन से डेटा भेज सकता हूं।

आप किसी एप्लिकेशन के बाहर मैन्युअल रूप से ड्राइवर को कैसे अलग कर सकते हैं?


दूसरा, मैं डिवाइस प्लगइन पर अटैच करने के लिए ड्राइवर को स्वचालित रूप से कैसे असाइन करूं? वर्तमान में मेरे पास डिवाइस अनुमतियों को स्वचालित रूप से सेट करने के लिए एक udv नियम सेटअप है:

SUBSYSTEM=="usb", ATTR{idVendor}=="xxxx", MODE="0666"

क्या मैं USB डिवाइस पर विशिष्ट इंटरफेस के लिए ड्राइवरों को असाइन करने के लिए udev नियमों का उपयोग कर सकता हूं? उदाहरण के लिए, अगर मैं चाहता था कि USB मॉड्यूल usb- स्टोरेज के बजाय इंटरफ़ेस 0 पर स्वचालित रूप से उपयोग किया जाए, तो क्या यह udv में संभव है?


1
यदि समस्या का हिस्सा सही मॉड्यूल लोड कर रहा है, तो वेब कैमरा को Angström पर देखें
Gilles 'SO- बंद करो बुराई होना'

1
क्या आपको सभी USB- स्टोरेज मॉड्यूल की आवश्यकता है? क्योंकि अगर नहीं तो आप इसे ब्लैकलिस्ट में डाल सकते हैं और यह बिल्कुल लोड नहीं होगा।
हनन एन।

@ गिल्स, मैं एलकेएम को सफलतापूर्वक लोड करने में सक्षम हूं। मेरा सवाल यह है कि मैं डिवाइस को मैन्युअल रूप से कैसे संलग्न करूं?
अलसी

@ हनन, वर्तमान में मेरे पास usb- स्टोरेज मॉड्यूल के लिए कोई उपयोग नहीं है। मैं अंत में इसे स्वचालित रूप से सही मॉड्यूल संलग्न करने के लिए ब्लैकलिस्ट करने की आवश्यकता को समाप्त कर सकता हूं, लेकिन सबसे पहले मुझे यह जानना होगा कि यूएसबीनेट कैसे संलग्न करें।
अलसी

1
@njozwiak मॉड्यूल usbnetस्वचालित रूप से लोड नहीं होगा, क्योंकि इसमें हार्डवेयर के बारे में कोई जानकारी नहीं है, जो इसका उपयोग कर सकते हैं। उदाहरण के लिए, उचित ड्राइवर और उपयोग करने की कोशिश करें modinfo kalmia। में aliasलाइनों आप के रूप में विक्रेता आईडी xxxx और उत्पाद आईडी yyyy देखेंगे usb:vxxxxpyyyy। या आप फ़ाइल /lib/modules/kernel_version/modules.usbmap को संपादित कर सकते हैं और अपने HW के लिए आप लाइन को हटा सकते हैं, जहाँ आपके लिए HW मॉड्यूल usb-storage है या उचित नेट ड्राइवर के साथ usbstorage परिवर्तित करें। लेकिन इसके बाद depmod -aयह बदलाव दूर हो जाएगा ...
जान मारेक

जवाबों:


20

प्रश्न के पहले भाग के लिए, मैंने देखा है और USB ड्राइवर को अलग करने के लिए इससे बेहतर तरीका नहीं खोज सकता है जो आप पहले से ही libusb के साथ कर रहे हैं।

सवाल के दूसरे भाग के रूप में, udv ड्राइवर लोडिंग पर प्रतिक्रिया कर सकता है , लेकिन एक विशिष्ट ड्राइवर को एक उपकरण को सौंपे जाने के लिए मजबूर नहीं करता है।

लिनक्स कर्नेल में प्रत्येक ड्राइवर एक या अधिक उपकरणों के लिए जिम्मेदार होता है। ड्राइवर खुद चुनता है कि वह किन उपकरणों का समर्थन करता है। यह डिवाइस के विक्रेता और उत्पाद आईडी की जांच करके, या, यदि वे उपलब्ध नहीं हैं (उदाहरण के लिए एक पुरानी डिवाइस), तो कुछ ऑटो-डिटेक्शन हेयूरिस्टिक्स और पवित्रता जांच करते हुए। एक बार जब चालक को विश्वास हो जाता है कि उसे एक ऐसा उपकरण मिल गया है, जो उसका समर्थन करता है, तो वह खुद को उससे जोड़ लेता है। संक्षेप में, आप अक्सर किसी विशेष ड्राइवर को किसी विशेष उपकरण का उपयोग करने के लिए मजबूर नहीं कर सकते। कभी-कभी, हालांकि, एक डिवाइस ड्राइवर उदार होता है कि वह क्या स्वीकार करता है, और एक डिवाइस वह काम कर सकता है जिसके बारे में उसे पता नहीं है। आपका माइलेज अलग-अलग होगा! अतीत में, मुझे ड्राइवरों को अजीब पीसीआई उपकरण / विक्रेता आईडी को मैन्युअल रूप से जोड़ना पड़ा है, जो उन्हें मिश्रित सफलता और कुछ मनोरंजक कर्नेल क्रैश के साथ समर्थन करना चाहिए।

अब, मॉड्यूल के मामले में, एक अतिरिक्त कदम है। मॉड्यूल लोडर कर्नेल द्वारा उठ किसी नए उपकरण का पता चला है है। यह एक 'मोडलैस' स्ट्रिंग है, जो डिवाइस की पहचान करता है और यूएसबी उपकरणों के लिए कुछ इस तरह दिखता है:

usb:v046DpC221d0170dc00dsc00dp00ic03isc00ip00

इस स्ट्रिंग में डिवाइस वर्ग ( usb) और वर्ग-विशिष्ट जानकारी (विक्रेता / डिवाइस / सीरियल नंबर, डिवाइस वर्ग, आदि) शामिल हैं। प्रत्येक कर्नेल ड्राइवर में एक पंक्ति होती है जैसे:

MODULE_ALIAS("usb:...")

जो usbalias से मेल खाना चाहिए (वाइल्डकार्ड का उपयोग कई उपकरणों से मेल खाने के लिए किया जाता है)। यदि modaliasड्राइवर जो समर्थन करता है, उससे मेल खाता है, तो यह ड्राइवर लोड हो जाता है (या यदि यह पहले से ही है, तो नए डिवाइस को अधिसूचित किया जाता है)।

आप समर्थित डिवाइस (मॉडालिया द्वारा) और उनके साथ जुड़े मॉड्यूल देख सकते हैं

less /lib/modules/`uname -r`/modules.alias

अगर आप usb-storage device के ड्राइवर के लिए grep करते हैं, तो आप देखेंगे कि इसमें कुछ विशिष्ट डिवाइस हैं जो वेंडर और डिवाइस ID द्वारा सपोर्ट करते हैं, और किसी भी डिवाइस को सही (स्टोरेज) क्लास के साथ सपोर्ट करने का प्रयास करेंगे, कोई फर्क नहीं पड़ता कि वेंडर / डिवाइस ।

आप अपने ओएस ( /etc/modprobe.d/डेबियन और दोस्तों पर) पर उपयोगकर्ताओं के तंत्र का उपयोग करके इसे प्रभावित कर सकते हैं । आप मॉड्यूल को ब्लैकलिस्ट कर सकते हैं, या आप मॉड्यूल को लोड करने के लिए निर्दिष्ट कर सकते हैं, modules.aliasफाइल की तरह (और उसी सिंटैक्स का उपयोग करके)। depmod -aफिर मॉड्यूल लोडर के पैटर्न को पुन: उत्पन्न करेगा।

हालाँकि, भले ही आप इस विशेष घोड़े को पानी में ले जा सकते हैं, लेकिन आप उसे नहीं पी सकते। यदि ड्राइवर को आपके डिवाइस के लिए कोई समर्थन नहीं है, तो उसे इसे अनदेखा करना चाहिए।

यह सामान्य मामले में सिद्धांत है।

व्यवहार में, और USB के मामले में, मुझे लगता है कि आपके डिवाइस में दो इंटरफेस हैं , जिनमें से स्टोरेज एक है। कर्नेल समग्र डिवाइस के स्टोरेज इंटरफेस से जुड़ेगा। अन्य इंटरफेस सही वर्ग है, तो usbnetड्राइवर सकता है इसे करने के लिए देते हैं। हां, आपके पास एक ही भौतिक उपकरण से जुड़े कई ड्राइवर हो सकते हैं , क्योंकि एक USB डिवाइस कई इंटरफेस निर्यात करता है (जैसे मेरा Logitech G15 कीबोर्ड दो निर्यात करता है क्योंकि इसमें एक कीबोर्ड डिवाइस और एक एलसीडी स्क्रीन है, जिनमें से प्रत्येक को एक अलग ड्राइवर द्वारा नियंत्रित किया जाता है) ।

यह तथ्य कि आपके USB डिवाइस के दूसरे इंटरफ़ेस का पता नहीं चला है, कर्नेल में समर्थन की कमी का संकेत है। जो भी मामला है, आप का उपयोग कर विस्तार से उपकरण इंटरफेस / समापन बिंदु सूचीबद्ध कर सकते हैं lsusb -v | less, तो अपने विशेष डिवाइस के लिए नीचे स्क्रॉल (आप डिवाइस द्वारा उत्पादन को सीमित कर सकते हैं: विक्रेता आईडी या यूएसबी पथ यदि आप बहुत इच्छुक हैं)।

कृपया ध्यान दें: मैं USB उपकरणों की तार्किक संरचना के संबंध में यहाँ थोड़ा देख रहा हूँ। USB कंसोर्टियम को दोष दें। :)


4
static struct usb_device_id id_table [] = { { USB_DEVICE(VENDOR_ID, PRODUCT_ID) }, { }, }; MODULE_DEVICE_TABLE (usb, id_table);कोड में पहले से ही है, क्या यह मोडलैस के साथ बेमानी है?
थॉमस

मेरे मामले में उन पंक्तियों को ड्राइवर के भीतर कहीं भी मेकफाइल मैजिक द्वारा ऑटोजेनर किया गया है। इसलिए मैंने MODULE_ALIAS के लिए तीन बार लाइनें जोड़ीं, लेकिन यह कभी सूचीबद्ध नहीं हुई। वैसे भी lsusb -v के लिए धन्यवाद। इसके साथ ही मैं इसे देख सकता था और अपने विचार में दोष ढूँढ सकता था। फिर मैंने एक ज्ञात पहचानकर्ता के लिए स्रोत को पकड़ लिया और उन प्रविष्टियों के साथ सरणी पाया जिन्हें मुझे हेरफेर करना था।
जैकगिनिंगकैट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.