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

bInterfaceProtocol上記のインターフェイス1(event22)は、次の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)
$ 

理解できません。 2つの質問があります。

  1. 値がbInterfaceProtocol常にNoneホストから独立している場合、この未使用のインターフェイスのポイントは何ですか?
  2. 値がbInterfaceProtocolカーネルによって決定される場合、カーネルが値をNoneに設定する条件は何ですか?

答え1

カーネルは決定しませんbInterfaceProtocol。この値は接続されたUSBデバイスから受信されます。

HID デバイスは複数のプロトコルをサポートします。インタフェース記述子の bInterfaceProtocol メンバは、bInterfaceSubClass メンバがデバイスが起動インタフェースをサポートすると宣言する場合にのみ意味があり、そうでない場合は 0 です。

確認するHID 1.11用のUSBデバイスクラスの定義より多くの情報を知りたいです。

答え2

とは別に@desowinの答え、複数のインタフェースを持つデバイスは、明示されたとおり複合デバイスであることを意味すると付け加えたいと思います。汎用シリアルバス2.0について:

同時に、デバイスには複数のインターフェイスがある可能性があるため、複数のインターフェイス記述子を持つことができます。異なる機能を実行する複数のインタフェースを持つUSBデバイスを複合デバイスと呼びます。 USBオーディオヘッドセットが一例です。ヘッドセットには2つのコネクタを備えたUSBデバイスがあります。コネクタの1つはヘッドセットのオーディオ用で、もう一方のコネクタは音量調整用のコントロールです。複数のインターフェイスを同時に有効にできます。

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マルチメディアキーを押してBluetooth設定を開き、音量を調整したときにのみ出力が出ることを確認しました。 。

関連情報