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 .
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 .
Odpowiedzi:
$ 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óre usb-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żywam lsusb -t
, gdzie -t
pokazuje 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
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.