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

이해가 되지 않습니다. 두 가지 질문이 있습니다.

  1. 값이 bInterfaceProtocol항상 None호스트와 독립적이라면 이 사용되지 않는 인터페이스의 요점은 무엇입니까?
  2. 값이 bInterfaceProtocol커널에 의해 결정되는 경우 커널이 값을 None으로 설정하는 조건은 무엇입니까?

답변1

커널은 결정하지 않습니다 bInterfaceProtocol. 이 값은 연결된 USB 장치에서 수신됩니다.

HID 장치는 여러 프로토콜을 지원합니다. 인터페이스 설명자의 bInterfaceProtocol 멤버는 bInterfaceSubClass 멤버가 장치가 부팅 인터페이스를 지원한다고 선언하는 경우에만 의미가 있고, 그렇지 않으면 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멀티미디어 키를 눌러 Bluetooth 설정을 열고 볼륨을 조절할 때만 출력이 나오는 것을 확인했습니다. .

관련 정보