Cara mendapatkan hubungan Bus dan Perangkat untuk a / dev / ttyUSB

14

Saya perlu menulis skrip untuk me-restart dongle USB. Saya memiliki semua alat tetapi saya tidak dapat menautkan / dev / ttyUSBx saya ke BUS fisik dan PERANGKAT. Masalahnya adalah saya memiliki tiga dongle dengan vendor id dan produk id yang sama.

Jika saya melakukan lsusb outputnya adalah:

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

Dan saya telah melampirkannya di:

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

Tapi saya ingin tahu perangkat mana yang terkait dengan Perangkat Bus mana. Sebagai contoh, saya perlu mendapatkan yang berikut ini:

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

Saya menggunakan Ubuntu Server 10.04 dan saya menguji alat:

lsusb
hal
lsmod

Tapi aku tidak bisa mendapatkan hubungan.

Ernesto Campohermoso
sumber

Jawaban:

11

Karena saya tidak memiliki perangkat keras Anda, saya tidak dapat memberikan jawaban yang tepat.

Saya sarankan Anda pergi ke perangkat yang dimaksud, misalnya:

ls -l /dev/ttyUSB0

dan mendapatkan nomor simpul besar dan kecil. Katakanlah mereka 116, 7

Lalu pergi ke:

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

( char, karena tty adalah perangkat karakter, jika Anda menelusuri perangkat disk, Anda akan menentukan blockbukan char)

Dalam output dari perintah, Anda akan melihat sesuatu seperti:

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

Direktori /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/dan subdirektori memiliki banyak informasi tentang perangkat. Sebagai contoh, /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/busnumdan /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/devnum. Di sistem saya ini cocok dengan nomor bus dan perangkat yang disebutkan dalam entri hotplug perangkat di / var / log / syslog.

Hal lain yang berfungsi pada sistem saya untuk / dev / video0:

find /sys/dev -lname '*video0' -exec cat {}/device/busnum {}/device/devnum \; 2>/dev/null
John S Gruber
sumber
Terima kasih banyak !, saya telah berjuang dengan ini selama beberapa waktu. Hanya untuk pengunjung lebih lanjut: Di ubuntu Ubuntu 10.04.2 LTS saya direktori perangkat adalah / sys / dev / char / bukan / sys / char /
Ernesto Campohermoso
Terima kasih atas koreksinya - Saya telah mengedit jawaban dengan perubahan itu, dan menambahkan perintah temukan untuk mencetak informasi.
John S Gruber
@ JohnSGruber Ok, tapi bagaimana cara memasangnya ?!
Dr.jacky
1
@ Mr.Hyde: Anda tidak dapat memasang / dev / ttyUSB; hanya beberapa perangkat yang beroperasi seperti disk drive yang dapat dipasang.
John S Gruber
10

Sebenarnya tidak ada cara yang baik untuk memetakan perangkat karakter seperti /dev/ttyUSB0ke perangkat USB dan nomor bus yang sesuai. TAPI, itu mungkin!

Sesuatu seperti ini mungkin bekerja:

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

Dari sana, Anda akan mendapatkan banyak informasi tentang perangkat dan perangkat induknya. Sekarang, itu semua hanya tentang parsing data tersebut untuk mendapatkan apa yang Anda inginkan. Saya pernah menggunakan ini di masa lalu:

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 " " "/"

Sekarang, jika itu bukan suap, saya tidak tahu apa itu! Mari kita jabarkan:

udevadm info --name=/dev/ttyUSB0 --attribute-walk - mengembalikan info tentang perangkat dan perangkat induknya

sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p'- mem-parsing data ini dan mengembalikan setiap baris yang mengandung atribut "devnum" atau "busnum". Kami akan berasumsi bahwa "busnum" terdaftar pertama ... dan dalam hal ini ... kami hanya dapat mengambil dua baris pertama output.

head -n 2- Ambil 2 garis output pertama. Kita bisa menjadi lebih mewah di sini, tetapi kita hanya membuat asumsi bahwa "busnum" dan "devnum" orang tua terdekat akan didaftar terlebih dahulu.

awk '{$1 = sprintf("%03d", $1); print}' - Mengambil digit itu dan membalutnya dengan nol.

echo /dev/bus/usb... - semua jazz ini dibungkus menjadi echopernyataan untuk mengganti baris baru dengan spasi. Anda dapat menambahkan -nke echojika Anda ingin memotong baris tambahan.

tr " " "/" - ganti spasi dalam output dengan garis miring ke depan

Ini akan menampilkan sesuatu seperti:

/dev/bus/usb/001/011

... yang, tentu saja, adalah perangkatnya. Jika mau, Anda dapat dengan mudah menampilkan sesuatu seperti busnum:001 devnum:011dengan beberapa penyesuaian:

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;}'`
BMiner
sumber
1

Anda dapat menemukan semua informasi tentang simpul menggunakan perintah di bawah ini:

udevadm info -a -p /sys/bus/usb-serial/devices/ttyUSB0/
ravibhuva9955
sumber
Harap hapus garis miring trailing. Ini memberi "syspath tidak ditemukan".
nvd