たとえば、
$ 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つの質問があります。
- 値が
bInterfaceProtocol
常にNone
ホストから独立している場合、この未使用のインターフェイスのポイントは何ですか? - 値が
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設定を開き、音量を調整したときにのみ出力が出ることを確認しました。 。