Ordnen Sie den physischen USB-Gerätepfad der von lsusb zurückgegebenen Bus- / Gerätenummer zu

9

Ich muss den Titel des angeschlossenen USB-Geräts erhalten. Ich kann das mit machen lsusb.

udev erlaubt einige Ersetzungen, wenn ich Regeln schreibe: Sagen wir, wir können verwenden $kernel, um den Namen des Geräts abzurufen oder $devpathum den Pfad zum Gerät abzurufen.

Das Problem ist jedoch, dass lsusbder folgende String zurückgegeben wird:

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

Aber udevs Devpath ist:

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

Die Busnummer ist dieselbe ( 5), aber die Nummern sind unterschiedlich: Device 032scheint eine logische Nummer zu sein (wenn ich das Gerät wieder anbringe, erhöht sich diese Nummer) und 2scheint eine physische Gerätenummer zu sein.

Also gibt udev die physische Nummer zurück und ich muss die logische Nummer erhalten. Dann kann ich Daten wie folgt abrufen:lsusb -D /dev/bus/usb/005/032

Also, wie kann ich logische Gerätenummer 032über physischen Pfad wie erhalten /devices/pci0000:00/0000:00:1d.0/usb5/5-2?

Dmitry Frank
quelle

Antworten:

5

Erstens müssen wir /sysdem Pfad, der von zurückgegeben wird udev, voranstellen , damit dieser Pfad so etwas wie : /sys/devices/pci0000:00/0000:00:1d.0/usb5/5-2. Gehen Sie dann in dieses Verzeichnis, und es werden mehrere Dateien darin sein. Unter anderem gibt es busnumund devnumDateien, die diese "logischen" Zahlen enthalten. Im Bash-Skript können wir sie also folgendermaßen abrufen:

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"

Beachten Sie auch , dass udevdiese zurückkehren können busnumund devnumdirekt: in RUN+="..."wir Ersetzungen verwenden können $attr{busnum}und $attr{devnum}jeweils.

Dmitry Frank
quelle
1
Ich bin verwirrt über die unterschiedlichen Verwendungen von udevvs. lsusbund sys/devices/..vs. /dev/bus/usb/..und nach Ihrer Antwort zu urteilen, scheinen Sie Bescheid zu wissen :) Vielleicht können Sie etwas Licht in diese beiden Fragen bringen? askubuntu.com/questions/342061/power-on-off-usb-ports und askubuntu.com/questions/498950/…
nach natty
@nuttyaboutnatty, leider kann ich Ihnen keinen Hinweis auf Ihr Problem geben (über das Ausschalten des Geräts). Ich lerne heutzutage nur Linux-Sachen und bin ziemlich weit von jeder Art von Guru entfernt. Sehr wenig über /sys/devices/...vs /dev/...: /syswird vom Kernel gefüllt, es ist eine Darstellung der tatsächlichen Hierarchie der Kernelgeräte. Udev ist ein User-Space-Daemon, der /sysHierarchien und Auffüllungen verwaltet /dev/...(unter Berücksichtigung von Regeln). Udev ist also vollständig für den /devInhalt verantwortlich.
Dmitry Frank
1

Die akzeptierte Antwort hat mir wirklich nicht viel geholfen. Ich habe endlich einen Weg gefunden, indem ich das idProduct und den idVendor untersucht habe, ob sie existieren. Hier ist ein Shell-Skript

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

Folgendes bekomme ich auf mein System.

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

Hier kann ich sehen, dass zum Beispiel 0a5c:21e6ein Bluetooth-Gerät zugeordnet ist 2-1.4.

Für noch mehr Komfort können Sie dies als eine Funktion in Ihrer Shell definieren, so etwas wie

$ 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
quelle