bInterfaceProtocol 的值是固定的还是由内核决定?

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) 不起作用,因为bInterfaceProtocolis Nonefor 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 的条件是什么?

答案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-kbdsudo cat /dev/input/by-id/usb-CHESEN_USB_Keyboard-event-if01同时按下不同的键进行了测试,最终我注意到只有if01当我按多媒体键打开蓝牙设置和调节音量时才会得到输出。

相关内容