Чи можете ви порадити спосіб визначити, який драйвер використовується для USB-пристрою. Сорт usb-еквівалента lspci -k
команди.
Чи можете ви порадити спосіб визначити, який драйвер використовується для USB-пристрою. Сорт usb-еквівалента lspci -k
команди.
Відповіді:
$ 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
Ми спробуємо з'ясувати, який драйвер використовується для ДБЖ APC. Зауважте, що на це питання є дві відповіді: драйвер, який би використовувало ядро, і драйвер, який зараз використовується. Користувацький простір може доручити ядру використовувати інший драйвер (і у випадку з моїм АПК APC nut
є).
usbutils
Пакет (на Debian, по крайней мере) включає в себе скрипт usb-devices
. Якщо ви запускаєте його, він виводить інформацію про пристрої в системі, включаючи, який драйвер використовується:
$ 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
⋮
Зверніть увагу, що в цьому списку вказаний поточний драйвер, а не стандартний. Не існує способу знайти за замовчуванням.
Якщо ви встановлені налагодження, ядро підтримує файл у тому ж форматі, що і usb-devices
друкується в /sys/kernel/debug/usb/devices
; Ви можете переглядати і less
т. д. Зауважте, що інтерфейси налагодження не є стабільними, тому різні версії ядра можуть друкувати в іншому форматі або повністю відсутній файл.
Ще раз це показує лише поточний драйвер, а не за замовчуванням.
Ви можете отримати інформацію /sys
, вважаючи її більш болючою, ніж lspci
. Ці /sys
інтерфейси повинні бути досить стійкими, тому, якщо ви пишете сценарій оболонки, це, мабуть, ви хочете це зробити.
Спочатку, lsusb
здається, підраховують пристрої від 1, /sys
від 0. Тож 10-2 - це гарна здогадка про те, де знайти APC UPS lsusb дає як шину 10, пристрій 3. На жаль, з часом карти відображаються в руслі - sysfs повторно використовує номери навіть коли номери пристроїв відсутні. Вміст devnum
файлу буде відповідати номеру пристрою, заданому lsusb, тому ви можете зробити щось подібне:
$ 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
Тож у цьому випадку це точно 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
Ми можемо бути впевнені, що це правильний пристрій, cat
надіславши кілька файлів:
$ cat idVendor idProduct manufacturer product
051d
0002
American Power Conversion
Back-UPS RS 1500 FW:8.g9 .D USB FW:g9
Якщо ви подивитеся на 10-2: 1.0 ( :1
це "конфігурація", .0
інтерфейс - один USB-пристрій може робити кілька речей і має декілька драйверів; lsusb -v
покаже це), є файл modalias та символьне посилання драйвера:
$ cat 10-2\:1.0/modalias
usb:v051Dp0002d0106dc00dsc00dp00ic03isc00ip00in00
$ readlink driver
../../../../../../bus/usb/drivers/usbfs
Отже, поточний драйвер є usbfs
. Ви можете знайти драйвер за замовчуванням, запитавши modinfo
про modalias:
$ /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)
Отже, ДБЖ APC за замовчуванням для hid
драйвера, що дійсно правильно. І його в даний час використовується usbfs, що правильно, оскільки nut
's usbhid-ups
контролює його.
Якщо драйвер є usbfs
, він, по суті, означає, що програма драйвера (не ядро) функціонує як драйвер. Дізнатися, яку програму вона потребує root (якщо програма не працює як ваш користувач), і досить просто: залежно від того, яка програма має відкритий файл пристрою.
Ми знаємо, що нашим пристроєм "жертви" є шина 10, пристрій 3. Отже, файл пристрою є /dev/bus/usb/010/003
(принаймні, на сучасному Debian) і lsof
надає відповідь:
# 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
І дійсно, його usbhid-ups
як очікувалося (lsof урізав ім'я команди, щоб зробити макет підходящим, якщо вам потрібне повне ім'я, ви можете використовувати його ps 4951
для отримання, або, можливо, деякі параметри форматування lsof виводу).
/sys/bus/usb/devices
є правильною. У мене на шині 1 usb-devices
є пристрій, який говорить, що це пристрій 12, але в /sys/bus/usb/devices/1-11
моїй системі немає.
lsusb
сама по собі може отримати хороші результати. Для компактного виходу я використовую lsusb -t
, де -t
показані пристрої як дерево; цей формат також повідомляє про драйвер.
Приклад виводу:
$ 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
...
Якщо драйвер не використовується, рядок буде виглядати приблизно так (приклад у моєму прикладі - це камера, для якої я видалив драйвер з ядра):
|__ Port 6: Dev 4, If 1, Class=Video, Driver=, 480M
Крім того, що писав дероберт, я знаходжу себе в застосуванні
lsusb -t
Яке надрукує дерево з різною інформацією про підключені пристрої, включаючи корисну частину драйвера.
і
dmesg | grep driver
який перелічить вам драйвери останніх підключених пристроїв.
Плюси полягають у тому, що ці дві команди встановлюються з усіма дистрибутивами.