Дізнайтеся, які модулі пов'язані з usb-пристроєм?


35

Чи можете ви порадити спосіб визначити, який драйвер використовується для USB-пристрою. Сорт usb-еквівалента lspci -kкоманди.

Відповіді:


57

Пошук драйверів ядра

Пристрій потерпілого

$ 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є).

Спосіб 1: Використання usbutils (просто)

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
⋮

Зверніть увагу, що в цьому списку вказаний поточний драйвер, а не стандартний. Не існує способу знайти за замовчуванням.

Спосіб 2: Використання налагоджень (вимагає root)

Якщо ви встановлені налагодження, ядро ​​підтримує файл у тому ж форматі, що і usb-devicesдрукується в /sys/kernel/debug/usb/devices; Ви можете переглядати і lessт. д. Зауважте, що інтерфейси налагодження не є стабільними, тому різні версії ядра можуть друкувати в іншому форматі або повністю відсутній файл.

Ще раз це показує лише поточний драйвер, а не за замовчуванням.

Спосіб 3: Використання лише основних утиліт для прямого читання / систематизації (найкраще для сценаріїв чи відновлення)

Ви можете отримати інформацію /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)?

Якщо драйвер є 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 виводу).


Я, безумовно, втрачу в своїх колись дискусіях зі своїм другом Windows проти Linux з цим :). Дасть йому кілька днів, щоб зрозуміти, чи вискочить більш просте рішення. Дякую за зусилля.
TheMeaningfulEngineer

@Alan OK, я знайшов ще два способи, один з них досить простий. Також я уточнив, яка з двох можливих відповідей на "який драйвер?" кожен метод забезпечує.
дероберт

Я не вважаю, що Ваша претензія щодо розміщення пристрою в ньому /sys/bus/usb/devicesє правильною. У мене на шині 1 usb-devicesє пристрій, який говорить, що це пристрій 12, але в /sys/bus/usb/devices/1-11моїй системі немає.
Серін

@Cerin насправді це не так. Я вкладу кращу. Дякую.
дероберт

13

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

0

Крім того, що писав дероберт, я знаходжу себе в застосуванні

lsusb -t

Яке надрукує дерево з різною інформацією про підключені пристрої, включаючи корисну частину драйвера.

і

dmesg | grep driver

який перелічить вам драйвери останніх підключених пристроїв.

Плюси полягають у тому, що ці дві команди встановлюються з усіма дистрибутивами.


0

Можна також скористатись lshwперелічуючими пристроями на всіх шинах, включаючи USB, PCI тощо, щоб ви могли бачити, який драйвер він використовує та пов'язані з ним ідентифікатори:

sudo lshw
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.