Czy możesz polecić sposób, aby dowiedzieć się, który sterownik jest używany dla urządzenia USB. Coś w rodzaju odpowiednika lspci -k
polecenia USB .
źródło
Czy możesz polecić sposób, aby dowiedzieć się, który sterownik jest używany dla urządzenia USB. Coś w rodzaju odpowiednika lspci -k
polecenia USB .
$ 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 nut
ma).
usbutils
Pakiet (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.
Jeśli masz zainstalowane debugfs, jądro utrzymuje plik w tym samym formacie, w jakim usb-devices
wypisuje 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.
Możesz wydobyć informacje z tego /sys
, pomyślał, że jest to bardziej bolesne niż lspci
. /sys
Interfejsy te powinny być dość stabilne, więc jeśli piszesz skrypt powłoki, prawdopodobnie tak właśnie chcesz to zrobić.
Początkowo lsusb
wydaje się , że zlicza urządzenia od 1, /sys
od 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ść devnum
pliku 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, cat
pobierają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 ( :1
jest to „konfiguracja”, .0
interfejs - pojedyncze urządzenie USB może robić wiele rzeczy i mieć wiele sterowników; lsusb -v
pokaż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 modinfo
o 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 hid
sterownik, co jest rzeczywiście poprawne. I jego Aktualnie używasz usbfs, co jest poprawne, ponieważ nut
„s usbhid-ups
jest monitorowanie go.
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 lsof
zawiera 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-ups
zgodne z oczekiwaniami (lsof obciął nazwę polecenia, aby dopasować układ, jeśli potrzebujesz pełnej nazwy, możesz użyć, ps 4951
aby ją uzyskać, lub prawdopodobnie kilka opcji formatowania wyjścia lsof).
/sys/bus/usb/devices
było prawidłowe. Mam urządzenie na magistrali 1, któreusb-devices
mówi , że to urządzenie 12, ale nie ma go/sys/bus/usb/devices/1-11
w moim systemie.lsusb
sam może przynieść ci dobre wyniki. Do kompaktowego wyjścia używamlsusb -t
, gdzie-t
pokazuje urządzenia jako drzewo; ten format zgłasza również sterownik.Przykładowe dane wyjściowe:
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):
źródło
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.
źródło
Można również użyć,
lshw
któ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:źródło