Чи можете ви порадити спосіб визначити, який драйвер використовується для 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
який перелічить вам драйвери останніх підключених пристроїв.
Плюси полягають у тому, що ці дві команди встановлюються з усіма дистрибутивами.