Peta jalur perangkat USB fisik ke nomor Bus / Perangkat yang dikembalikan oleh lsusb

9

Saya perlu mendapatkan judul perangkat USB yang terpasang. Saya bisa melakukannya dengan lsusb.

udev memungkinkan beberapa pergantian ketika saya menulis aturan: katakanlah, kita dapat menggunakan $kerneluntuk mendapatkan nama perangkat, atau $devpathuntuk mendapatkan jalur ke perangkat.

Tapi masalahnya adalah lsusbmengembalikan string seperti itu:

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

Tapi devpath udev adalah:

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

Nomor bus adalah sama ( 5), tetapi jumlahnya berbeda: Device 032tampaknya ada beberapa nomor logis (ketika saya memasang kembali perangkat, angka ini bertambah), dan 2tampaknya menjadi nomor perangkat fisik.

Jadi udev mengembalikan bilangan fisik, dan saya perlu mendapatkan bilangan logis. Lalu, saya dapat mengambil data seperti ini:lsusb -D /dev/bus/usb/005/032

Jadi, bagaimana saya bisa mendapatkan nomor perangkat logis 032dengan jalur fisik seperti /devices/pci0000:00/0000:00:1d.0/usb5/5-2?

Dmitry Frank
sumber

Jawaban:

5

Pertama, kita perlu tambahkan /syske jalan dikembalikan oleh udev, sehingga jalan yang menjadi sesuatu seperti: /sys/devices/pci0000:00/0000:00:1d.0/usb5/5-2. Lalu pergi ke direktori ini, dan akan ada beberapa file di dalamnya. Di antara yang lain, ada busnumdan devnumfile, mereka berisi angka-angka "logis" ini. Jadi, dalam skrip bash, kita dapat mengambilnya seperti itu:

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"

Juga perhatikan bahwa udevdapat mengembalikan ini busnumdan devnumsecara langsung: di RUN+="..."kita dapat menggunakan substitusi $attr{busnum}dan $attr{devnum}masing - masing.

Dmitry Frank
sumber
1
Saya bingung dengan perbedaan penggunaan udevvs lsusbdan sys/devices/..vs. /dev/bus/usb/..dan menilai jawaban Anda, sepertinya Anda tahu :) Mungkin Anda bisa menjelaskan dua pertanyaan ini? askubuntu.com/questions/342061/power-on-off-usb-ports dan askubuntu.com/questions/498950/…
gila tentang
@nuttyaboutnatty, sayangnya saya tidak bisa memberi Anda petunjuk tentang masalah Anda (tentang mematikan perangkat). Saya baru belajar hal-hal linux hari ini, dan saya cukup jauh dari segala jenis guru. Sangat sedikit tentang /sys/devices/...vs /dev/...: /sysdiisi oleh kernel, ini merupakan representasi dari hirarki perangkat kernel yang sebenarnya. Udev adalah daemon ruang pengguna yang menangani /syshierarki dan populate /dev/...(mengambil aturan dalam akun). Jadi, udev sepenuhnya bertanggung jawab atas /devkonten.
Dmitry Frank
1

Jawaban yang diterima benar-benar tidak banyak membantu saya. Saya akhirnya menemukan cara dengan memeriksa idProduct dan idVendor jika ada. Ini skrip shell

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

Inilah yang saya dapatkan di sistem saya.

$ ./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

Di sini saya bisa melihat, bahwa misalnya 0a5c:21e6, yang merupakan perangkat bluetooth, peta ke 2-1.4.

Untuk kenyamanan yang lebih besar Anda bisa mendefinisikan ini sebagai fungsi di shell Anda, sesuatu seperti

$ 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
Kristopolous
sumber