ããã«äœãã¬ãã«ïŒavr-vusbïŒã®
USBã¬ãžã¹ã¿ãŒïŒSTM32L1 / STM32F1
USBã¬ãžã¹ã¿ãŒïŒå€§å®¹éã¹ãã¬ãŒãžã®äŸã®ãã«ã¯ãšã³ããã€ã³ã
USBã¬ãžã¹ã¿ãŒã®USBïŒãªãŒãã£ãªããã€ã¹ã®äŸã®çææ§ãšã³ããã€ã³ã
STM32L151ã³ã³ãããŒã©ãŒã®USBã åŒãç¶ãæ±ããŸããåã®éšåãšåæ§ã«ãããã§ã¯ãã©ãããã©ãŒã ã«äŸåãããã®ã¯ãããŸããããUSBã«äŸåããŸããããæ£ç¢ºã«ã¯ã3çªç®ã®ã¿ã€ãã®ãšã³ããã€ã³ãã§ããå²ã蟌ã¿ã«ã€ããŠæ€èšããŸãããããŠãè€åããã€ã¹ãããŒããŒã+ã¿ãã¬ãããïŒãœãŒã¹ãžã®ãªã³ã¯ïŒã®äŸã䜿çšããŠãããè¡ã ãŸãã
念ã®ãããèŠåããŸãããã®èšäºã¯ïŒä»ã®ãã¹ãŠã®äººãšåæ§ã«ïŒããã®ãããã¯ãçè§£ããŠãããšãã«çè§£ããããšã®æŠèŠã§ããå€ãã®ããšããéæ³ãã®ãŸãŸã§ããããããã説æã§ããå°éå®¶ãããã°ãããããã§ãã
ãŸããHIDïŒHuman Interface DeviceïŒãããã³ã«ã¯ã倧éã®ããŒã¿ã亀æããããã®ãã®ã§ã¯ãªãããšãæãåºããŠãã ããã亀æå šäœã¯ãã€ãã³ããšç¶æ ã®2ã€ã®æŠå¿µã«åºã¥ã㊠ã ãŸããã€ãã³ãã¯ãå€éšãŸãã¯å éšã®åœ±é¿ã«å¿çããŠçºçãã1åéãã®ã¡ãã»ãŒãžã§ããããšãã°ããŠãŒã¶ãŒããã¿ã³ãæŒããããããŠã¹ãåããããããŸãããŸãã¯ã1ã€ã®ããŒããŒãã§NumLockãç¡å¹ã«ããŸããããã®åŸããã¹ãã匷å¶ããã2çªç®ã®ããŒããŒããé©åãªã³ãã³ããéä¿¡ããŠ
ãããã£ãŠãå²ã蟌ã¿ãã€ã³ãã®ç®çã¯ãã³ã³ãããŒã©ãŒã®å²ã蟌ã¿ãšåãã§ããã€ãŸãããŸããªã€ãã³ãããã°ããå ±åããŸãããã ããUSBã¯ãã¹ãäžå¿ã®ãã®ã§ãããããããã€ã¹ãç¬èªã«è»¢éãéå§ããæš©å©ã¯ãããŸããããããåé¿ããããã«ãUSBéçºè ã¯æŸèæãæãã€ããŸããããã¹ãã¯å®æçã«ãã¹ãŠã®å²ã蟌ã¿ãã€ã³ããèªã¿åãèŠæ±ãéä¿¡ããŸãããªã¯ãšã¹ãã®é »åºŠã¯ãEndpointDescriptorã®æåŸã®ãã©ã¡ãŒã¿ãŒã«ãã£ãŠæ§æãããŸãïŒããã¯ConfigurationDescriptorã®äžéšã§ãïŒãåã®ç« ã§bIntervalãã£ãŒã«ãããã§ã«èŠãŠããŸãããããã®å€ã¯ç¡èŠãããŸãããä»ã圌ã¯ã€ãã«çšéãèŠã€ããŸãããå€ã®ãµã€ãºã¯1ãã€ãã§ãããªç§åäœã§èšå®ãããããã1ããªç§ãã2.55ç§ã®ééã§ããŒãªã³ã°ãããŸããäœéããã€ã¹ã®å Žåãæå°ééã¯10msã§ããå²ã蟌ã¿ãã€ã³ããããŒãªã³ã°ãããŠããæŸèæã®ååšã¯ã亀æããªãå Žåã§ãããã¹ã®åž¯åå¹ ãæµªè²»ããããšã«ãªããŸãã
è«ççãªçµè«ïŒå²ã蟌ã¿ãã€ã³ãã¯INãã©ã³ã¶ã¯ã·ã§ã³å°çšã§ããç¹ã«ãããŒããŒããããŠã¹ããã®ã€ãã³ãã®éä¿¡ãCOMããŒãã®ãµãŒãã¹ã©ã€ã³ã®å€æŽã®éç¥ããªãŒãã£ãªã¹ããªãŒã ã®åæãªã©ã«äœ¿çšãããŸããããããããããã¹ãŠã®ããã«ãä»ã®ã¿ã€ãã®ãã€ã³ãã远å ããå¿ èŠããããŸãããããã£ãŠãäŸãè€éã«ããªãããã«ãHIDããã€ã¹ã®å®è£ ã«éå®ããŸããå®éãæåã®éšåã§ãã§ã«ãã®ãããªããã€ã¹ãäœæããŸãããã远å ã®ãã€ã³ãã¯ãŸã£ãã䜿çšããããHIDãããã³ã«ã®æ§é ã¯èæ ®ãããŠããŸããã§ããã
ConfigurationDescriptor
static const uint8_t USB_ConfigDescriptor[] = {
ARRLEN34(
ARRLEN1(
bLENGTH, // bLength: Configuration Descriptor size
USB_DESCR_CONFIG, //bDescriptorType: Configuration
wTOTALLENGTH, //wTotalLength
1, // bNumInterfaces
1, // bConfigurationValue: Configuration value
0, // iConfiguration: Index of string descriptor describing the configuration
0x80, // bmAttributes: bus powered
0x32, // MaxPower 100 mA
)
ARRLEN1(
bLENGTH, //bLength
USB_DESCR_INTERFACE, //bDescriptorType
0, //bInterfaceNumber
0, // bAlternateSetting
2, // bNumEndpoints
HIDCLASS_HID, // bInterfaceClass:
HIDSUBCLASS_BOOT, // bInterfaceSubClass:
HIDPROTOCOL_KEYBOARD, // bInterfaceProtocol:
0x00, // iInterface
)
ARRLEN1(
bLENGTH, //bLength
USB_DESCR_HID, //bDescriptorType
USB_U16(0x0110), //bcdHID
0, //bCountryCode
1, //bNumDescriptors
USB_DESCR_HID_REPORT, //bDescriptorType
USB_U16( sizeof(USB_HIDDescriptor) ), //wDescriptorLength
)
ARRLEN1(
bLENGTH, //bLength
USB_DESCR_ENDPOINT, //bDescriptorType
INTR_NUM, //bEdnpointAddress
USB_ENDP_INTR, //bmAttributes
USB_U16( INTR_SIZE ), //MaxPacketSize
10, //bInterval
)
ARRLEN1(
bLENGTH, //bLength
USB_DESCR_ENDPOINT, //bDescriptorType
INTR_NUM | 0x80, //bEdnpointAddress
USB_ENDP_INTR, //bmAttributes
USB_U16( INTR_SIZE ), //MaxPacketSize
10, //bInterval
)
)
};
æ³šææ·±ãèªè ã¯ããšã³ããã€ã³ãã®èª¬æã«ããã«æ°ä»ããããããŸããã2çªç®ã®å Žåããã¹ãŠãé çªã«ãªããŸããINãã€ã³ãïŒ0x80ã§ã®å ç®ã®ããïŒã¯å²ã蟌ã¿ã¿ã€ãã§ããããããµã€ãºãšééãæå®ãããŸããããããæåã®ãã®ã¯OUTãšããŠå®£èšãããŠããããã§ãããåæã«å²ã蟌ã¿ãçºçããŸããããã¯ãåã«è¿°ã¹ãããšãšççŸããŸãããããŠåžžèãïŒãã¹ãã¯ãã€ã§ãããã€ã¹ã«äœãã転éããããã«æŸèæãå¿ èŠãšããŸããããã ãããã®æ¹æ³ã§ã¯ãä»ã®ã¬ãŒãããã€ãã¹ãããŸããSTM32ã®ãšã³ããã€ã³ãã¿ã€ãã¯1ã€ã®ãã€ã³ãã§ã¯ãªããIN / OUTãã¢ã«å¯ŸããŠã®ã¿èšå®ãããããã0x81çªç®ã®ãã€ã³ããå²ã蟌ã¿ã¿ã€ãã«èšå®ããã®ã§ã¯ãªãã0x01çªç®ã«èšå®ããŸããã³ã³ãããŒã«ããã ããããã¯ãã¹ãã«ãšã£ãŠåé¡ã§ã¯ãããŸããããããããã«ã¯ãã€ã³ãã§ãåãããŒã¿ãéä¿¡ããŸã...ãã ããããã«ã€ããŠã¯ç¢ºèªããŸããã
HIDèšè¿°å
HIDèšè¿°åã®æ§é ã¯ãæ§æãã¡ã€ã«ãname = valueãã«æã䌌ãŠããŸããããããšã¯ç°ãªãããnameãã¯USBåºæã®ãªã¹ãã®æ°å€å®æ°ã§ããããvalueãã宿°ãŸãã¯å€æ°ã§ãããµã€ãº0ãã3ãã€ããŸã§ã
éèŠïŒäžéšã®ãååãã®å Žåããå€ãã®é·ãã¯ãååããã£ãŒã«ãã®æäžäœ2ãããã§æå®ãããŸããããšãã°ãLOGICAL_MINIMUMïŒãã®å€æ°ãéåžžã¢ãŒãã§åãããšãã§ããæå°å€ïŒãèããŠã¿ãŸãããããã®å®æ°ã®ã³ãŒãã¯0x14ã§ãããããã£ãŠããå€ãããªãå ŽåïŒããã¯çºçããªãããã§ãããè°è«ã¯ããŸãã-äœããã®çç±ã§ãã®ã±ãŒã¹ãå ¥åãããŸããïŒãèšè¿°åã«ã¯åäžã®æ°å€0x14ãå«ãŸããŸãã ãå€ãã1ïŒ1ãã€ãïŒã®å Žåã0x15ã0x01ãæžã蟌ãŸããŸãã 2ãã€ãã®å€ã®å Žåã0x1234ã0x16ã0x34ã0x12ãæžã蟌ãŸããŸã-å€ã¯äœããã®ããé«ããã®ãžãšæžã蟌ãŸããŸããããŒãã®åã§ã¯ãçªå·0x123456ã¯0x17ã0x56ã0x34ã0x12ã«ãªããŸãã
åœç¶ãç§ã¯ããããã¹ãŠã®æ°å€å®æ°ãèŠããã®ãé¢åãªã®ã§ããã¯ãã䜿çšããŸããæ®å¿µãªãããæž¡ãããå€ã®ãµã€ãºãèªåã§ææ¡ããŠ1ã2ã3ããŸãã¯4ãã€ãã«æ¡åŒµããæ¹æ³ãèŠã€ããããŸããã§ããããããã£ãŠãæŸèæãäœãå¿ èŠããããŸãã ïŒæ¥å°ŸèŸã®ãªããã¯ãã¯æãäžè¬çãª8ãããå€ã«è²¬ä»»ãããã16ãããå€ã®å Žåã¯æ¥å°ŸèŸ16ã24ãããå€ã®å Žåã¯24ã§ãããã¯ãã¯ã4ã6ããŸãã¯8ãã€ãã«æ¡åŒµãããç¯å²LOGICAL_MINMAX24ïŒæå°ãæå€§ïŒã®ãããªãè€åãå€çšã«ãèšè¿°ãããŠããŸãã
æ§æãã¡ã€ã«ãšåæ§ã«ãç®çå¥ã«ããã€ã¹ãã°ã«ãŒãåããããŒãžïŒusage_pageïŒãšåŒã°ãããã»ã¯ã·ã§ã³ãããããŸããããšãã°ãããŒããŒããããŠã¹ããã¿ã³ã ããªã©ã®åºæ¬çãªåšèŸºæ©åšãåããããŒãžãããããžã§ã€ã¹ãã£ãã¯ãšã²ãŒã ãããããããŸãïŒã©ããèŠãã®ãå¿ãããå§ãããŸãïŒæŠè»ãå®å®è¹ãæœæ°ŽèŠãªã©ã«ããããŸãïŒããã£ã¹ãã¬ã€ããããŸã...確ãã«ãããããã¹ãŠã§åäœãããœãããŠã§ã¢ãã©ãã§æ¢ãã¹ãããç§ã«ã¯ããããŸããã
åããŒãžå ã§ãç¹å®ã®ããã€ã¹ãéžæãããŠããŸããããšãã°ãããŠã¹ã®å Žåã¯ãã€ã³ã¿ãšãã¿ã³ã§ãããã¿ãã¬ããã®å Žåã¯ã¹ã¿ã€ã©ã¹ãŸãã¯ãŠãŒã¶ãŒã®æã§ãïŒäœïŒïŒïŒããŸããããã€ã¹ã®æ§æéšåãæå®ããŸãããããã£ãŠããã€ã³ã¿ã®äžéšã¯X座æšãšY座æšã§ããäžéšã®ç¹æ§ã¯ãã³ã¬ã¯ã·ã§ã³ãã«ã°ã«ãŒãåã§ããŸããããªããããè¡ãããã®ãããããããŸãããããã¥ã¡ã³ãã§ã¯ããã£ãŒã«ãã®ç®çãšæäœæ¹æ³ã«ã€ããŠããã£ãŒã«ãã«2æåã®æåãä»ããŠããå ŽåããããŸãã
| CA | ã³ã¬ã¯ã·ã§ã³ïŒã¢ããªã±ãŒã·ã§ã³ïŒ | ã©ã®å€æ°ã«ã察å¿ããªããµãŒãã¹æ å ± |
| CL | ã³ã¬ã¯ã·ã§ã³ïŒè«çïŒ | -/- |
| CP | ã³ã¬ã¯ã·ã§ã³ïŒç©ççïŒ | -/- |
| Dv | åçãªäŸ¡å€ | å ¥åå€ãŸãã¯åºåå€ïŒå€æ°ïŒ |
| MC | ç¬éçãªå¶åŸ¡ | ã¹ããŒã¿ã¹ãã©ã°ïŒ1-ãã©ã°ãã³ãã¯ããã0-ã¯ãªã¢ãããïŒ |
| OSC | ã¯ã³ã·ã§ããã³ã³ãããŒã« | 1åéãã®ã€ãã³ããé·ç§»0-> 1ã®ã¿ãåŠçãããŸã |
ãã¡ããä»ã«ããããŸãããç§ã®äŸã§ã¯äœ¿çšããŠããŸãããããšãã°ãXãã£ãŒã«ããDVãšããŠããŒã¯ãããŠããå Žåãããã¯ãŒã以å€ã®é·ãã®å€æ°ãšèŠãªãããã¬ããŒãæ§é ã«å«ãŸããŸãã MCãŸãã¯OSCãã£ãŒã«ããã¬ããŒãã«å«ãŸããŸããããµã€ãºã¯1ãããã§ãã
1ã€ã®ã¬ããŒãïŒããã€ã¹ã«ãã£ãŠéä¿¡ãŸãã¯åä¿¡ãããããŒã¿ãã±ããïŒã«ã¯ãããã«èšè¿°ãããŠãããã¹ãŠã®å€æ°ã®å€ãå«ãŸããŠããŸãããã¿ã³ã®èª¬æã§ã¯ãå æãããŠãããããã¯1ã€ã ãã§ãããçžå¯Ÿåº§æšïŒããšãã°ãããŠã¹ã®ç§»åéïŒã®å Žåã¯ãå°ãªããšã1ãã€ããå¿ èŠã§ããã絶察座æšïŒã¿ããã¹ã¯ãªãŒã³ãªã©ïŒã®å Žåã¯ãå°ãªããšã2ãã€ããå¿ èŠã§ããå¿ èŠã§ããããã«ãå€ãã®ã³ã³ãããŒã«ã«ã¯ç¬èªã®ç©ççå¶éããããŸããããšãã°ãåãã¿ããã¹ã¯ãªãŒã³ã®ADCã®è§£å床ã¯ããã10ãããã§ããã€ãŸãã0ãã1023ãŸã§ã®å€ãæå®ã§ããŸããããã¯ããã¹ãããã«ã¹ã¯ãªãŒã³è§£å床ã«ã¹ã±ãŒãªã³ã°ããå¿ èŠããããŸãããããã£ãŠãåãã£ãŒã«ãã®ç®çã«å ããŠãèšè¿°åã¯ãã®èš±å®¹å€ã®ç¯å²ïŒLOGICAL_MINMAXïŒã«å ããŠãå Žåã«ãã£ãŠã¯ç©çå€ã®ç¯å²ïŒããªã¡ãŒãã«åäœãŸãã¯åºŠåäœïŒãšã§ã®è¡šç€ºãæå®ããŸãã¬ããŒãã¯å¿ é ã§ãã衚çŸã¯ã1ã€ã®å€æ°ã®ãµã€ãºïŒãããåäœïŒãšãã®æ°ã®2ã€ã®æ°å€ã§èšå®ãããŸããããšãã°ãäœæããŠããããã€ã¹ã®ã¿ããã¹ã¯ãªãŒã³ã«è§Šãã座æšã¯æ¬¡ã®ããã«èšå®ãããŸãã
USAGE( USAGE_X ), // 0x09, 0x30,
USAGE( USAGE_Y ), // 0x09, 0x31,
LOGICAL_MINMAX16( 0, 10000 ), //0x16, 0x00, 0x00, 0x26, 0x10, 0x27,
REPORT_FMT( 16, 2 ), // 0x75, 0x10, 0x95, 0x02,
INPUT_HID( HID_VAR | HID_ABS | HID_DATA), // 0x91, 0x02,
ããã§ã¯ã0ãã10000ã®ç¯å²ã§å€åããã¬ããŒãã®16ãããã®2ã€ã®ã»ã¯ã·ã§ã³ãå ãã2ã€ã®å€æ°ã宣èšãããŠããããšãããããŸãã
æåŸã®ãã£ãŒã«ãã¯ãäžèšã®å€æ°ããã¹ãïŒINïŒã«ãã£ãŠèªã¿åãããããšã瀺ãããã®æ¹æ³ãæ£ç¢ºã«èª¬æããŠããŸãããã®ãã©ã°ã«ã€ããŠã¯è©³ãã説æããŸãããããã€ãã ã説æããŸãã HID_ABSãã©ã°ã¯ãå€ã絶察å€ã§ããããšãã€ãŸããå±¥æŽãå€ã«åœ±é¿ãäžããªãããšã瀺ããŸãã代æ¿å€HID_RELã¯ãå€ãåã®å€ããã®ãªãã»ããã§ããããšã瀺ããŸãã HID_VARãã©ã°ã¯ãåãã£ãŒã«ããç¬èªã®å€æ°ãæ åœããããšã瀺ããŸãã代æ¿å€HID_ARRã¯ããªã¹ãã®ãã¹ãŠã®ãã¿ã³ã®ç¶æ ãéä¿¡ãããã®ã§ã¯ãªããã¢ã¯ãã£ããªãã¿ã³ã®æ°ã®ã¿ãéä¿¡ãããããšã瀺ããŸãããã®ãã©ã°ã¯ãã·ã³ã°ã«ããããã£ãŒã«ãã«ã®ã¿é©çšãããŸãããã¹ãŠã®ããŒããŒããã¿ã³ã®101/102ç¶æ ãéä¿¡ãã代ããã«ãæŒãããããŒã®ãªã¹ãã䜿çšããŠæ°ãã€ãã«å¶éããããšãã§ããŸããæ¬¡ã«ãæåã®ãã©ã¡ãŒã¿ãŒREPORT_FMTãæ°å€ã®ãµã€ãºãæ åœãã2çªç®ã®ãã©ã¡ãŒã¿ãŒãæ°å€ãæ åœããŸãã
ãã¹ãŠã®å€æ°ã®ãµã€ãºã¯ãããåäœã§èšå®ãããããããã¿ã³ã®æ°ã¯8ã®åæ°ã§ã¯ãªãå¯èœæ§ãããããããã¿ã³ã«ã€ããŠè³ªåããã®ãè«ççã§ããããã«ãããèªã¿åããšæžã蟌ã¿ã®äœçœ®åãããå°é£ã«ãªããŸããåãã¿ã³ã«ãã€ããå²ãåœãŠãããšã¯å¯èœã§ãããã¬ããŒãã®éãå€§å¹ ã«å¢å ãããããå²ã蟌ã¿ãªã©ã®é«éããã°ã©ã ã«ã¯äžå¿«ã§ãã代ããã«ããã¿ã³ãäºãã«è¿ã¥ããŠé 眮ããããšããæ®ãã®ã¹ããŒã¹ã¯HID_CONSTãã©ã°ã®ä»ãããããã§åããããŸãã
ããã§ãèšè¿°åãæåããæžã蟌ãŸãªãå Žåã§ããå°ãªããšããããèªã¿åãããšããããšãã§ããŸããã€ãŸãããã®ãã£ãŒã«ããŸãã¯ãã®ãã£ãŒã«ããã©ã®ãããã«å¯Ÿå¿ããããå€å¥ã§ããŸãã INPUT_HIDãšå¯Ÿå¿ããREPORT_FMTãæ°ããã ãã§ååã§ããç§ããã®ãããªãã¯ããæãã€ããã®ã§ãä»ã®èª°ããããã䜿çšããªãããšãèŠããŠãããŠãã ãããä»ã®äººã®èšè¿°åã§ã¯ãinputãreport_sizeãreport_countãããã«ã¯æ°å€å®æ°ãæ¢ãå¿ èŠããããŸãã
ããã§ãèšè¿°åå šäœãæã£ãŠããããšãã§ããŸãã
static const uint8_t USB_HIDDescriptor[] = {
//keyboard
USAGE_PAGE( USAGEPAGE_GENERIC ),//0x05, 0x01,
USAGE( USAGE_KEYBOARD ), // 0x09, 0x06,
COLLECTION( COLL_APPLICATION, // 0xA1, 0x01,
REPORT_ID( 1 ), // 0x85, 0x01,
USAGE_PAGE( USAGEPAGE_KEYBOARD ), // 0x05, 0x07,
USAGE_MINMAX(224, 231), //0x19, 0xE0, 0x29, 0xE7,
LOGICAL_MINMAX(0, 1), //0x15, 0x00, 0x25, 0x01,
REPORT_FMT(1, 8), //0x75, 0x01, 0x95, 0x08
INPUT_HID( HID_DATA | HID_VAR | HID_ABS ), // 0x81, 0x02,
//reserved
REPORT_FMT(8, 1), // 0x75, 0x08, 0x95, 0x01,
INPUT_HID(HID_CONST), // 0x81, 0x01,
REPORT_FMT(1, 5), // 0x75, 0x01, 0x95, 0x05,
USAGE_PAGE( USAGEPAGE_LEDS ), // 0x05, 0x08,
USAGE_MINMAX(1, 5), //0x19, 0x01, 0x29, 0x05,
OUTPUT_HID( HID_DATA | HID_VAR | HID_ABS ), // 0x91, 0x02,
// 1
REPORT_FMT(3, 1), // 0x75, 0x03, 0x95, 0x01,
OUTPUT_HID( HID_CONST ), // 0x91, 0x01,
REPORT_FMT(8, 6), // 0x75, 0x08, 0x95, 0x06,
LOGICAL_MINMAX(0, 101), // 0x15, 0x00, 0x25, 0x65,
USAGE_PAGE( USAGEPAGE_KEYBOARD ), // 0x05, 0x07,
USAGE_MINMAX(0, 101), // 0x19, 0x00, 0x29, 0x65,
INPUT_HID( HID_DATA | HID_ARR ), // 0x81, 0x00,
)
//touchscreen
USAGE_PAGE( USAGEPAGE_DIGITIZER ), // 0x05, 0x0D,
USAGE( USAGE_PEN ), // 0x09, 0x02,
COLLECTION( COLL_APPLICATION, // 0xA1, 0x0x01,
REPORT_ID( 2 ), //0x85, 0x02,
USAGE( USAGE_FINGER ), // 0x09, 0x22,
COLLECTION( COLL_PHISICAL, // 0xA1, 0x00,
USAGE( USAGE_TOUCH ), // 0x09, 0x42,
USAGE( USAGE_IN_RANGE ), // 0x09, 0x32,
LOGICAL_MINMAX( 0, 1), // 0x15, 0x00, 0x25, 0x01,
REPORT_FMT( 1, 2 ), // 0x75, 0x01, 0x95, 0x02,
INPUT_HID( HID_VAR | HID_DATA | HID_ABS ), // 0x91, 0x02,
REPORT_FMT( 1, 6 ), // 0x75, 0x01, 0x95, 0x06,
INPUT_HID( HID_CONST ), // 0x81, 0x01,
USAGE_PAGE( USAGEPAGE_GENERIC ), //0x05, 0x01,
USAGE( USAGE_POINTER ), // 0x09, 0x01,
COLLECTION( COLL_PHISICAL, // 0xA1, 0x00,
USAGE( USAGE_X ), // 0x09, 0x30,
USAGE( USAGE_Y ), // 0x09, 0x31,
LOGICAL_MINMAX16( 0, 10000 ), //0x16, 0x00, 0x00, 0x26, 0x10, 0x27,
REPORT_FMT( 16, 2 ), // 0x75, 0x10, 0x95, 0x02,
INPUT_HID( HID_VAR | HID_ABS | HID_DATA), // 0x91, 0x02,
)
)
)
};
åè¿°ã®ãã£ãŒã«ãã«å ããŠãREPORT_IDãªã©ã®è峿·±ããã£ãŒã«ãããããŸããã³ã¡ã³ãããæãããªããã«ãç§ãã¡ã®ããã€ã¹ã¯è€åã§ããããããã¹ãã¯åä¿¡ããããŒã¿ãäœããã®æ¹æ³ã§æ±ºå®ããå¿ èŠããããŸãããã®ããã«ã¯ããã®ãã£ãŒã«ããå¿ èŠã§ãã
ãããŠãç§ã泚ç®ããããã1ã€ã®ãã£ãŒã«ãã¯ãOUTPUT_HIDã§ããååã瀺ãããã«ãã¬ããŒãã®åä¿¡ïŒINïŒã§ã¯ãªããéä¿¡ïŒOUTïŒãæ åœããŸããããŒããŒãã»ã¯ã·ã§ã³ã«ãããCapsLockãNumLockãScrollLockã€ã³ãžã±ãŒã¿ãŒãããã³2ã€ã®ãšããŸããã¯ãªã€ã³ãžã±ãŒã¿ãŒïŒComposeïŒÃ¡ãµããŸãã¯ãªã©ã®ç¬èªã®ãã¿ã³ãæããªãæåãå ¥åããããã®ãã©ã°ïŒãšKanaïŒè±¡åœ¢æåãå ¥åããïŒïŒã«ã€ããŠèª¬æããŸãã ãå®éããã®åéã®ããã«ãOUTãã€ã³ããéå§ããŸããããã®ãã³ãã©ãŒã§ãCapsLockã€ã³ãžã±ãŒã¿ãŒãšNumLockã€ã³ãžã±ãŒã¿ãŒãç¹ç¯ããå¿ èŠããããã©ããã確èªããŸããããŒãã«ã¯ãã€ãªãŒãã2ã€ã ããããé ç·ãããŠããŸãã
ããŒã¿äº€æã«é¢é£ãã3çªç®ã®ãã£ãŒã«ãã§ããFEATURE_HIDããããæåã®äŸã§äœ¿çšããŸããã INPUTãšOUTPUTãã€ãã³ãã®éä¿¡ãç®çãšããŠããå ŽåãFEATUREã¯èªã¿åããŸãã¯æžã蟌ã¿ãå¯èœãªç¶æ ã§ãã確ãã«ãããã¯å°çšã®ãšã³ããã€ã³ãã§ã¯ãªããé©åãªèŠæ±ã«ãã£ãŠéåžžã®ep0ãä»ããŠè¡ãããŸãã
èšè¿°åãããèŠããšãã¬ããŒãã®æ§é ã埩å ã§ããŸããããæ£ç¢ºã«ã¯ã2ã€ã®ã¬ããŒãïŒ
struct{
uint8_t report_id; //1
union{
uint8_t modifiers;
struct{
uint8_t lctrl:1; //left control
uint8_t lshift:1;//left shift
uint8_t lalt:1; //left alt
uint8_t lgui:1; //left gui. hyper, winkey
uint8_t rctrl:1; //right control
uint8_t rshift:1;//right shift
uint8_t ralt:1; //right alt
uint8_t rgui:1; //right gui
};
};
uint8_t reserved; //
uint8_t keys[6]; //
}__attribute__((packed)) report_kbd;
struct{
uint8_t report_id; //2
union{
uint8_t buttons;
struct{
uint8_t touch:1; //
uint8_t inrange:1; //
uint8_t reserved:6;// 1
};
};
uint16_t x;
uint16_t y;
}__attribute__((packed)) report_tablet;
ãŸããããŒãäžã®ãã¿ã³ãæŒããŠãéãããŸããå®å šãªããã€ã¹ã§ã¯ãªããå®è£ ã®äŸãæžããŠããã ããªã®ã§ãéè®ãªæ¹æ³ã§ãããè¡ããŸããæåã¯ããŒããæŒããã2çªç®ã¯ãè§£æŸããããšãã2ã€ã®ã¬ããŒããéä¿¡ããŸããããã«ãã¡ãã»ãŒãžéã«å€§ããªãã°ããããé å»¶ããããŸãã ããªãªãŒã¹ããããããŒã䜿çšããŠã¬ããŒããéä¿¡ããªãå Žåãã·ã¹ãã ã¯ããŒããŸã æŒãããŠãããšèŠãªãããããç¹°ãè¿ããŸããåœç¶ã®ããšãªãããå¹çãå®å šæ§ã«ãåé¡ã¯ãããŸãããããã¹ãã«ã¯åé¡ãããŸããããããããå¥ã®çæãªãã§ ïŒæ§é ã®ãµã€ãºã¯ãèšè¿°åã«èšè¿°ãããŠãããã®ãšäžèŽããå¿ èŠããããŸããäžèŽããªãå ŽåãWindowsã¯ãæ§é ããäœãæ±ããŠããã®ããçè§£ããŠããªãããã«èŠããããŸãããã€ãã®ããã«ãLinuxã¯ãã®ãããªãšã©ãŒãç¡èŠããäœãèµ·ãããªãã£ããã®ããã«åäœããŸãã
ãã¹ãäžã«ãé¢çœãå¯äœçšã«ééããŸãããWindows7ã§ã¯ããã¿ããã¹ã¯ãªãŒã³ããã¯ãªãã¯ãããšãææžããŠã£ã³ããŠããããã¢ããããŸããç§ã¯ãã®æ©èœã«ã€ããŠç¥ããŸããã§ããã
宿ããããã€ã¹ãããå Žå
...ãããŠç§ã¯ãããå åŽããèŠãããšæããŸãããŸã第äžã«ããã¡ãããç§ãã¡ã¯ãéåžžã®ãŠãŒã¶ãŒã§ããConfigurationDescriptorããã§ãå¯èœã§ãã
lsusb -v -d <VID:PID>
HIDèšè¿°åã®å Žåãã«ãŒããããããè¯ãæ¹æ³ãèŠã€ããããŸããã§ããïŒãããŠæ¢ããŸããã§ããïŒã
cat /sys/kernel/debug/hid/<address>/rdes
å®å šãæãããã«ãä»ã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§åæ§ã®ãã®ã調ã¹ãæ¹æ³ãããã«è¿œå ãã䟡å€ããããŸããããããç§ã«ã¯é¢é£ããç¥èããããŸãããå€å圌ãã¯ã³ã¡ã³ãã§ããªãã«èšãã§ãããããã¡ããããµãŒãããŒãã£ã®ãœãããŠã§ã¢ãã€ã³ã¹ããŒã«ããªãããšãæãŸããã§ãã
çµè«
å®éããããç§ãHIDã§æãäžãããã¹ãŠã§ããæ¢è£œã®èšè¿°åãèªã¿åããåæã«è€æ°ã®ããã€ã¹ããšãã¥ã¬ãŒãããã¿ãã¬ããå ¥åãå®è£ ããæ¹æ³ãåŠã¶ããã®æå°éã®èšç»ãå®äºããŸãããããŠãåæã«å²ã蟌ã¿ãã€ã³ãã®å²åŠãèæ ®ãããŸããã
æªãææã®ããã«ãUSB-IFèšèšè ããµã€ããåã³å°ç¡ãã«ããããšã«ããå Žåã«åããŠããªããžããªã«å°ããªããã¥ã¡ã³ããæ®ããŸããã