Usb
bInterfaceProtocol 的值是固定的還是由核心決定的?
比方說:
$ 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
它是None
用於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 的條件是什麼?
核心不決定
bInterfaceProtocol
. 該值是從連接的 USB 設備接收的。HID 設備支持多種協議。介面描述符的 bInterfaceProtocol 成員只有在 bInterfaceSubClass 成員聲明設備支持啟動介面時才有意義,否則為 0。
有關詳細資訊,請查看HID 1.11 的 USB 設備類定義。
除了@desowin answer之外,我想補充一點,具有多個介面的設備意味著它是一個複合設備,如通用串列匯流排 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
當我按下多媒體鍵打開藍牙設置和調節音量時才會得到輸出。