Usb

bInterfaceProtocol 的值是固定的還是由核心決定的?

  • May 13, 2019

比方說:

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

我不明白並提出兩個可能的問題:

  1. 如果值bInterfaceProtocol總是None獨立於主機,那麼這個未使用的介面存在的意義何在?
  2. 如果值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-kbdsudo cat /dev/input/by-id/usb-CHESEN_USB_Keyboard-event-if01同時按下不同的鍵進行了測試,最終我注意到只有if01當我按下多媒體鍵打開藍牙設置和調節音量時才會得到輸出。

引用自:https://unix.stackexchange.com/questions/343830