Ánh xạ đường dẫn thiết bị USB vật lý tới số Bus / Thiết bị được trả về bởi lsusb


9

Tôi cần lấy tiêu đề của thiết bị USB đính kèm. Tôi có thể làm điều đó với lsusb.

udev cho phép một số thay thế khi tôi viết quy tắc: giả sử, chúng ta có thể sử dụng $kernelđể lấy tên của thiết bị hoặc $devpathđể có đường dẫn đến thiết bị.

Nhưng vấn đề là lsusbtrả về chuỗi như thế:

Bus 005 Device 032: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC

Nhưng sự đồng cảm của udev là:

/devices/pci0000:00/0000:00:1d.0/usb5/5-2 

Số xe buýt giống nhau ( 5), nhưng số khác nhau: Device 032dường như là số logic (khi tôi gắn lại thiết bị, số này tăng) và 2dường như là số thiết bị vật lý.

Vì vậy, udev trả về số vật lý, và tôi cần lấy số logic. Sau đó, tôi có thể lấy dữ liệu như thế này:lsusb -D /dev/bus/usb/005/032

Vì vậy, làm thế nào tôi có thể có được số thiết bị hợp lý 032theo đường dẫn vật lý như thế /devices/pci0000:00/0000:00:1d.0/usb5/5-2nào?

Câu trả lời:


5

Đầu tiên, chúng ta cần thêm vào /sysđường dẫn được trả về udev, để đường dẫn đó trở thành một cái gì đó như : /sys/devices/pci0000:00/0000:00:1d.0/usb5/5-2. Sau đó vào thư mục này và sẽ có một vài tệp trong đó. Trong số những người khác, có busnumdevnumcác tập tin, chúng chứa những con số "hợp lý" này. Vì vậy, trong tập lệnh bash, chúng ta có thể truy xuất chúng như thế:

devpath='/devices/pci0000:00/0000:00:1d.0/usb5/5-2'

busnum=$(cat "/sys/$devpath/busnum")
devnum=$(cat "/sys/$devpath/devnum")

# we might want to make busnum and devnum have leading zeros
# (say, "003" instead of "3", and "012" instead of "12")
busnum=$(printf %03d $busnum)
devnum=$(printf %03d $devnum)

# now, we can retrieve device data by   lsusb -D /dev/bus/usb/$busnum/$devnum

echo "busnum=$busnum, devnum=$devnum"

Cũng lưu ý rằng udevcó thể trả lại những thứ này busnumdevnumtrực tiếp: trong RUN+="..."chúng ta có thể sử dụng thay thế $attr{busnum}$attr{devnum}tương ứng.


1
Tôi bối rối bởi các cách sử dụng khác nhau udevso với lsusbsys/devices/..so với /dev/bus/usb/..và đánh giá bằng câu trả lời của bạn mà bạn dường như đang biết :) Có lẽ bạn có thể làm sáng tỏ hai câu hỏi này? askubuntu.com/questions/342061/power-on-off-usb-portsaskubuntu.com/questions/498950/...
hấp dẫn về Natty

@nuttyaboutnatty, thật không may, tôi không thể cung cấp cho bạn bất kỳ manh mối nào về vấn đề của bạn (về việc tắt nguồn thiết bị). Tôi chỉ đang học những thứ linux ngày nay, và tôi ở khá xa bất kỳ loại bậc thầy nào. Rất ít về /sys/devices/...vs /dev/...: /sysđược tạo bởi kernel, nó đại diện cho hệ thống phân cấp thiết bị kernel thực sự. Udev là một trình nền không gian người dùng xử lý /sysphân cấp và dân cư /dev/...(lấy quy tắc trong tài khoản). Vì vậy, udev hoàn toàn chịu trách nhiệm về /devnội dung.
Dmitry Frank

1

Câu trả lời được chấp nhận thực sự không giúp tôi nhiều. Cuối cùng tôi đã tìm ra một cách bằng cách thăm dò idSản phẩm và idVendor nếu chúng tồn tại. Đây là một kịch bản shell

#!/bin/bash
{ 
  cd /sys/bus/usb/devices
  for i in *; do 
    [ -e $i/idProduct ] && echo $(cat $i/idVendor $i/idProduct) $i
  done
}

Đây là những gì tôi nhận được trên hệ thống của mình.

$ ./script
0424 2514 1-3
8087 0024 2-1
0a5c 21e6 2-1.4
8087 0024 4-1
1d6b 0002 usb1
1d6b 0002 usb2
1d6b 0003 usb3
1d6b 0002 usb4

$ lsusb
Bus 004 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 006: ID 0a5c:21e6 Broadcom Corp. BCM20702 Bluetooth 4.0 [ThinkPad]
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Ở đây tôi có thể thấy, ví dụ 0a5c:21e6, đó là một thiết bị bluetooth, ánh xạ tới 2-1.4.

Để thuận tiện hơn nữa, bạn có thể định nghĩa đây là một hàm trong vỏ của mình, đại loại như

$ cat >> ~/.bashrc << ENDL
gousb() {
  for i in /sys/bus/usb/devices/*; do 
    if [ -e \$i/idProduct ]; then
      if [ \$(cat \$i/idVendor):\$(cat \$i/idProduct) = \$1 ]; then 
        cd \$i
        return
      fi
    fi
  done

  echo "\$1 not found :-("
}
ENDL
$ source ~/.bashrc
$ gousb 0a5c:21e6
$ pwd 
/sys/bus/usb/devices/2-1.4
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.