比方说:
$ ls -l /dev/input/by-id
lrwxrwxrwx 1 root root 10 Feb 10 03:47 usb-Logitech_USB_Keyboard-event-if01 -> ../event22
lrwxrwxrwx 1 root root 10 Feb 10 03:47 usb-Logitech_USB_Keyboard-event-kbd -> ../event21
$ ls -l /dev/input/by-path/
lrwxrwxrwx 1 root root 10 Feb 10 03:47 pci-0000:00:14.0-usb-0:1.1:1.0-event-kbd -> ../event21
lrwxrwxrwx 1 root root 10 Feb 10 03:47 pci-0000:00:14.0-usb-0:1.1:1.1-event -> ../event22
我知道上面的接口 1 (event22) 不起作用,因为bInterfaceProtocol
is None
for bInterfaceNumber 1
:
$ sudo lsusb -v -d 046d:c31c
Bus 002 Device 005: ID 046d:c31c Logitech, Inc. Keyboard K120
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.10
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 8
idVendor 0x046d Logitech, Inc.
idProduct 0xc31c Keyboard K120
bcdDevice 64.00
iManufacturer 1 Logitech
iProduct 2 USB Keyboard
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 59
bNumInterfaces 2
bConfigurationValue 1
iConfiguration 3 U64.00_B0001
bmAttributes 0xa0
(Bus Powered)
Remote Wakeup
MaxPower 90mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 3 Human Interface Device
bInterfaceSubClass 1 Boot Interface Subclass
bInterfaceProtocol 1 Keyboard
iInterface 2 USB Keyboard
HID Device Descriptor:
bLength 9
bDescriptorType 33
bcdHID 1.10
bCountryCode 0 Not supported
bNumDescriptors 1
bDescriptorType 34 Report
wDescriptorLength 65
Report Descriptors:
** UNAVAILABLE **
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0008 1x 8 bytes
bInterval 10
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 3 Human Interface Device
bInterfaceSubClass 0 No Subclass
bInterfaceProtocol 0 None
iInterface 2 USB Keyboard
HID Device Descriptor:
bLength 9
bDescriptorType 33
bcdHID 1.10
bCountryCode 0 Not supported
bNumDescriptors 1
bDescriptorType 34 Report
wDescriptorLength 159
Report Descriptors:
** UNAVAILABLE **
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0004 1x 4 bytes
bInterval 255
Device Status: 0x0000
(Bus Powered)
$
我不明白并提出两个可能的问题:
- 如果值
bInterfaceProtocol
始终None
独立于主机,那么这个未使用的接口存在的意义何在? - 如果 的值
bInterfaceProtocol
由内核决定,那么内核将其设置为 None 的条件是什么?
答案1
内核不决定bInterfaceProtocol
。该值是从连接的 USB 设备接收的。
HID 设备支持多种协议。仅当 bInterfaceSubClass 成员声明设备支持启动接口时,接口描述符的 bInterfaceProtocol 成员才有意义,否则为 0。
查看HID 1.11 的 USB 设备类定义了解更多信息。
答案2
除了@desowin 答案,我想补充一点,具有多个接口的设备意味着它是一个复合设备,如所述通用串行总线 2.0 简介:
同时,一个设备可以有多个接口,从而有多个接口描述符。具有多个执行不同功能的接口的 USB 设备称为复合设备。 USB 音频耳机就是一个例子。在耳机中,您有一个带有两个接口的 USB 设备。一个接口用于耳机的音频侧,另一个接口可能是调节音量的控件。多个接口可以同时处于活动状态。
为了弄清楚这个None
设备接口的功能是什么,我用sudo cat /dev/input/by-id/usb-CHESEN_USB_Keyboard-event-kbd
和sudo cat /dev/input/by-id/usb-CHESEN_USB_Keyboard-event-if01
同时按下不同的键进行了测试,最终我注意到只有if01
当我按多媒体键打开蓝牙设置和调节音量时才会得到输出。