Cari tahu modul mana yang dikaitkan dengan perangkat usb?

35

Bisakah Anda merekomendasikan cara untuk mencari tahu driver mana yang sedang digunakan untuk perangkat USB. Semacam setara dengan lspci -kperintah usb .

TheMeaningfulEngineer
sumber

Jawaban:

57

Menemukan Driver Kernel

Perangkat korban

$ 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

Kami akan mencoba mencari tahu driver apa yang digunakan untuk APC UPS. Perhatikan bahwa ada dua jawaban untuk pertanyaan ini: Driver yang akan digunakan kernel, dan driver yang saat ini digunakan. Userspace dapat menginstruksikan kernel untuk menggunakan driver yang berbeda (dan dalam kasus UPS APC saya, nutmiliki).

Metode 1: Menggunakan usbutils (mudah)

The usbutilspaket (pada Debian, setidaknya) termasuk script yang disebut usb-devices. Jika Anda menjalankannya, output informasi tentang perangkat pada sistem, termasuk driver yang digunakan:

$ 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
⋮

Perhatikan bahwa ini mencantumkan driver saat ini, bukan yang default. Tidak ada cara untuk menemukan yang default.

Metode 2: Menggunakan debugfs (membutuhkan root)

Jika Anda telah menginstal debugfs, kernel menyimpan file dalam format yang sama dengan usb-devicesprint out di /sys/kernel/debug/usb/devices; Anda dapat melihat less, dll. Perhatikan bahwa antarmuka debugfs tidak stabil, sehingga versi kernel yang berbeda dapat mencetak dalam format yang berbeda, atau kehilangan file seluruhnya.

Sekali lagi, ini hanya menunjukkan driver saat ini, bukan default.

Metode 3: Hanya menggunakan utilitas dasar untuk membaca / sistem secara langsung (terbaik untuk skrip atau pemulihan)

Anda dapat memperoleh informasi dari /sys, pikir itu lebih menyakitkan daripada lspci. /sysAntarmuka ini harusnya cukup stabil, jadi jika Anda menulis skrip shell, ini mungkin yang ingin Anda lakukan.

Awalnya, lsusbtampaknya menghitung perangkat dari 1, /sysdari 0. Jadi 10-2 adalah perkiraan yang baik untuk menemukan di mana APS UPS lsusb berikan sebagai bus 10, perangkat 3. Sayangnya, seiring waktu pemetaan itu rusak — sysfs menggunakan kembali angka-angka bahkan ketika nomor perangkat tidak. Isi devnumfile akan cocok dengan nomor perangkat yang diberikan oleh lsusb, sehingga Anda dapat melakukan sesuatu seperti ini:

$ 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

Jadi, dalam hal ini, sudah pasti 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

Kami dapat memastikan ini adalah perangkat yang tepat dengan catmemasukkan beberapa file:

$ cat idVendor idProduct manufacturer product 
051d
0002
American Power Conversion
Back-UPS RS 1500 FW:8.g9 .D USB FW:g9 

Jika Anda melihat 10-2: 1.0 ( :1adalah "konfigurasi", .0antarmuka — satu perangkat USB dapat melakukan banyak hal, dan memiliki beberapa driver; lsusb -vakan menunjukkan ini), ada file modalias dan symlink driver:

$ cat 10-2\:1.0/modalias 
usb:v051Dp0002d0106dc00dsc00dp00ic03isc00ip00in00
$ readlink driver
../../../../../../bus/usb/drivers/usbfs

Jadi, driver saat ini usbfs. Anda dapat menemukan driver default dengan bertanya modinfotentang 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)

Jadi, UPS APC default ke hiddriver, yang memang benar. Dan saat ini menggunakan usbfs, yang benar karena nut's usbhid-upsadalah pemantauan itu.

Bagaimana dengan driver userspace (usbfs)?

Ketika driver usbfs, itu pada dasarnya berarti program userspace (non-kernel) berfungsi sebagai driver. Menemukan program mana yang membutuhkan root (kecuali program tersebut berjalan sebagai pengguna Anda) dan cukup mudah: program mana saja yang membuka file perangkat.

Kita tahu bahwa perangkat "korban" kami adalah bus 10, perangkat 3. Jadi file perangkat itu /dev/bus/usb/010/003(setidaknya pada Debian modern), dan lsofmemberikan jawabannya:

# 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

Dan memang, itu usbhid-upsseperti yang diharapkan (lsof memotong nama perintah untuk membuat tata letak cocok, jika Anda memerlukan nama lengkap, Anda dapat menggunakan ps 4951untuk mendapatkannya, atau mungkin beberapa opsi format output lsof).

derobert
sumber
Saya pasti akan longgar dalam debat saya dengan teman saya Windows vs Linux dengan yang satu ini :). Akan memberikannya beberapa hari untuk melihat apakah solusi yang lebih sederhana muncul. Terima kasih atas usahanya.
TheMeaningfulEngineer
@Lan OK, saya menemukan dua cara lagi, salah satunya cukup sederhana. Juga, saya telah mengklarifikasi jawaban manakah dari dua kemungkinan jawaban untuk "pengemudi yang mana?" setiap metode menyediakan.
derobert
Menurut saya klaim Anda tentang menemukan perangkat /sys/bus/usb/devicesitu benar. Saya memiliki perangkat di bus 1 yang usb-devicesmengatakan perangkat 12, tetapi tidak ada /sys/bus/usb/devices/1-11di sistem saya.
Cerin
@Cerin memang tidak. Saya akan memasukkan yang lebih baik. Terima kasih.
derobert
13

lsusbitu sendiri bisa memberi Anda hasil yang baik. Untuk output ringkas yang saya gunakan lsusb -t, di mana -tmenunjukkan perangkat sebagai pohon; format ini melaporkan driver juga.

Contoh output:

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

Jika tidak ada driver yang digunakan, baris akan terlihat seperti ini (perangkat dalam contoh saya adalah kamera yang saya hapus driver dari kernel):

    |__ Port 6: Dev 4, If 1, Class=Video, Driver=, 480M
nert
sumber
0

Selain apa yang ditulis derobert, saya menemukan diri saya menggunakan

lsusb -t

Yang akan mencetak pohon dengan berbagai info tentang perangkat yang terhubung termasuk bagian «Driver» yang bermanfaat.

dan

dmesg | grep driver

yang akan mencantumkan Anda driver perangkat terhubung terbaru.

Kelebihannya adalah bahwa kedua perintah ini dipasang dengan semua distribusi.

FuzzyTern
sumber
0

Satu juga dapat menggunakan lshwyang akan menyebutkan perangkat di semua bus termasuk USB, PCI, dll sehingga Anda dapat melihat driver yang digunakan dan ID terkait:

sudo lshw
Pierz
sumber