Cách nhận mối quan hệ Xe buýt và Thiết bị cho a / dev / ttyUSB


14

Tôi cần phải viết một kịch bản để khởi động lại khóa USB. Tôi có tất cả các công cụ nhưng tôi không thể liên kết / dev / ttyUSBx của mình với XE và THIẾT BỊ vật lý. Một vấn đề là tôi có ba dongle với cùng một nhà cung cấp id và sản phẩm id.

Nếu tôi làm lsusb thì đầu ra là:

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

Và tôi đã đính kèm nó vào:

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

Nhưng tôi muốn biết thiết bị nào có liên quan đến Thiết bị Bus nào. Ví dụ tôi cần có được những điều sau đây:

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

Tôi đang sử dụng Ubuntu Server 10.04 và tôi đã thử nghiệm các công cụ:

lsusb
hal
lsmod

Nhưng tôi không thể có được mối quan hệ.

Câu trả lời:


11

Vì tôi không có phần cứng của bạn nên tôi không thể cho bạn câu trả lời chính xác.

Tôi muốn đề nghị bạn đi đến thiết bị được đề cập, ví dụ:

ls -l /dev/ttyUSB0

và có được số nút chính và phụ. Hãy nói rằng họ là 116, 7

Sau đó đi đến:

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

( char, vì tty là một thiết bị ký tự, nếu bạn truy tìm một thiết bị đĩa, bạn sẽ chỉ định blockthay vì char)

Trong đầu ra từ lệnh, bạn sẽ thấy một cái gì đó giống như:

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

Thư /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/mục và thư mục con của nó có nhiều thông tin trên thiết bị. Như một ví dụ, /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/busnum/sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/devnum. Trên hệ thống của tôi, các số này khớp với số xe buýt và số thiết bị được đề cập trong các mục nhập cắm nóng thiết bị trong / var / log / syslog.

Một cái gì đó khác hoạt động trên hệ thống của tôi cho / dev / video0:

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

Cảm ơn bạn rất nhiều! Tôi đã chiến đấu với điều này trong nhiều thời gian. Chỉ dành cho khách truy cập tiếp theo: Trong Ubuntu 10.04.2 LTS của tôi, thư mục thiết bị là / sys / dev / char / thay vì / sys / char /
Ernesto Campohermoso

Cảm ơn đã sửa lỗi - Tôi đã chỉnh sửa câu trả lời với thay đổi đó và thêm lệnh tìm để in thông tin.
John S Gruber

@JohnSGruber Ok, nhưng làm thế nào để gắn kết nó?!
Dr.jacky

1
@ Mr.Hyde: Bạn không thể gắn kết a / dev / ttyUSB; chỉ một số thiết bị hoạt động như ổ đĩa có thể được gắn.
John S Gruber

10

Thực sự không cách nào tốt để ánh xạ các thiết bị ký tự như thiết bị /dev/ttyUSB0USB và số xe buýt tương ứng. NHƯNG, nó là có thể!

Một cái gì đó như thế này có thể hoạt động:

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

Từ đó, bạn sẽ nhận được một loạt thông tin về thiết bị và các thiết bị mẹ của nó. Bây giờ, tất cả chỉ là phân tích những dữ liệu đó để có được những gì bạn muốn. Tôi đã sử dụng điều này trong quá khứ:

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

Bây giờ, nếu đó không phải là một câu cửa miệng, tôi không biết là gì! Hãy phá vỡ nó:

udevadm info --name=/dev/ttyUSB0 --attribute-walk - trả về thông tin về thiết bị và các thiết bị mẹ của nó

sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p'- phân tích các dữ liệu này và trả về bất kỳ dòng nào có chứa thuộc tính "devnum" hoặc "busnum". Chúng tôi sẽ cho rằng "busnum" được liệt kê đầu tiên ... và trong trường hợp đó ... chúng tôi chỉ có thể lấy hai dòng đầu ra đầu tiên.

head -n 2- Lấy 2 dòng đầu ra. Chúng tôi có thể trở nên lạ mắt hơn ở đây, nhưng chúng tôi chỉ đưa ra một giả định rằng "busnum" và "devnum" của cha mẹ gần nhất sẽ được liệt kê đầu tiên.

awk '{$1 = sprintf("%03d", $1); print}' - Lấy các chữ số đó và đệm chúng bằng số không.

echo /dev/bus/usb... - tất cả nhạc jazz này được gói gọn trong một echotuyên bố để thay thế các dòng mới bằng khoảng trắng. Bạn có thể thêm -nvào echonếu bạn muốn cắt bỏ dòng mới.

tr " " "/" - thay thế khoảng trắng ở đầu ra bằng dấu gạch chéo

Điều này sẽ tạo ra một cái gì đó như:

/dev/bus/usb/001/011

... Tất nhiên, đó là thiết bị. Nếu bạn muốn, bạn có thể dễ dàng xuất ra một cái gì đó như busnum:001 devnum:011với một vài điều chỉnh:

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

Bạn có thể tìm thấy tất cả thông tin về nút bằng lệnh bên dưới:

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

Vui lòng xóa dấu gạch chéo. Nó cho "syspath không tìm thấy".
nvd
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.