Tìm hiểu các mô-đun được liên kết với một thiết bị usb?


35

Bạn có thể giới thiệu một cách để tìm ra trình điều khiển nào đang được sử dụng cho thiết bị USB. Sắp xếp một usb tương đương với lspci -klệnh.

Câu trả lời:


57

Tìm (các) Trình điều khiển hạt nhân

Thiết bị nạn nhân

$ 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

Chúng tôi sẽ cố gắng tìm hiểu trình điều khiển nào được sử dụng cho APC UPS. Lưu ý rằng có hai câu trả lời cho câu hỏi này: Trình điều khiển mà kernel sẽ sử dụng và trình điều khiển hiện đang sử dụng. Không gian người dùng có thể hướng dẫn kernel sử dụng trình điều khiển khác (và trong trường hợp APC UPS của tôi, nutcó).

Cách 1: Sử dụng usbutils (dễ dàng)

Các usbutilsgói (trên Debian, ít nhất) bao gồm tập lệnh gọi usb-devices. Nếu bạn chạy nó, nó sẽ xuất thông tin về các thiết bị trên hệ thống, bao gồm trình điều khiển nào được sử dụng:

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

Lưu ý rằng điều này liệt kê trình điều khiển hiện tại, không phải trình điều khiển mặc định. Không có cách nào để tìm cái mặc định.

Phương pháp 2: Sử dụng debugfs (yêu cầu root)

Nếu bạn đã gỡ lỗi được gắn, kernel sẽ duy trì một tệp có cùng định dạng như usb-devicesin ra tại /sys/kernel/debug/usb/devices; bạn có thể xem với less, v.v ... Lưu ý rằng giao diện gỡ lỗi không ổn định, do đó các phiên bản kernel khác nhau có thể in ở định dạng khác hoặc thiếu tệp hoàn toàn.

Một lần nữa, điều này chỉ hiển thị trình điều khiển hiện tại, không phải mặc định.

Phương pháp 3: Chỉ sử dụng các tiện ích cơ bản để đọc / sys trực tiếp (tốt nhất để tạo kịch bản hoặc khôi phục)

Bạn có thể lấy thông tin ra /sys, nghĩ rằng nó đau đớn hơn lspci. Các /sysgiao diện này phải ổn định một cách hợp lý, vì vậy nếu bạn đang viết một kịch bản shell, đây có thể là cách bạn muốn thực hiện.

Ban đầu, lsusbdường như đếm các thiết bị từ 1, /systừ 0. Vì vậy, 10-2 là một dự đoán tốt về nơi tìm thấy APC UPS lsusb đưa ra như bus 10, thiết bị 3. Thật không may, theo thời gian, ánh xạ phá vỡ các sysfs sử dụng lại các số ngay cả khi số thiết bị không. Các devnumnội dung của tập tin sẽ phù hợp với số lượng thiết bị nhất định bởi lsusb, vì vậy bạn có thể làm một cái gì đó như thế này:

$ 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

Vì vậy, trong trường hợp này, nó chắc chắn 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

Chúng tôi có thể chắc chắn đây là thiết bị phù hợp bằng cách nhập catmột vài tệp:

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

Nếu bạn xem trong 10-2: 1.0 ( :1là "cấu hình", .0giao diện, một thiết bị USB duy nhất có thể làm nhiều việc và có nhiều trình điều khiển; lsusb -vsẽ hiển thị những điều này), có một tệp modalias và liên kết trình điều khiển:

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

Vì vậy, trình điều khiển hiện tại là usbfs. Bạn có thể tìm trình điều khiển mặc định bằng cách hỏi modinfovề phương thức:

$ /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)

Vì vậy, APC UPS mặc định cho người hidlái xe, điều này thực sự chính xác. Và hiện tại nó đang sử dụng usbfs, điều này đúng vì nuthọ usbhid-upsđang theo dõi nó.

Trình điều khiển không gian người dùng (usbfs) thì sao?

Khi trình điều khiển là usbfs, về cơ bản có nghĩa là một chương trình không gian người dùng (không phải kernel) đang hoạt động như trình điều khiển. Tìm chương trình nào là yêu cầu root (trừ khi chương trình đang chạy với tư cách là người dùng của bạn) và khá dễ dàng: chương trình nào có tệp thiết bị mở.

Chúng tôi biết rằng thiết bị "nạn nhân" của chúng tôi là bus 10, thiết bị 3. Vì vậy, tệp thiết bị là /dev/bus/usb/010/003(ít nhất là trên Debian hiện đại) và lsofcung cấp câu trả lời:

# 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

Và thực tế, usbhid-upsnhư mong đợi (lsof đã cắt bớt tên lệnh để làm cho bố cục phù hợp, nếu bạn cần tên đầy đủ, bạn có thể sử dụng ps 4951để lấy nó, hoặc có thể một số tùy chọn định dạng đầu ra lsof).


Tôi chắc chắn sẽ lạc lõng trong cuộc tranh luận chưa từng có của mình với người bạn Windows vs Linux với người này :). Sẽ cho nó một vài ngày để xem nếu một giải pháp đơn giản hơn xuất hiện. Cảm ơn cho những nỗ lực.
TheMeaningfulEngineer

@Alan OK, tôi đã tìm thấy hai cách nữa, một trong số đó khá đơn giản. Ngoài ra, tôi đã làm rõ câu trả lời nào trong hai câu trả lời có thể cho "trình điều khiển nào?" mỗi phương pháp cung cấp.
derobert

Tôi không nghĩ yêu cầu của bạn về việc định vị thiết bị /sys/bus/usb/deviceslà chính xác. Tôi có một thiết bị trên bus 1 có nghĩa usb-deviceslà thiết bị 12, nhưng không có /sys/bus/usb/devices/1-11trên hệ thống của tôi.
Cerin

@Cerin thực sự không phải vậy. Tôi sẽ đưa vào một cái tốt hơn. Cảm ơn bạn.
derobert

13

lsusbchính nó có thể giúp bạn có kết quả tốt. Đối với đầu ra nhỏ gọn tôi sử dụng lsusb -t, trong đó -thiển thị các thiết bị dưới dạng cây; định dạng này báo cáo trình điều khiển là tốt.

Ví dụ đầu ra:

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

Nếu không có trình điều khiển nào được sử dụng, dòng sẽ trông như thế này (thiết bị trong ví dụ của tôi là máy ảnh mà tôi đã gỡ bỏ trình điều khiển khỏi kernel):

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

0

Ngoài những gì derobert viết, tôi thấy mình đang sử dụng

lsusb -t

Sẽ in một cây với thông tin khác nhau về các thiết bị được kết nối, bao gồm cả phần «Trình điều khiển» hữu ích.

dmesg | grep driver

trong đó sẽ liệt kê cho bạn các trình điều khiển của các thiết bị cắm mới nhất.

Ưu điểm là hai lệnh này được cài đặt với tất cả các bản phân phối.


0

Người ta cũng có thể sử dụng lshwsẽ liệt kê các thiết bị trên tất cả các xe buýt bao gồm USB, PCI, v.v. để bạn có thể xem trình điều khiển nào nó sử dụng và ID liên quan của nó:

sudo lshw
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.