/ Dev / ttyUSB के लिए बस और डिवाइस संबंध कैसे प्राप्त करें


14

मुझे USB डोंगल को पुनरारंभ करने के लिए एक स्क्रिप्ट लिखने की आवश्यकता है। मेरे पास सभी उपकरण हैं, लेकिन मैं अपने / dev / ttyUSBx को फिजिकल बस और डिवाइस से लिंक नहीं कर सकता। एक मुद्दा यह है कि मेरे पास एक ही आईडी विक्रेता और आईडी उत्पाद के साथ तीन डोंगल हैं।

अगर मैं lsusb आउटपुट करता हूं:

Bus 001 Device 004: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem
Bus 001 Device 006: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem
Bus 001 Device 007: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem
Bus 001 Device 002: ID 80ee:0021
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

और मैंने इसे संलग्न किया है:

/dev/ttyUSB0
/dev/ttyUSB3
/dev/ttyUSB5

लेकिन मैं जानना चाहता हूं कि कौन सी डिवाइस किस बस डिवाइस से संबंधित है। उदाहरण के लिए मुझे निम्नलिखित प्राप्त करने की आवश्यकता है:

/dev/ttyUSB0 -> Bus 001 Device 006
/dev/ttyUSB3 -> Bus 001 Device 004
/dev/ttyUSB5 -> Bus 001 Device 007

मैं Ubuntu सर्वर 10.04 का उपयोग कर रहा हूं और मैंने टूल का परीक्षण किया है:

lsusb
hal
lsmod

लेकिन मुझे रिश्ता नहीं मिला।

जवाबों:


11

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

मेरा सुझाव है कि आप उदाहरण के लिए प्रश्न में डिवाइस पर जाएं:

ls -l /dev/ttyUSB0

और प्रमुख और मामूली नोड संख्या प्राप्त करें। मान लीजिए कि वे 116, 7 हैं

फिर जाएं:

ls -l /sys/dev/char/116:7

( char, क्योंकि टेटी एक कैरेक्टर डिवाइस है, यदि आप एक डिस्क डिवाइस को ट्रेस कर रहे हैं, जिसके blockबजाय आप निर्दिष्ट करेंगे char)

कमांड से आउटपुट में आपको कुछ इस तरह दिखाई देगा:

lrwxrwxrwx 1 root root 0 Sep 6 00:17 116:7 -> ../../devices//sys/devices/pci0000:00/0000:00:13.5/pci0000:00/0000:00:13.5/usb1/1-3/1-3:1.1/sound/card1/pcmC1D0c

निर्देशिका /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/और इसके उपनिर्देशिका में डिवाइस के बारे में अधिक जानकारी है। एक उदाहरण के रूप में, /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/busnumऔर /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/devnum। मेरे सिस्टम पर ये डिवाइस हॉटप्लग प्रविष्टियों / / var / log / syslog में उल्लिखित बस और डिवाइस नंबर से मेल खाते हैं।

कुछ और जो मेरे सिस्टम पर / dev / video0 के लिए काम करता है:

find /sys/dev -lname '*video0' -exec cat {}/device/busnum {}/device/devnum \; 2>/dev/null

बहुत-बहुत धन्यवाद !, मैं इसके साथ कई समय से लड़ रहा हूँ। बस आगे आने वाले आगंतुकों के लिए: मेरे ubuntu Ubuntu 10.04.2 LTS में डिवाइस निर्देशिका / sys / dev / char / के बजाय / sys / char /
Ernesto Campohermoso

सुधार के लिए धन्यवाद - मैंने उस परिवर्तन के साथ उत्तर को संपादित किया है, और जानकारी को प्रिंट करने के लिए एक खोज आदेश जोड़ा है।
जॉन एस ग्रुबर 14

@JohnSGruber ठीक है, लेकिन कैसे इसे माउंट करने के लिए ?!
डॉ। जैकी

1
@ Mr.Hyde: आप / dev / ttyUSB को माउंट नहीं कर सकते हैं; केवल कुछ उपकरण जो डिस्क ड्राइव की तरह काम करते हैं, उन्हें माउंट किया जा सकता है।
जॉन एस ग्रुबर

10

वहाँ वास्तव में इसी USB डिवाइस और बस नंबर की तरह चरित्र उपकरणों को मैप करने का एक अच्छा तरीका नहीं है /dev/ttyUSB0लेकिन, यह संभव है!

कुछ इस तरह काम कर सकते हैं:

udevadm info --name=/dev/ttyUSB0 --attribute-walk

वहां से, आपको डिवाइस और उसके मूल उपकरणों के बारे में जानकारी मिलेगी। अब, यह केवल उन आंकड़ों को पार्स करने के बारे में है जो आप चाहते हैं। मैंने अतीत में इसका उपयोग किया है:

echo /dev/bus/usb/`udevadm info --name=/dev/ttyUSB0 --attribute-walk | sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p' | head -n 2 | awk '{$1 = sprintf("%03d", $1); print}'` | tr " " "/"

अब, अगर यह एक कौर नहीं है, मुझे पता नहीं क्या है! चलो इसे तोड़ दो:

udevadm info --name=/dev/ttyUSB0 --attribute-walk - डिवाइस और उसके मूल उपकरणों के बारे में जानकारी देता है

sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p'- इन आंकड़ों को पार्स करता है और "देवनाम" या "बसनम" विशेषता वाली किसी भी रेखा को वापस करता है। हम मान लेंगे कि "बसनम" को पहले सूचीबद्ध किया गया है ... और उस स्थिति में ... हम उत्पादन की पहली दो पंक्तियों को पकड़ सकते हैं।

head -n 2- आउटपुट के पहले 2 लाइनों को पकड़ो। हम यहां और अधिक कल्पना कर सकते हैं, लेकिन हम सिर्फ एक धारणा बना रहे हैं कि निकटतम माता-पिता की "बुस्नम" और "देवनाम" पहले सूचीबद्ध होने जा रहे हैं।

awk '{$1 = sprintf("%03d", $1); print}' - उन अंकों को लेता है और उन्हें शून्य के साथ पैड करता है।

echo /dev/bus/usb... - यह सब जैज echoबयानों के साथ रिक्त स्थान को बदलने के लिए लिपटा है । आप जोड़ सकते हैं -nकरने के लिए echoयदि आप पीछे चल न्यू लाइन काट करना चाहते हैं।

tr " " "/" - आगे स्लैश के साथ आउटपुट में रिक्त स्थान बदलें

यह कुछ इस तरह का उत्पादन करेगा:

/dev/bus/usb/001/011

... जो, ज़ाहिर है, डिवाइस है। यदि आप चाहें, तो आप आसानी से कुछ चीज़ों की तरह उत्पादन कर सकते हैं busnum:001 devnum:011:

echo `udevadm info --name=/dev/ttyUSB0 --attribute-walk | sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\1\ \4/p' | head -n 2 | awk '{$1 = sprintf("%s:%03d", $1, $2); print $1;}'`

1

आप नीचे कमांड का उपयोग करके नोड के बारे में सभी जानकारी पा सकते हैं:

udevadm info -a -p /sys/bus/usb-serial/devices/ttyUSB0/

कृपया अनुगामी स्लैश को हटा दें। यह "sspath नहीं मिला" देता है।
nvd
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.