วิธีรับความสัมพันธ์ของบัสและอุปกรณ์สำหรับ / dev / ttyUSB


14

ฉันต้องเขียนสคริปต์เพื่อรีสตาร์ทดองเกิล USB ฉันมีเครื่องมือทั้งหมด แต่ฉันไม่สามารถเชื่อมโยง / dev / ttyUSBx ของฉันกับรถบัสทางกายภาพและอุปกรณ์ได้ ปัญหาคือฉันมีดองเกิลสามตัวที่มีผู้ขาย id และผลิตภัณฑ์ id เดียวกัน

ถ้าฉันทำ 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

แต่ฉันอยากรู้ว่าอุปกรณ์ใดที่เกี่ยวข้องกับ Bus Bus โดยตัวอย่างฉันต้องได้รับต่อไปนี้:

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

ฉันใช้ Ubuntu Server 10.04 และฉันทดสอบเครื่องมือ:

lsusb
hal
lsmod

แต่ฉันไม่สามารถรับความสัมพันธ์ได้

คำตอบ:


11

เนื่องจากฉันไม่มีฮาร์ดแวร์ของคุณฉันไม่สามารถให้คำตอบที่แน่นอนได้

ฉันขอแนะนำให้คุณไปที่อุปกรณ์ที่เป็นปัญหาตัวอย่างเช่น:

ls -l /dev/ttyUSB0

และรับหมายเลขโหนดหลักและรอง สมมติว่าพวกเขาคือ 116, 7

จากนั้นไปที่:

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

( charเนื่องจาก tty เป็นอุปกรณ์ตัวอักษรหากคุณติดตามอุปกรณ์ดิสก์ที่คุณจะระบุ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ในระบบของฉันตรงกับหมายเลขบัสและอุปกรณ์ที่ระบุไว้ในรายการ hotplug ของอุปกรณ์ใน / var / log / syslog

อย่างอื่นที่ทำงานบนระบบของฉันสำหรับ / dev / video0:

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

ขอบคุณมาก! ฉันได้ต่อสู้กับสิ่งนี้มาหลายครั้ง สำหรับผู้เยี่ยมชมเพิ่มเติม: ในอูบุนตูอูบุนตู 10.04.2 LTS ไดเรกทอรีอุปกรณ์คือ / sys / dev / char / แทน / sys / char /
Ernesto Campohermoso

ขอบคุณสำหรับการแก้ไข - ฉันได้แก้ไขคำตอบด้วยการเปลี่ยนแปลงนั้นและเพิ่มคำสั่ง find เพื่อพิมพ์ข้อมูล
John S Gruber

@JohnSGruber ตกลง แต่จะติดมันได้ยังไง?!
Dr.jacky

1
@ Mr.Hyde: คุณไม่สามารถติดตั้ง / dev / ttyUSB; สามารถติดตั้งอุปกรณ์บางตัวที่ทำงานเหมือนดิสก์ไดรฟ์ได้
John S Gruber

10

ไม่มีวิธีที่ดีในการแมปอุปกรณ์อักขระเช่นอุปกรณ์/dev/ttyUSB0USB และหมายเลขบัสที่สอดคล้องกันได้ แต่มันเป็นไปได้!

สิ่งนี้อาจใช้งานได้:

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'- แยกวิเคราะห์ข้อมูลเหล่านี้และส่งคืนบรรทัดใด ๆ ที่มีแอตทริบิวต์ "devnum" หรือ "busnum" เราจะสมมติว่า "busnum" เป็นรายการแรก ... และในกรณีนี้ ... เราสามารถคว้าเอาท์พุทสองบรรทัดแรกได้

head -n 2- หยิบเอาท์พุท 2 บรรทัดแรก เราอาจได้รับแฟนซีมากขึ้นที่นี่ แต่เราเพิ่งตั้งสมมติฐานว่า "busnum" และ "devnum" ของผู้ปกครองที่ใกล้เคียงที่สุดจะเข้าจดทะเบียนก่อน

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/

โปรดลบเครื่องหมายทับต่อท้าย มันให้ "ไม่พบ syspath"
nvd
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.