एम्बेडेड पर ttyUSB0 के लिए कस्टम पीआईडी ​​के साथ यूएसबी-सीरियल डिवाइस संलग्न करना


19

मैं एक सफल PID के साथ FTDI USB- सीरियल डिवाइस को स्वचालित रूप से (या यहां तक ​​कि मैन्युअल रूप से) ttyUSB% n के साथ संलग्न करने का प्रयास कर रहा हूं, बहुत सफलता के बिना। डिवाइस का सामान्य VID / PID 0403/6001 है। जब इस तरह से प्रोग्राम किया जाता है, तो यह पूरी तरह से काम करता है और प्लग में होने पर स्वतः ही ttyUSB0 से जुड़ जाता है। यहां तक ​​कि ड्राइवर के साथ हमारे नए पीआईडी ​​का सम्मान करने के लिए recompiled, जब कस्टम एक ttyUSB0 के साथ प्रोग्राम नहीं दिखाई देता है, लेकिन यह एक ftdi_sio डिवाइस और के रूप में पहचान नहीं करता है ड्राइवर लोड करता है।

मैंने हमारे पीआईडी ​​को हेडर और स्रोत में जोड़ा है:

// in ftdi_sio_ids.h
#define FTDI_CUSTOM_PID 0xABCD // not the actual pid
// then in ftdi_sio.c
static struct usb_device_id id_table_combined [] = {
    // devices....
    { USB_DEVICE(FTDI_VID, FTDI_CUSTOM_PID) },
    // ....

पूरे कर्नेल को पुन: संयोजित कर दिया और डिवाइस को फिर से चालू कर दिया। जब मैं डिवाइस को प्लग इन करता हूं तो मुझे यह मिलता है:

usb 1-1: new full-speed USB device number 2 using at91_ohci
usbcore: registered new interface driver usbserial
usbserial: USB Serial Driver core
USB Serial support registered for FTDI USB Serial Device
usbcore: registered new interface driver ftdi_sio
ftdi_sio: v1.6.0:USB FTDI Serial Converters Driver

lsusb सही कस्टम VID / PID दिखाता है। ड्राइवर को यह लगता है कि यह इसके साथ ftdi_sio का उपयोग करने वाला है, लेकिन इसे ttyUSB0 से संलग्न नहीं करना चाहिए, जैसे कि यह अनमॉडिफाइड PID के साथ होगा। किसी भी सुझाव के रूप में मैं यहाँ क्या गलत कर रहा हूँ?


1
यह कौन सा एम्बेडेड प्रकार है? क्या इसमें UDEV है? यदि हां, तो UDEV आपकी सबसे अच्छी शर्त है (और मैं इसके साथ आगे मदद कर सकता हूं)।
ब्रायन रेडबर्ड

जवाबों:


17

आपको कर्नेल को केवल एक बार इसे संशोधित करने की आवश्यकता नहीं है; आप इसे ओवरराइड कर सकते हैं।

  1. डिवाइस निकालो
  2. modprobe ftdi_sio
  3. echo 0403 6001 >/sys/bus/usb-serial/drivers/ftdi_sio/new_id
  4. डिवाइस में प्लग करें

और आपका डिवाइस काम करना चाहिए।

आपका अन्य विकल्प bindsysfs इंटरफ़ेस का उपयोग करना है; मैं lsusb -tउस मामले में सही पथ + इंटरफ़ेस का पता लगाने का उपयोग करने का सुझाव देता हूं ।

मेरे सिस्टम से एक आंशिक उदाहरण का उपयोग करते हुए, एक usb- स्टोरेज डिवाइस (यह usb-serial के लिए बहुत समान होगा)।

$ lsusb -t
...
/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 5000M
    |__ Port 1: Dev 5, If 0, Class=Hub, Driver=hub/3p, 5000M
        |__ Port 3: Dev 6, If 0, Class=Hub, Driver=hub/3p, 5000M
            |__ Port 3: Dev 7, If 0, Class=Mass Storage, Driver=usb-storage, 5000M
 ...
 $ echo '4-1.3.3:1.0' >/sys/bus/usb/drivers/usb-storage/bind

नंबर का स्वरूप है: BUS-PORT(.PORT)+:1.INTERFACE। एकमात्र नंबर जो कि lsusb आउटपुट में दिखाई नहीं देता है वह कोलन के बाद का पहला अंक है; और यह हमेशा 1मेरे अनुभव में रहा है। गहन कर्नेल ज्ञान वाला कोई व्यक्ति शायद मुझे बता सकता है कि यह क्या है और एक काउंटर-उदाहरण प्रदान करता है।


पूरी तरह से काम किया, धन्यवाद। स्वीकृत उत्तर होना चाहिए।
अमृत ​​बेखित

1
बस सोच रहा था: अगर मैं अपना मन बदलूं, और मैं नहीं चाहता कि यह vid / ptd ftdi_sio ड्राइवर का उपयोग करे, लेकिन एक और, मैं इस कदम को कैसे वापस लाऊं?
ब्राम

हटाने के लिए vid / pid लिखें।
रॉबट

@trycatch क्या आप उत्तर स्वीकार कर सकते हैं?
रॉबट 2

1
@kay new_id / remove_id केवल गतिशील रूप से जोड़े गए आईडी को हटाने के लिए है। अगर मैं समझता हूं कि आप क्या करना चाहते हैं: आप किसी विशिष्ट ड्राइवर को कुछ डिवाइस के लिए लोड होने से रोकना चाहते हैं।
रॉबट 2

13

आपको कर्नेल को संशोधित करने की आवश्यकता नहीं है, आप इस तरह की प्रक्रिया को स्वचालित कर सकते हैं:

  1. निम्नलिखित सिंगल लाइन को इसमें जोड़ें /etc/udev/rules.d/99-ftdi.rules

    ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", RUN+="/sbin/modprobe ftdi_sio" RUN+="/bin/sh -c 'echo 0403 6001 > /sys/bus/usb-serial/drivers/ftdi_sio/new_id'"

  2. sudo udevadm control --reloadनए नियम को लेने के लिए या तो रिबूट या रन करें।

  3. डिवाइस निकालो।

  4. डिवाइस में प्लग करें।


1

इसी तरह की स्थिति SiLabs से निकाले गए बोर्ड के साथ हुई है - USB-UART चिप CP2102 अनियमित VID / PID के साथ प्रदान की जा रही है:

lsusb

Bus 001 Device 002: ID 10c4:804c Cygnal Integrated Products, Inc.

मॉड्यूल cp210x लोड करने और VID / PID भेजने से पहले हल की गई समस्या:

sudo modprobe cp210x

sudo -s

echo 10c4 804c > /sys/bus/usb-serial/drivers/cp210x/new_id

udv के लिए इसी 99-cp210.rules फ़ाइल निम्नलिखित लगती है:

ACTION=="add", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="804c", RUN+="/sbin/modprobe cp210x" RUN+="/bin/sh -c 'echo 10c4 804c > /sys/bus/usb-serial/drivers/cp210x/new_id'"


भविष्य यात्रियों काम करने के लिए एक HUSBZB -1 छड़ी प्राप्त करने की कोशिश के लिए, यहाँ एक udev फ़ाइल जो cp210x चालक के रूप में ऊपर उल्लेख किया लिंक किया जाएगा और tty उपकरणों सिमलिंक के लिए / dev / ZigBee और / dev / z-लहर है ACTION=="add", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="8a2a", RUN+="/sbin/modprobe cp210x" RUN+="/bin/sh -c 'echo 10c4 8a2a > /sys/bus/usb-serial/drivers/cp210x/new_id'" SUBSYSTEM=="tty", ATTRS{interface}=="HubZ Z-Wave Com Port", SYMLINK+="zwave" SUBSYSTEM=="tty", ATTRS{interface}=="HubZ ZigBee Com Port", SYMLINK+="zigbee"
अस्पष्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.