Dowiedz się, które moduły są powiązane z urządzeniem USB?

35

Czy możesz polecić sposób, aby dowiedzieć się, który sterownik jest używany dla urządzenia USB. Coś w rodzaju odpowiednika lspci -kpolecenia USB .

TheMeaningfulEngineer
źródło

Odpowiedzi:

57

Znajdowanie sterowników jądra

Urządzenie ofiary

$ lsusb 
Bus 010 Device 002: ID 046d:c01e Logitech, Inc. MX518 Optical Mouse
Bus 010 Device 003: ID 051d:0002 American Power Conversion Uninterruptible Power Supply

Spróbujemy dowiedzieć się, jakiego sterownika używa UPS APC. Zauważ, że istnieją dwie odpowiedzi na to pytanie: Sterownik, którego jądro użyłoby, i sterownik, który jest obecnie używany. Przestrzeń użytkownika może poinstruować jądro, aby używało innego sterownika (aw przypadku mojego UPS APC nutma).

Metoda 1: Korzystanie z usbutils (łatwe)

usbutilsPakiet (na Debianie, przynajmniej) zawiera skrypt o nazwie usb-devices. Po uruchomieniu wyświetla informacje o urządzeniach w systemie, w tym o używanym sterowniku:

$ usb-devices
⋮
T:  Bus=10 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#=  3 Spd=1.5 MxCh= 0
D:  Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1
P:  Vendor=051d ProdID=0002 Rev=01.06
S:  Manufacturer=American Power Conversion
S:  Product=Back-UPS RS 1500 FW:8.g9 .D USB FW:g9 
S:  SerialNumber=XXXXXXXXXXXX  
C:  #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=24mA
I:  If#= 0 Alt= 0 #EPs= 1 Cls=03(HID  ) Sub=00 Prot=00 Driver=usbfs
⋮

Zauważ, że zawiera listę bieżącego sterownika, a nie domyślnego. Nie ma sposobu na znalezienie domyślnego.

Metoda 2: Używanie debugfs (wymaga roota)

Jeśli masz zainstalowane debugfs, jądro utrzymuje plik w tym samym formacie, w jakim usb-deviceswypisuje się w /sys/kernel/debug/usb/devices; możesz przeglądać za pomocą less, itp. Zauważ, że interfejsy debugfs nie są stabilne, więc różne wersje jądra mogą drukować w innym formacie lub całkowicie nie mieć pliku.

Ponownie pokazuje to tylko aktualny sterownik, a nie domyślny.

Metoda 3: Używanie tylko podstawowych narzędzi do bezpośredniego odczytu / sys (najlepsze do tworzenia skryptów lub odzyskiwania)

Możesz wydobyć informacje z tego /sys, pomyślał, że jest to bardziej bolesne niż lspci. /sysInterfejsy te powinny być dość stabilne, więc jeśli piszesz skrypt powłoki, prawdopodobnie tak właśnie chcesz to zrobić.

Początkowo lsusbwydaje się , że zlicza urządzenia od 1, /sysod 0. Więc 10-2 jest dobrym przypuszczeniem, gdzie znaleźć UPS APC lsusb podaje jako magistralę 10, urządzenie 3. Niestety, z czasem mapowanie się psuje - sysfs ponownie wykorzystuje liczby nawet gdy numery urządzeń nie są. Zawartość devnumpliku będzie zgodna z numerem urządzenia podanym przez lsusb, więc możesz zrobić coś takiego:

$ grep -l '^3$' /sys/bus/usb/devices/10-*/devnum     # the ^ and $ to prevent also matching 13, 31, etc.
/sys/bus/usb/devices/10-2/devnum

Tak więc w tym przypadku jest zdecydowanie 10-2.

$ cd /sys/bus/usb/devices/10-2
$ ls
10-2:1.0             bDeviceClass     bMaxPower           descriptors  ep_00         maxchild   remove     urbnum
authorized           bDeviceProtocol  bNumConfigurations  dev          idProduct     power      serial     version
avoid_reset_quirk    bDeviceSubClass  bNumInterfaces      devnum       idVendor      product    speed
bcdDevice            bmAttributes     busnum              devpath      ltm_capable   quirks     subsystem
bConfigurationValue  bMaxPacketSize0  configuration       driver       manufacturer  removable  uevent

Możemy być pewni, że to właściwe urządzenie, catpobierając kilka plików:

$ cat idVendor idProduct manufacturer product 
051d
0002
American Power Conversion
Back-UPS RS 1500 FW:8.g9 .D USB FW:g9 

Jeśli spojrzysz na 10-2: 1.0 ( :1jest to „konfiguracja”, .0interfejs - pojedyncze urządzenie USB może robić wiele rzeczy i mieć wiele sterowników; lsusb -vpokaże je), jest plik modalias i dowiązanie symboliczne sterownika:

$ cat 10-2\:1.0/modalias 
usb:v051Dp0002d0106dc00dsc00dp00ic03isc00ip00in00
$ readlink driver
../../../../../../bus/usb/drivers/usbfs

Tak więc obecny sterownik to usbfs. Możesz znaleźć domyślny sterownik, pytając modinfoo modyfikacje:

$ /sbin/modinfo `cat 10-2\:1.0/modalias`
filename:       /lib/modules/3.6-trunk-amd64/kernel/drivers/hid/usbhid/usbhid.ko
license:        GPL
description:    USB HID core driver
author:         Jiri Kosina
author:         Vojtech Pavlik
author:         Andreas Gal
alias:          usb:v*p*d*dc*dsc*dp*ic03isc*ip*in*
depends:        hid,usbcore
intree:         Y
vermagic:       3.6-trunk-amd64 SMP mod_unload modversions 
parm:           mousepoll:Polling interval of mice (uint)
parm:           ignoreled:Autosuspend with active leds (uint)
parm:           quirks:Add/modify USB HID quirks by specifying  quirks=vendorID:productID:quirks where vendorID, productID, and quirks are all in 0x-prefixed hex (array of charp)

Tak więc UPS APC domyślnie przyjmuje hidsterownik, co jest rzeczywiście poprawne. I jego Aktualnie używasz usbfs, co jest poprawne, ponieważ nut„s usbhid-upsjest monitorowanie go.

Co ze sterownikami przestrzeni użytkownika (usbfs)?

Gdy sterownik jest usbfs, oznacza to zasadniczo, że program przestrzeni użytkownika (innej niż jądro) działa jako sterownik. Znalezienie programu to root (chyba że program działa jako użytkownik) i jest dość łatwe: w zależności od tego, który program ma otwarty plik urządzenia.

Wiemy, że naszym „ofiarą” jest magistrala 10, urządzenie 3. Tak więc plik urządzenia znajduje się /dev/bus/usb/010/003(przynajmniej w nowoczesnym Debianie) i lsofzawiera odpowiedź:

# lsof /dev/bus/usb/010/003 
COMMAND    PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
usbhid-up 4951  nut    4u   CHR 189,1154      0t0 8332 /dev/bus/usb/010/003

I rzeczywiście jest to usbhid-upszgodne z oczekiwaniami (lsof obciął nazwę polecenia, aby dopasować układ, jeśli potrzebujesz pełnej nazwy, możesz użyć, ps 4951aby ją uzyskać, lub prawdopodobnie kilka opcji formatowania wyjścia lsof).

derobert
źródło
Zdecydowanie przegram debatę z moim przyjacielem Windows kontra Linux z tym :). Daje kilka dni na sprawdzenie, czy pojawi się prostsze rozwiązanie. Dzięki za wysiłek.
TheMeaningfulEngineer
@Alan OK, znalazłem jeszcze dwa sposoby, jeden z nich jest dość prosty. Wyjaśniłem również, która z dwóch możliwych odpowiedzi na „który sterownik?” każda metoda zapewnia.
derobert
Nie sądzę, aby twoje twierdzenie o lokalizacji urządzenia /sys/bus/usb/devicesbyło prawidłowe. Mam urządzenie na magistrali 1, które usb-devicesmówi , że to urządzenie 12, ale nie ma go /sys/bus/usb/devices/1-11w moim systemie.
Cerin,
@Cerin rzeczywiście tak nie jest. Włożę lepszy. Dziękuję Ci.
derobert 16.04.15
13

lsusbsam może przynieść ci dobre wyniki. Do kompaktowego wyjścia używam lsusb -t, gdzie -tpokazuje urządzenia jako drzewo; ten format zgłasza również sterownik.

Przykładowe dane wyjściowe:

 $ lsusb -t
/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 5000M
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 480M
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/3p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/8p, 480M
...

Jeśli nie zostanie użyty żaden sterownik, linia będzie wyglądać tak (urządzenie w moim przykładzie to kamera, dla której usunąłem sterownik z jądra):

    |__ Port 6: Dev 4, If 1, Class=Video, Driver=, 480M
nert
źródło
0

Oprócz tego, co napisał derobert, używam

lsusb -t

Które wydrukuje drzewo z różnymi informacjami o podłączonych urządzeniach, w tym pomocną częścią «Sterownik».

i

dmesg | grep driver

który wyświetli listę sterowników najnowszych podłączonych urządzeń.

Zaletą jest to, że te dwa polecenia są instalowane ze wszystkimi dystrybucjami.

FuzzyTern
źródło
0

Można również użyć, lshwktóry wyliczy urządzenia we wszystkich magistralach, w tym USB, PCI itp., Abyś mógł zobaczyć, którego sterownika używa i powiązanych z nim identyfikatorów:

sudo lshw
Pierz
źródło