ã¯ããã«
æ®æ®µã¯å種éçºç¨éã§LinuxãWindowsãmacOSãå©ç¨ãã¦ããããããã¯USBåæ¿å¨ã§åä¸ã®ãã¼ãã¼ãããã©ãã¯ãã¼ã«ã«æ¥ç¶ããã¦ããããã®ããæ©å¨åæ¿ãç°¡åã«ã§ããªãBluetoothæ¥ç¶ã®ãã¼ãã¼ãããã¦ã¹ãå°å ¥ãããã¨ãã§ããªãã£ãããããªããæ¥ã以ä¸ã®è¨äºãèªãã§ moguno/event2usbhid ãå©ç¨ããã°Bluetoothæ¥ç¶ã®å ¥åæ©å¨ãUSBåæ¿å¨ã«æ¥ç¶ã§ãããã¨ãç¥ã£ãããã®è¨äºãèªãã¾ã§ã¯USB Gadget APIã®åå¨ãç¥ããªãã£ãã
ã¨ãããã¨ã§æåã®æ°æ¥ã¯ããã便å©ã«ä½¿ã£ã¦ããã®ã ããã©ãããæ¥macOSã§ä½¿ã£ãéã«ä¿®é£¾ãã¼(control, shift, alt, meta)ãä¸åå¹ããªããã¨ã«æ°ä»ãããã¾ããããã¯å人çãªç°å¢ã®è©±é¡ã ããæ®æ®µå©ç¨ãã¦ãããã©ãã¯ãã¼ã«ã®4ã¤ç®ã®ãã¿ã³ãåå¿ããªããã¨ã«ãä¸ä¾¿ãã¦ãããããããè§£æ¶ãã¹ãUSB HIDã®ä»æ§ãUSB Gadget APIã«ã¤ãã¦èª¿ã¹ã¦åã£ãã¨ãããèãä¹ã£ã¦åçã®ãã¼ã«ããã«ã¹ã¯ã©ããã§æ¸ãã¦ãã¾ã£ãããã®è¨äºã§ã¯ãã¼ã«ãèªåã§å®è£ ããã«ããã£ã¦èª¿ã¹ãå 容ã«ã¤ãã¦ã¡ã¢ãã¦ãç°¡åã«æ¸ãæ®ãã
ãã åã«ãã¼ã«ã使ããã人ã¯ä»¥ä¸ã®repoããREADMEã«æ²¿ã£ã¦ãã¼ã«ãã¤ã³ã¹ãã¼ã«ãããã¨ã§å©ç¨ãããã¨ãã§ãããç¾ç¶ã§åä½ã確èªãã¦ããã®ã¯Raspberry Pi Zero WHã®ã¿ã ããããããRaspberry Pi 4ä¸ã§ãåãã
å ã¨ãªã£ãevent2usbhidã¨æ¯ã¹ã¦ã以ä¸ã®æ©è½ãè¶³ããã¦ããã
- macOSã®ãµãã¼ã
- 修飾ãã¼ãå©ç¨ã§ãã
- 4ãã¿ã³ãã¦ã¹ã¸ã®å¯¾å¿
- 主ã«Kensingtonã®ãã©ãã¯ãã¼ã«ãæèãã¦ãã
- bt2usbhidãèµ·åä¸ã¯Bluetoothæ¥ç¶æ©å¨ã®å
¥åãLinuxæ¬ä½ã«åæ ãããªã
- ãã¡ãã¯event2usbhidã«Pull Requestãéã£ã¦ããç¶æ
- ãã®ä»ç´°ããªæ©è½
- USB HIDã®ä»æ§ä¸å®ç¾©ããã¦ãããã¼ã®ããã¤ãã«ä½åã«å¯¾å¿ãã¦ãã(ã¯ã)
ãªããã®ãã¼ã«ãå
¬éããã«ããã£ã¦
id:moguno ããã«ã¯ç¶æ³ãäºåã«äºæ
ããä¼ããã¦ãããå
¬éã快諾ãã¦ããã ãã¾ããããããã¨ããããã¾ã!
USB Gadget APIã¨libcomposite
bt2usbhidã§ã¯USB Gadget APIãå©ç¨ãã¦ããããã®APIã¯Linuxã«ã¼ãã«ã«çµã¿è¾¼ã¾ãããã®ã§é常ã®PCã§ã¯å©ç¨ãããã¨ãã§ããã対å¿ãããã¼ãã¦ã§ã¢ã®ã¿ã§å©ç¨ãããã¨ãã§ãããRaspberry Pi Zeroã¨Raspberry Pi 4ã¯ãã®USB Gadget APIã«å¯¾å¿ãã¦ããã libcomposite ã¢ã¸ã¥ã¼ã«ãæå¹ã«ããã¨ãé©åãªãã£ã¬ã¯ããªã«è¨å®ãã¡ã¤ã«ãæ¸ãåºãã ãã§ç«¯æ«ãUSBããã¤ã¹ã¨ãã¦æ¯ãèããããã¨ãã§ããã
- USB Gadget API for Linux — The Linux Kernel documentation
- Linux USB gadget configured through configfs — The Linux Kernel documentation
- linux/composite.c at master · torvalds/linux · GitHub
Raspberry Piã§ããããå©ç¨ããããã«ã¯ãäºåã«OTGã¢ã¼ããæå¹ã«ããä¸ã§ libcomposite ã¢ã¸ã¥ã¼ã«ããã¼ããã¦ããå¿
è¦ãããã
/boot/config.txtã®æ«å°¾ã«dtoverlay=dwc2ã追è¨ããmodprobeã§dwc2ã¨libcompositeãèªã¿è¾¼ãã§ãã/etc/modulesã«è¶³ãã§ãå¯- bt2usbhidã§ã¯USB Gadgetã®åæåã¹ã¯ãªããã®ä¸ã§
modprobeãå®è¡ãã¦ãã
Gadgetãåæåãã
æ¦ã以ä¸ã®ã¤ã³ã¹ãã©ã¯ã·ã§ã³ã«æ²¿ãã°è¯ãã
è¨å®ã¯configfsã«æ¸ãåºããRaspberry Piã§ã¯èªåã§ /sys/kernel/config 以ä¸ã«ãã¦ã³ããããããã®é åã¯æ®çºããã®ã§èµ·åãã度ã«è¨å®ãã¡ã¤ã«ãæ¸ãåºãå¿
è¦ãããã
gadgetã使ãã
/sys/kernel/config/usb_gadget/ 以ä¸ã«gadgetãå®ç¾©ãããã£ã¬ã¯ããªãä»»æã®ååã§ä½æãã¦ããã®ä¸ã«idVendor, idProductãã¡ã¤ã«ãæ¸ãåºãã
$ export GADGET_DIR=/sys/kernel/config/usb_gadget/g1
$ mkdir -p ${GADGET_DIR}
$ echo <idVendor> > ${GADGET_DIR}/idVendor
$ echo <idProduct> > ${GADGET_DIR}/idProduct
idVendorã¯USB-IFã«ãã£ã¦æãåºãããã®ã§ãèªç±ã«æå®ãããã¨ã¯ã§ããªããbt2usbhidã§ã¯idVendorã« 0x1d6b (Linux Foundation)ãidProductã« 0x0104 (Multifunction Composite Gadget)ãæå®ãã¦ããã
gadgetãå®ç¾©ãããã£ã¬ã¯ããªã«serialnumber, manufacturer, productãæ¸ãåºãããã®å¤ã¯ä»»æã§è¯ãã
$ mkdir -p ${GADGET_DIR}/strings/0x409/
$ echo <serialnumber> > ${GADGET_DIR}/strings/0x409/serialnumber
$ echo <manufacturer> > ${GADGET_DIR}/strings/0x409/manufacturer
$ echo <product> > ${GADGET_DIR}/strings/0x409/product
0x409 ã¯Language Identifierã§ãããen-US ã表ãã¦ããã
To get the latest LANGID definitions go to https://docs.microsoft.com/en-us/windows/desktop/intl/language-identifier-constants-and-strings. This page will change as new LANGIDs are added.
ã¨ã®ãã¨ã§ãMicrosoftã®ãã¼ã¸ã辿ã£ã¦ããã¨LANGIDãè¨è¼ãããPDFããã¦ã³ãã¼ããããã¨ãã§ãããã®ä¸ã« 0x0409 ã en-US ã¨ãã¦è¨è¼ããã¦ããã
configã使ãã
configã®ãã£ã¬ã¯ããªã使ãã¦ãä¸ã«configurationãã¡ã¤ã«ãæ¸ãåºããconfigã®ãã£ã¯ããªå㯠<ä»»æã®æåå>.<æ°å¤> ã§ããå¿
è¦ããããconfigurationãã¡ã¤ã«ã®ä¸èº«ã¯ä»»æã®å¤ã§è¯ãã
$ mkdir -p ${GADGET_DIR}/configs/c.1/strings/0x409
$ echo <configuration> > ${GADGET_DIR}/configs/c.1/strings/0x409/configuration
functionã使ãã
functionã®ãã£ã¬ã¯ããªã使ãã¦ãããã¤ã¹ãã©ã®ããã«æ¯ãèãã®ããå®ç¾©ããããã¼ãã¼ãããã¦ã¹ãªã©ã²ã¨ã¤ã®æ©è½ãã¨ã«ä½æããããããUSB Gadget APIã®ãã¢ã¨ãããã
$ mkdir -p ${GADGET_DIR}/functions/hid.usb0
$ echo <protocol> > ${GADGET_DIR}/functions/hid.usb0/protocol
$ echo <subclass> > ${GADGET_DIR}/functions/hid.usb0/subclass
$ echo <report_length> > ${GADGET_DIR}/functions/hid.usb0/report_length
$ echo -ne <report_description> > ${GADGET_DIR}/functions/hid.usb0/report_desc
protocolã¯ãã®ããã¤ã¹ãä½ã表ç¾ãã¦ããã®ããéç¥ããã 1 ã¯ãã¼ãã¼ãã§ 2 ã¯ãã¦ã¹ã表ããsubclassã¯ãUSB HIDããã¤ã¹ããã¼ããããã³ã«ã«å¯¾å¿ãã¦ãã(=BIOSã§å©ç¨ã§ãã)ãã©ãããéç¥ããããã¦ããå ´å㯠1 ããã¦ããªãå ´å㯠0ã
USBããã¤ã¹ã¯Reportã¨ããåä½ã§æ
å ±ãããã¨ãããããã®Reportã®æ§é ãå®ç¾©ããã®ãReport Descriptorã§ãreport_descã¨ãã¦æ¸ãåºãããã¤ããªãã¡ã¤ã«ã¨ãã¦æ¸ãåºãããã®ã§ããã®ãã¡ã¤ã«ã ã echo -ne ãªãã·ã§ã³ãã¤ãã¦ãããReport Descriptorã«ã¤ãã¦ã¯å¾è¿°ãããreport_descã¯Report Descriptorã®byteé·ã表ç¾ãã¦ããã
functionã¨configãç´ä»ãã
ããã¯åç´ã«configå ã«functionã¸ã®symlinkãç½®ãã°è¯ãã
$ ln -s ${GADGET_DIR}/functions/hid.usb0 ${GADGET_DIR}/configs/c.1/hid.usb0
gadgetãæå¹åãã
gadgetãæå¹åããã«ã¯ãUSB Device Controllerã®ååãUDCãã¡ã¤ã«ã«æ¸ãåºãã°è¯ãã
$ ls /sys/class/udc > ${GADGET_DIR}/UDC
ããã§ãUSBããã¤ã¹ãæ¥ç¶ãã端æ«ãã lsusb ããã¨ããã¤ã¹ã表示ãããã
$ lsusb ... Bus 001 Device 005: ID 1d6b:0104 Linux Foundation Multifunction Composite Gadget ...
ã¾ããUSBããã¤ã¹ã¨ãªã£ã端æ«ä¸ã§ã¯ããã¼ãã¼ãã¨ãã¦ã¹ã®ä¸¡æ¹ãå®ç¾©ãã¦ããã° /dev/hidg0 /dev/hidg1 ãã¡ã¤ã«ãçæããã¦ãããã¨ã確èªã§ããã
$ ls -l /dev/hidg* crw------- 1 root root 239, 0 Feb 6 14:15 /dev/hidg0 crw------- 1 root root 239, 1 Feb 6 14:15 /dev/hidg1
ãããã®ãã¡ã¤ã«ã«é©åã«Reportãæ¸ãè¾¼ããã¨ã§ããã¼ãã¼ãããã¦ã¹ã¨ãã¦æ¥ç¶å ã®ç«¯æ«ã«éä¿¡ãè¡ããã¨ãã§ããã
Report Descriptorãå®ç¾©ãã
åè¿°ã®éããUSBã®éä¿¡ã«ããã¦å®éã«ããã¨ããããã¼ã¿ãReportãReportã®æ§é ã®å®ç¾©ãReport Descriptorã¨å¼ã¶ãããã§ã¯ãµãããã¨Report Descriptorã®è¨æ³ã«ã¤ãã¦æ¸ãè¨ããå¤ãã®ãã¨ãçãã¦ããã®ã§ããã詳細ãªç¹ã«ã¤ãã¦ã¯ç´æ¥ä»æ§ãå½ããã¨è¯ãã
ä¾: ãã¦ã¹ã®Report Descriptor
Report Descriptorã§ã¯ãReportã®bitåã®ã©ã®ç¯å²ãã©ã®ç¨éã«ä½¿ããã¦ããã®ããå®ç¾©ãããä¾ãã°ã3ãã¿ã³ãã¦ã¹ã®Report Descriptorã¯ä»¥ä¸ã®ããã«ãªã*1ã
Usage Page (Generic Desktop), ;Use the Generic Desktop Usage Page
Usage (Mouse),
Collection (Application), ;Start Mouse collection
Usage (Pointer),
Collection (Physical), ;Start Pointer collection
Usage Page (Buttons)
Usage Minimum (1),
Usage Maximum (3),
Logical Minimum (0),
Logical Maximum (1), ;Fields return values from 0 to 1
Report Count (3),
Report Size (1), ;Create three 1 bit fields (button 1, 2, & 3)
Input (Data, Variable, Absolute), ;Add fields to the input report.
Report Count (1),
Report Size (5), ;Create 5 bit constant field
Input (Constant), ;Add field to the input report
Usage Page (Generic Desktop),
Usage (X),
Usage (Y),
Logical Minimum (-127),
Logical Maximum (127), ;Fields return values from -127 to 127
Report Size (8),
Report Count (2), ;Create two 8 bit fields (X & Y position)
Input (Data, Variable, Relative), ;Add fields to the input report
End Collection, ;Close Pointer collection
End Collection ;Close Mouse collection
ãã®åè¡ãhexã§è¡¨ç¾ããã¨ä»¥ä¸ã®ããã«ãªãã
\0x05 \0x01 // Usage Page (Generic Desktop), ;Use the Generic Desktop Usage Page \0x09 \0x02 // Usage (Mouse), \0xA1 \0x01 // Collection (Application), ;Start Mouse collection \0x09 \0x01 // Usage (Pointer), \0xA1 \0x00 // Collection (Physical), ;Start Pointer collection \0x05 \0x09 // Usage Page (Buttons) \0x19 \0x01 // Usage Minimum (1), \0x29 \0x03 // Usage Maximum (3), \0x15 \0x00 // Logical Minimum (0), \0x25 \0x01 // Logical Maximum (1), ;Fields return values from 0 to 1 \0x95 \0x03 // Report Count (3), \0x75 \0x01 // Report Size (1), ;Create three 1 bit fields (button 1, 2, & 3) \0x81 \0x02 // Input (Data, Variable, Absolute), ;Add fields to the input report. \0x95 \0x01 // Report Count (1), \0x75 \0x05 // Report Size (5), ;Create 5 bit constant field \0x81 \0x01 // Input (Constant), ;Add field to the input report \0x05 \0x01 // Usage Page (Generic Desktop), \0x09 \0x30 // Usage (X), \0x09 \0x31 // Usage (Y), \0x15 \0x81 // Logical Minimum (-127), \0x25 \0x7F // Logical Maximum (127), ;Fields return values from -127 to 127 \0x75 \0x08 // Report Size (8), \0x95 \0x02 // Report Count (2), ;Create two 8 bit fields (X & Y position) \0x81 \0x06 // Input (Data, Variable, Relative), ;Add fields to the input report \0xC0 // End Collection, ;Close Pointer collection \0xC0 // End Collection ;Close Mouse collection
ãã®Report Descriptorã«å¯¾å¿ããReportã¯ä»¥ä¸ã®ãããªæ§é ã«ãªãã
| (bit) | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 0byte | Padding | Button 3 | Button 2 | Button 1 | ||||
| 1byte | X | |||||||
| 2byte | Y | |||||||
ã¤ã¾ãå ¨é·3byteã§ã0byteç®ã§ã¯ãã¿ã³ã®ç¶æ ã1byteç®ã§X軸ã®ç§»åã2byteç®ã§Y軸ã®ç§»åã表ç¾ããã
ããã«åè§£ãã¦ãã¿ã³é¨åã«ã¤ãã¦è¦ã¦ã¿ãã
\0x05 \0x09 // Usage Page (Buttons) \0x19 \0x01 // Usage Minimum (1), \0x29 \0x03 // Usage Maximum (3), \0x15 \0x00 // Logical Minimum (0), \0x25 \0x01 // Logical Maximum (1), \0x95 \0x03 // Report Count (3), \0x75 \0x01 // Report Size (1), \0x81 \0x02 // Input (Data, Variable, Absolute), \0x95 \0x01 // Report Count (1), \0x75 \0x05 // Report Size (5), \0x81 \0x01 // Input (Constant),
åè¡ãitemã¨å¼ã³ãããããã®0byteç®ã¯itemã®åããã¼ã¿é¨ã®byteé·ãå«ãã prefixã«ãªã£ã¦ãããä¾ãã°1è¡ç®ã¯ \0x05 ãUsage Pageã表ç¾ãããUsage Pageã®ãã¡ãä½ãæå®ãããã¯ãã®å¾ã®dataé¨ã«å®ç¾©ãããããã§ã¯Button Pageãæå®ãããã®ã§ \0x09 ã«ãã¦ãã*2ãprefixããã¼ã¿é¨ã®byteé·ãå«ãã§ããã®ã§ããã¼ã¿é¨ã¯å¯å¤é·ãå
·ä½çã«ã¯0,1,2,4byteã®ããããã«ãªã£ã¦ãã(ããã«é·ããã¼ã¿é¨ãåãæ¹æ³ããã)ã
itemã«ã¯main item, global item, local itemãåå¨ãã¦ãããReport Descriptorã®ãã¼ã¹æã®æåã¯ãããã®itemã®ç¨®é¡ã«å¯ã*3ãmain itemãåºã¦ããå ´åã¯ãmain itemã«å¯¾ãã¦ããã¾ã§ç»å ´ããglobal item, local itemã®è¨å®å¤ãé©ç¨ãããä¸è¨ãã¿ã³ã®Descriptorã®ä¾ã§ããã¨ãæåã«ç»å ´ãã Input(Data, Variable, Absolute) ã«ã¯ããããããä¸ã«ç»å ´ãã Usage Page ã Logical Maximum ãªã©ã®å¤ãé©ç¨ããããmain itemãè§£éããæç¹ã§local itemã®è¨å®å¤ã¯æ®çºãã¦ãglobal itemã®è¨å®å¤ã¯ä»¥éã®main itemã®å¤ã«å¼ãç¶ãããã
ã²ã¨ã¤ãã®Inputã¯
- Usage PageãButton
- Button Pageã§å®ç¾©ããã¦ãããã¿ã³ã®ãã¡ãButton 1ããButton 3ã¾ã§ãå®ç¾©ãã
- å¤ã¯0 or 1
- åãã¿ã³ã®éä¿¡ã§ä½¿ãbitæ°ã¯1(0 or 1ãªã®ã§), æ°ã¯3(ãã¿ã³ã3ã¤ãªã®ã§)
ã¨ãããã¨ã«ãªããå¾ç¶ã®Inputã¯Reportã®ç©´åã(padding)ã¨ãã¦æå®ãã¦ãããè©°ããã«Inputãã¨ã«1byteãã¤åºåããæ¹ãReport使å¦çãç°¡ç´ ã«ãªãã®ã§ç©´åããã¦ãããã®ã¨æããã(仿§ã«ã¯paddingã§ããã¨ããè¨è¼ããã¦ããªãã®ã§ããã¾ã§æ³å)
ä¾ãã°4ãã¿ã³ãã¦ã¹ãä½ããããã°ãButton 4ãå®ç¾©ãããã¨ã«ãã¦Report Countã3ãã4ã«å¢ããã°è¯ãã®ã§ãDescriptorã以ä¸ã®ããã«æå®ããã°è¯ãã
\0x05 \0x09 // Usage Page (Buttons) \0x19 \0x01 // Usage Minimum (1), \0x29 \0x04 // Usage Maximum (4), \0x15 \0x00 // Logical Minimum (0), \0x25 \0x01 // Logical Maximum (1), \0x95 \0x04 // Report Count (4), \0x75 \0x01 // Report Size (1), \0x81 \0x02 // Input (Data, Variable, Absolute), \0x95 \0x01 // Report Count (1), \0x75 \0x04 // Report Size (4), \0x81 \0x01 // Input (Constant),
macOSã«ããããã¼ãã¼ãã®Report Descriptorã®è§£é
åé ã«ãæ¸ããã¨ãããmacOSã«ããã¦ã¯modifierãã¼ãåä½ããªãç¾è±¡ãçºçãã¦ãããé常ã®USBãã¼ãã¼ãã®Report Descriptorã§ã¯0byteç®ãmodifierãã¼ã®é åã¨ãã¦å®ç¾©ãã¦ãããå ·ä½çã«ã¯ä»¥ä¸ã®ãããªèª¿åã«ãªã£ã¦ããã
\x05 \x07 // Usage Page (Key Codes) \x19 \xE0 // Usage Minimum (224) \x29 \xE7 // Usage Maximum (231) \x15 \x00 // Logical Minimum (0) \x25 \x01 // Logical Maximum (1) \x75 \x01 // Report Size (1) \x95 \x08 // Report Count (8) \x81 \x02 // Input (Data, Variable, Absolute)
224-231ã¯modifierãã¼ãæãã¦ãã¦*4ããã®8ã¤ã®ãã¼ã«ã¤ãã¦ã¯Reportã®0byteç®ã®åbitãç«ã¦ããã¨ã§ON/OFFãéç¥ã§ããã
| (bit) | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| key | RIGHT GUI | RIGHT ALT | RIGHT SHIFT | RIGHT CTRL | LEFT GUI | LEFT ALT | LEFT SHIFT | LEFT CTRL |
Linuxã§ã¯modifierãã¼ãé常ã®ãã¼ã¨åæ§ã«ãã¼ã³ã¼ããéãã°èªèããã¦ããããmacOSã®å ´åã¯modifierãã¼ã®å ´åã¯ãã®0byteç®ã®bitåãON/OFFããå¿ è¦ãããããã ã£ãã
Reportãåºåããããã°ã©ã ãæ¸ã
ããã¾ã§è¨å®ããã°ããã¨ã¯Report Descriptorã®å®ç¾©ã«æ²¿ã£ã¦ /dev/hidg0 ã /dev/hidg1 ã«åºåããã°è¯ããããã¯ã©ããªè¨èªã§ãè¯ããbt2usbhidã§ã¯Reportã®æ§é ä½ãå®ç¾©ãã¦ããã¦ããã®ã¾ã¾writeã§åºåãã¦ããã
Report Descriptorã¨Reportããããã°ãã
å®è£
ããã¾ãåããªãå ´åãReport Descriptorã¨å®éã«åºåãã¦ããReportã確èªããªãããããã°ãããã¨ã«ãªããusbhid-dump ã¨ãããã¼ã«ã¨ã hidrd-convert ã¨ãããã¼ã«ãå½¹ã«ç«ã¤ãusbhid-dump ã¯Arch Linuxã§ããã° sudo pacman -Sy usbutils ã§ã¤ã³ã¹ãã¼ã«ã§ããã hidrd-convert ã¯AURããã¤ã³ã¹ãã¼ã«ãããã¨ãã§ããã
å©ç¨ããã«ã¯ã¾ã lsusb ãã¦ãaddressã確èªããã以ä¸ã®ä¾ã§ã¯Busã001, Deviceã005ãªã®ã§ãaddress㯠001.005 ã¨ãªãã
$ lsusb ... Bus 001 Device 005: ID 1d6b:0104 Linux Foundation Multifunction Composite Gadget ...
ãã®ããã¤ã¹ã®Report Descriptorãç¥ãããå ´åã¯ã以ä¸ã®ã³ãã³ãã§åºåã§ããã
$ sudo usbhid-dump -e descriptor -a 001:005 | grep -v : | xxd -r -p | hidrd-convert -o spec
Usage Page (Desktop), ; Generic desktop controls (01h)
Usage (Mouse), ; Mouse (02h, application collection)
Collection (Application),
Usage (Pointer), ; Pointer (01h, physical collection)
...
Reportãå
¨ã¦ç¢ºèªãããå ´åã¯ã以ä¸ã®ã³ãã³ãã§å¾
ã¡åãããã¨ãã§ããããã®ä¾ã§ã¯ãbt2usbhidã®ã¬ãã¼ããå¾
ã¡åãã¦ããããã¼ãã¼ãä¸ã§ a ãæ¼ä¸ãã¦é¢ããå¾ããã¦ã¹ã®ä¸»ãã¿ã³ãæ¼ä¸ãã¦é¢ãã¦ããã
$ sudo usbhid-dump -e all -a 001:005 001:005:001:DESCRIPTOR 1612887753.901255 05 01 09 02 A1 01 09 01 A1 00 05 09 19 01 29 04 15 00 25 01 75 01 95 04 81 02 75 04 95 01 81 01 05 01 09 30 09 31 09 38 15 81 25 7F 75 08 95 03 81 06 C0 C0 001:005:000:DESCRIPTOR 1612887753.901707 05 01 09 06 A1 01 05 07 19 E0 29 E7 15 00 25 01 75 01 95 08 81 02 75 08 95 01 81 01 05 08 19 01 29 05 75 01 95 05 91 02 75 03 95 01 91 01 05 07 19 00 2A FF 00 15 00 26 FF 00 75 08 95 06 81 00 C0 Starting dumping interrupt transfer stream with 1 minute timeout. 001:005:000:STREAM 1612887757.455080 00 00 04 00 00 00 00 00 001:005:000:STREAM 1612887757.534081 00 00 00 00 00 00 00 00 001:005:001:STREAM 1612887759.112078 01 00 00 00 001:005:001:STREAM 1612887759.190067 00 00 00 00
æ¢è£½åã®USBããã¤ã¹ã®addressãæå®ããã°ãReport Descriptorã¨Reportãè¦ããã¨ã§ã©ã®ãããªå®è£ ã«ãªã£ã¦ãããã確èªãããã¨ãã§ããã
主ã«åèã«ãããã¼ã¸ç
- USB Gadget API for Linux — The Linux Kernel documentation
- USB Gadget APIã®ä¸è¬çãªè©±é¡ãè¼ã£ã¦ã
- Linux USB gadget configured through configfs — The Linux Kernel documentation
- USB Gadgetãåæåããæé ãè¼ã£ã¦ã
- Device Class Definition for HID 1.11 | USB-IF
- USB HIDã®ä¸è¬çãªä»æ§ãè¼ã£ã¦ã
- HID Usage Tables 1.3 | USB-IF
- Keyboardã®key codeã¨ããè¼ã£ã¦ã
*1:Device Class Definition for Human Interface Devices (HID) Firmware Specification 5/27/01 Version 1.11 p.25ããå¼ç¨ https://www.usb.org/sites/default/files/hid1_11.pdf
*2:HID Usage Tables FOR Universal Serial Bus p.102 https://usb.org/sites/default/files/hut1_21_0.pdf
*3:Device Class Definition for Human Interface Devices (HID) Firmware Specification 5/27/01 Version 1.11 p.15 https://www.usb.org/sites/default/files/hid1_11.pdf
*4:HID Usage Tables FOR Universal Serial Bus p.87 https://usb.org/sites/default/files/hut1_21_0.pdf