å°ãåãèšäº
ãPastilda-ãªãŒãã³ããŒããŠã§ã¢ãã¹ã¯ãŒããããŒãžã£ãŒããå
¬éãããŸãã ã ãã®ãããžã§ã¯ãã¯å
¬éãããŠããã®ã§ãèšèšããã»ã¹ãçŽé¢ããŠããã¿ã¹ã¯ãçŽé¢ããŠããå°é£ã«ã€ããŠå°ããªã¡ã¢ãæžããšé¢çœããšå€æããŸããã
Pastildaã®äž»ãªæ¬è³ªã¯ãããŒããŒããšPCã®éã®äžçš®ã®ã¢ããã¿ãŒã§ããããšã§ãã ãããã£ãŠã圌女ã¯æ¬¡ã®ããšãã§ããã¯ãã§ãã
- æ¥ç¶ããããŒããŒãã®USBãã¹ãã«ãªãã
- å®éã®ããŒããŒãããã¡ãã»ãŒãžããªãã€ã¬ã¯ãããããã®PCã®ããŒããŒãããŸãã¯ããŒããŒããã®ãã®
- ãã£ã¹ã¯ãã©ã€ãã§ããããããã¹ã¯ãŒãããŒã¿ããŒã¹ã人éã«åªãã圢åŒã§ç·šéã§ããŸãã
ãã®æ©èœã¯ãããžã§ã¯ãã®éªšåã§ãããããæåã®ã¡ã¢ã¯åœŒã«æ§ããããŸãã
USBãã¹ãã®å®è£
ãã®ããããŸããUSBããã€ã¹ã«æ¥ç¶ãããããŒããŒããèªèããŠéä¿¡ã§ããããã«ãUSBããã€ã¹ã«ãã¹ããå®è£
ããå¿
èŠããããŸããã ç§ã®ä»äºã§ã¯Eclipse + GNU ARM Eclipse + libopencm3ãã³ãã«ã䜿çšããŠãããããæ¢è£œã§ã§ããã°libopencm3ã©ã€ãã©ãªã䜿çšããŠäœæããããã®ãæ¢ããŠããŸããã ç§ã®æ€çŽ¢ã¯æåãããšä¿¡ããªãæåŸã®ç¬éãŸã§ãç§ã®æ¬²æ±ã¯éåžžã«å€ªã£ãŠããŸããã ããããå¶æ¥æ¥ã®çµããã«ãã€ã³ã¿ãŒããããäžã«ã¹ã¯ããŒã«ããŠãç§ã¯çªç¶
ããã«åºäŒããŸã
ã ã libusbhostïŒ ã»ããšïŒ ãŸããlibopencm3 usbã«åºã¥ããŠèšè¿°ããããã¹ãã ãã§ãªãããããžã§ã¯ãã§äœ¿çšããããšã«ããSTM32F4ã®äžã§ãèšè¿°ãããŸããã äžè¬ã«ãæã¯åæããç§ã®åã³ã¯ééããããŸããã§ããã ãšããã§ããã®ãããžã§ã¯ãã¯libopencm3ã®äžéšãšããŠäœæãããããšãå€æããŸããããã©ã€ãã©ãªã«ã¯æ±ºããŠè¿œå ãããŸããã§ããã
ã©ã€ãã©ãªãšããŠãç§ã¯libusbhostãã³ã³ãã€ã«ããŸããã§ãããå¿
èŠãªãœãŒã¹ãååŸããããŒããŒãçšã®ãã©ã€ããŒãäœæããäžè¬çã«ã¯ãã¹ãŠãé§åããŸããã ãããããŸãæåã«ã
libusbhostãã次ã®ãã¡ã€ã«ãååŸããŸããã
- usbh_device_driver.h
- usbh_config.h
- usbh_hubbedã[ch]
- usbh_lld_stm32f4ã[ch]
ãŸããusart_helpersã[Ch]ãã¡ã€ã«ãããããã®å©ããåããŠãããã€ã¹ãããã¹ãã«éããããã¹ãŠã®ã¡ãã»ãŒãžãšå€ãã®ç°ãªããããã°æ
å ±ãUARTãä»ããŠç«¯æ«ã«éä¿¡ããããšãã§ããŸããã ãã®æ©èœãè©ŠããŸãããããããžã§ã¯ãããåé€ããŸããã
usbh_driver_hid_mouseã[Ch]ãšåæ§ã«ãããŒããŒãçšã®ãã©ã€ããŒãäœæããŸããïŒusbh_driver_hid_kbdã[Ch]ïŒã
次ã«ãåçŽãªã¯ã©ã¹ãå®è£
ããããã¹ãã§åäœããŸãã
USBãã¹ãã¯ã©ã¹constexpr uint8_t USB_HOST_TIMER_NUMBER = 6; constexpr uint16_t USB_HOST_TIMER_PRESCALER = (8400 - 1); constexpr uint16_t USB_HOST_TIMER_PERIOD = (65535); typedef void (*redirect)(uint8_t *data, uint8_t len); typedef void (*control_interception)(); static redirect redirect_callback; static control_interception control_interception_callback; class USB_host { public: USB_host(redirect redirect_callback, control_interception control_interception_callback); void poll(); static void kbd_in_message_handler(uint8_t data_len, const uint8_t *data); static constexpr hid_kbd_config_t kbd_config = { &kbd_in_message_handler }; static constexpr usbh_dev_driver_t *device_drivers[] = { (usbh_dev_driver_t *)&usbh_hid_kbd_driver }; private: TIMER_ext *_timer; void timer_setup(); uint32_t get_time_us(); void oth_hs_setup(); };
ããã§ã¯ãã¹ãŠãéæã§ãã ããã€ã¹ã¯ããŒããŒãããªãã¹ã³ããäžé£ã®ç¹å¥ãªããŒã®çµã¿åããããã°ã€ã³ããã³ãã¹ã¯ãŒãéžæã¢ãŒãã«å
¥ãã®ãåŸ
ã€å¿
èŠããããŸãã ããã¯ãããŒããŒãå²ã蟌ã¿ãã³ãã©ãŒkbd_in_message_handlerïŒuint8_t data_lenãconst uint8_t * dataïŒã§çºçããŸãã ã€ãã³ãã®éçºã«ã¯2ã€ã®ãªãã·ã§ã³ããããŸãã
- çµã¿åããããªãå Žåã¯ãããŒããŒãããããã«ã¡ãã»ãŒãžãPCã«ã¹ãããããå¿
èŠããããŸãã ãã®ã€ãã³ããåŠçããããã«ã_redirect_callbacké¢æ°ãã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ãããŸããã
- çµã¿åãããæŒãããå Žåããã°ã€ã³ããã³ãã¹ã¯ãŒãéžæã¢ãŒãã«åãæ¿ããããšãã·ã¹ãã ã«éç¥ããå¿
èŠããããŸãããããã£ãŠãããŒããŒãããPCã«ã¡ãã»ãŒãžããããŒããã£ã¹ãããªããªããŸããã ããã§ãããã€ã¹èªäœãããŒããŒãã«ãªããå®éã®ããŒããŒãããã®ã¡ãã»ãŒãžãããã€ã¹ãžã®ã³ãã³ããšããŠè§£éãããããã«ãªããŸããã ãã®ãããªã€ãã³ããåŠçããããã«ã_control_interception_callbacké¢æ°ãã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ãããŸããã
è€åUSBããã€ã¹ã®å®è£
次ã«ãããã€ã¹ãããŒãžã£ãŒã«ããã€ã¹ãããŒããŒããšãã£ã¹ã¯ãã©ã€ãã®äž¡æ¹ãšããŠè¡šç€ºããå¿
èŠããããŸããã ããã§ãèšè¿°åã®ãã¹ãŠã®éæ³=ïŒ
ãã®ããã¥ã¡ã³ãã®ç¬¬9ç« ã§ãUSBããã€ã¹ãã¬ãŒã ã¯ãŒã¯ã«ã€ããŠè©³ãã説æããŸãã ãã®ç« ã¯éåžžã«æ³šææ·±ãèªãã§ãããã«å¿ããŠããã€ã¹èšè¿°åã説æããå¿
èŠããããŸãã ç§ã®å Žåã次ã®ããšãèµ·ãããŸããã
è€åUSBèšè¿°å static constexpr uint8_t keyboard_report_descriptor[] = { 0x05, 0x01, 0x09, 0x06, 0xA1, 0x01, 0x05, 0x07, 0x19, 0xE0, 0x29, 0xE7, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x08, 0x81, 0x02, 0x95, 0x01, 0x75, 0x08, 0x81, 0x01, 0x95, 0x03, 0x75, 0x01, 0x05, 0x08, 0x19, 0x01, 0x29, 0x03, 0x91, 0x02, 0x95, 0x05, 0x75, 0x01, 0x91, 0x01, 0x95, 0x06, 0x75, 0x08, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x05, 0x07, 0x19, 0x00, 0x2A, 0xFF, 0x00, 0x81, 0x00, 0xC0 }; static constexpr char usb_strings[][30] = { "Third Pin", "Composite Device", "Pastilda" }; static constexpr struct usb_device_descriptor dev = { USB_DT_DEVICE_SIZE,
keyboard_report_descriptorã¯
ããã¥ãŒãã³ã€ã³ã¿ãŒãã§ã€ã¹ããã€ã¹ïŒHIDïŒã®ããã€ã¹ã¯ã©ã¹å®çŸ© ãä»é²E.6ã¬ããŒãèšè¿°åïŒããŒããŒãïŒããååŸãããŸããã æ£çŽãªãšãããç§ã¯ã¬ããŒãã®æ§é ã«ã€ããŠããŸãç解ããŠããŸããã§ãããç§ã¯ããã¥ã¡ã³ããä¿¡ããŠããŸããïŒäžè¬çã«ãããã«ç¹å¥ãªæ³šæãæãå¿
èŠãããããã€ãã®ãã€ã³ãããããŸãïŒ
- usb_config_descriptor ïŒ bNumInterfacesãã£ãŒã«ãã¯ãå®éã«å®è£
ãããŠããã€ã³ã¿ãŒãã§ã€ã¹ãšåãæ°ãåæ ããå¿
èŠããããŸãã ç§ãã¡ã®å Žåã2ã€ïŒHIDãšMSD
- usb_interface_descriptor ïŒ bInterfaceNumberãã£ãŒã«ãã¯ã€ã³ã¿ãŒãã§ã€ã¹ã®çªå·ã瀺ããŸãããã«ãŠã³ãã¯ãŒãããå§ãŸããããæåã®ã€ã³ã¿ãŒãã§ã€ã¹ã®çªå·ã¯0ã§ãã
ããã¯ã説æçãªèŠ³ç¹ããããããããã¹ãŠã§ãã èšè¿°åãã©ã€ãã©ãªãŒã«ã©ã®ããã«èšè¿°ãããŠãããã«æ³šæãããããããŸããïŒãã®èšè¿°ã¯usbstd.hãã¡ã€ã«ã«ãããŸãïŒã ããã¥ã¡ã³ãã«ã¯ãã¹ãŠãæ確ã«èšèŒãããŠããŸãã ãè€åããã€ã¹ãã©ã®ããã«èª¬æã§ããŸããïŒããªã©ã®è³ªåããªãã£ããããããã«ããã¿ã¹ã¯ã倧å¹
ã«ç°¡çŽ åããããšæãããŸãã ãã¹ãŠãããã«æããã«ãªããŸããã
è€åããã€ã¹ãæäœããããã«ãUSB_compositeã¯ã©ã¹ã以äžã«èšè¿°ããŸããã
ã³ã³ããžããUSBã¯ã©ã¹ extern "C" void USB_OTG_IRQ(); int USB_control_callback(usbd_device *usbd_dev, struct usb_setup_data *req, uint8_t **buf, uint16_t *len, usbd_control_complete_callback *complete); void USB_set_config_callback(usbd_device *usbd_dev, uint16_t wValue); static uint8_t keyboard_protocol = 1; static uint8_t keyboard_idle = 0; static uint8_t keyboard_leds = 0; class USB_composite { public: uint8_t usbd_control_buffer[500]; UsbCompositeDescriptors *descriptors; uint8_t usb_ready = 0; usbd_device *my_usb_device; USB_composite(const uint32_t block_count, int (*read_block)(uint32_t lba, uint8_t *copy_to), int (*write_block)(uint32_t lba, const uint8_t *copy_from)); void usb_send_packet(const void *buf, int len); int hid_control_request(usbd_device *usbd_dev, struct usb_setup_data *req, uint8_t **buf, uint16_t *len, void (**complete)(usbd_device *usbd_dev, struct usb_setup_data *req)); void hid_set_config(usbd_device *usbd_dev, uint16_t wValue); };
ãã®ã¯ã©ã¹ã®ããŒã¯2ã€ã®é¢æ°ã§ãã
- hid_control_requesté¢æ°ã¯ ã ãã¹ãã£ã«ãããã¹ãïŒãã®å Žåããã¹ãã¯PCïŒãšããŒããŒããšããŠéä¿¡ããããã«å¿
èŠã§ãã ã¯ã©ã¹å€ã§ã¯ããã®é¢æ°ã¯USB_control_callbackãä»ããŠåŒã³åºãããŸãã
- hid_set_configé¢æ°ã¯ ããšã³ããã€ã³ããæ§æããåã®æ®µèœã§èª¬æããUSB_control_callbackãç»é²ããããã«å¿
èŠã§ãã ã¯ã©ã¹å€ã§ã¯ããã®é¢æ°ã¯USB_set_config_callbackãä»ããŠåŒã³åºãããŸãã
以äžã¯ãå®è£
ã®ãªãã·ã§ã³ã§ãã
ã³ãŒã«ãã㯠int USB_composite::hid_control_request(usbd_device *usbd_dev, struct usb_setup_data *req, uint8_t **buf, uint16_t *len, void (**complete)(usbd_device *usbd_dev, struct usb_setup_data *req)) { (void)complete; (void)usbd_dev; if ((req->bmRequestType & USB_REQ_TYPE_DIRECTION) == USB_REQ_TYPE_IN) { if ((req->bmRequestType & USB_REQ_TYPE_TYPE) == USB_REQ_TYPE_STANDARD) { if (req->bRequest == USB_REQ_GET_DESCRIPTOR) { if (req->wValue == 0x2200) { *buf = (uint8_t *)descriptors->keyboard_report_descriptor; *len = sizeof(descriptors->keyboard_report_descriptor); return (USBD_REQ_HANDLED); } else if (req->wValue == 0x2100) { *buf = (uint8_t *)&descriptors->keyboard_hid_function; *len = sizeof(descriptors->keyboard_hid_function); return (USBD_REQ_HANDLED); } return (USBD_REQ_NOTSUPP); } } else if ((req->bmRequestType & USB_REQ_TYPE_TYPE) == USB_REQ_TYPE_CLASS) { if (req->bRequest == HidRequest::GET_REPORT) { *buf = (uint8_t*)&boot_key_report; *len = sizeof(boot_key_report); return (USBD_REQ_HANDLED); } else if (req->bRequest == HidRequest::GET_IDLE) { *buf = &keyboard_idle; *len = sizeof(keyboard_idle); return (USBD_REQ_HANDLED); } else if (req->bRequest == HidRequest::GET_PROTOCOL) { *buf = &keyboard_protocol; *len = sizeof(keyboard_protocol); return (USBD_REQ_HANDLED); } return (USBD_REQ_NOTSUPP); } } else { if ((req->bmRequestType & USB_REQ_TYPE_TYPE) == USB_REQ_TYPE_CLASS) { if (req->bRequest == HidRequest::SET_REPORT) { if (*len == 1) { keyboard_leds = (*buf)[0]; } return (USBD_REQ_HANDLED); } else if (req->bRequest == HidRequest::SET_IDLE) { keyboard_idle = req->wValue >> 8; return (USBD_REQ_HANDLED); } else if (req->bRequest == HidRequest::SET_PROTOCOL) { keyboard_protocol = req->wValue; return (USBD_REQ_HANDLED); } } return (USBD_REQ_NOTSUPP); } return (USBD_REQ_NEXT_CALLBACK); } int USB_control_callback(usbd_device *usbd_dev, struct usb_setup_data *req, uint8_t **buf, uint16_t *len, usbd_control_complete_callback *complete) { return(usb_pointer->hid_control_request(usbd_dev, req, buf, len, complete)); } void USB_composite::hid_set_config(usbd_device *usbd_dev, uint16_t wValue) { (void)wValue; (void)usbd_dev; usbd_ep_setup(usbd_dev, Endpoint::E_KEYBOARD, USB_ENDPOINT_ATTR_INTERRUPT, 8, 0); usbd_register_control_callback(usbd_dev, USB_REQ_TYPE_INTERFACE, USB_REQ_TYPE_RECIPIENT, USB_control_callback ); } void USB_set_config_callback(usbd_device *usbd_dev, uint16_t wValue) { usb_pointer->hid_set_config(usbd_dev, wValue) ; }
éåžžãcontrol_requestããã³set_configé¢æ°ã¯ãããã€ã¹ããšã«æ瀺çã«èšè¿°ããå¿
èŠããããŸãã ãã ãããã®ã«ãŒã«ã«ã¯äŸå€ããããŸãïŒå€§å®¹éèšæ¶è£
眮ã ãã®ãããUSB_Compositeã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãæ±ããŸãã
ãŸããUSB OTG FSã¬ãã°ãåæåããŸãã
GPIO_ext uf_p(PA11); GPIO_ext uf_m(PA12); uf_p.mode_setup(Mode::ALTERNATE_FUNCTION, PullMode::NO_PULL); uf_m.mode_setup(Mode::ALTERNATE_FUNCTION, PullMode::NO_PULL); uf_p.set_af(AF_Number::AF10); uf_m.set_af(AF_Number::AF10);
次ã«ãè€åããã€ã¹ãåæåããäžèšã®USB_set_config_callbackãç»é²ããå²ã蟌ã¿ãæå¹ã«ããå¿
èŠããããŸãã
my_usb_device = usbd_init(&otgfs_usb_driver, &(UsbCompositeDescriptors::dev), &(UsbCompositeDescriptors::config_descr), (const char**)UsbCompositeDescriptors::usb_strings, 3, usbd_control_buffer, sizeof(usbd_control_buffer)); usbd_register_set_config_callback(my_usb_device, USB_set_config_callback); nvic_enable_irq(NVIC_OTG_FS_IRQ);
ããã¯ãããã€ã¹ãããŒãžã£ãŒã§ããã€ã¹ãèªèããã®ã«ååã§ãã
- [USBã³ã³ãããŒã©ãŒ]ã¿ãïŒè€åããã€ã¹ãšããŠã
- ãUSB Mass Storage Deviceããšåãã¿ãã§ã
- ãããŒããŒãHIDããªã©ã®ãããŒããŒããã¿ãã
ãã ãããUSB Mass Storage Deviceãã«ã¯ãããã€ã¹ãæ£åžžã«åäœããŠããªããšããèŠåã衚瀺ãããŸãã åé¡ã¯ãä»ã®USBããã€ã¹ãšã¯ç°ãªããlibopencm3ã©ã€ãã©ãªã®usb_msc.cãã¡ã€ã«ã«èšè¿°ãããŠããusb_msc_inité¢æ°ãä»ããŠã倧容éèšæ¶è£
眮ãå°ãç°ãªã£ãŠåæåãããããšã§ãã MSDã®å Žåãcontrol_requesté¢æ°ãšset_configé¢æ°ãæ瀺çã«èšè¿°ããå¿
èŠã¯ãªãããšãåè¿°ããŸããã ããã¯ãusb_msc_inité¢æ°ããã¹ãŠãè¡ãããã§ãããšã³ããã€ã³ããæ§æãããã¹ãŠã®ã³ãŒã«ããã¯ãç»é²ããŸãã ãããã£ãŠãã³ã³ã¹ãã©ã¯ã¿ããã1è¡è¿œå ããå¿
èŠããããŸãã
usb_msc_init(my_usb_device, Endpoint::E_MASS_STORAGE_IN, 64, Endpoint::E_MASS_STORAGE_OUT, 64, "ThirdPin", "Pastilda", "0.00", block_count, read_block, write_block);
ããã§ãMSDãåæåãããšãã«ãã¡ã¢ãªãæäœããããã®æå°éã®APIãæž¡ãå¿
èŠãããããšãããããŸãã
- block_countïŒã¡ã¢ãªã»ã¯ã¿ãŒã®æ°
- read_blockïŒã»ã¯ã¿ãŒãèªã¿åãããã®é¢æ°ã
- write_blockïŒã»ã¯ã¿ãŒãæžã蟌ãããã®é¢æ°ã
Pastildaã§ã¯ãå€éšãã©ãã·ã¥SST25VF064Cã䜿çšããŸãã ãã®ãããã®ãã©ã€ãã¯ãã¡ãã«ãããŸã ã å°æ¥ããã®ãã©ã€ããŒã«åºã¥ããŠããã¡ã€ã«ã·ã¹ãã ã¯ãã©ãã·ã¥ã«å®è£
ãããŸãã ã»ãšãã©ã®å Žåãç§ã®ååãããã«ã€ããŠè©³çŽ°ã«ããçšåºŠè©³ããæžããŠããŸãã ããããMSDã®åäœããã°ãããã¹ããããã£ãã®ã§ããã¡ã€ã«ã·ã¹ãã ã®èœãæžããŸãã=ïŒ ããã§å«ã¶ããšãã§ããŸã ãã ããããã«ã USB_Compositeã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãè¿œå ãããã®ã§ããããžã§ã¯ããã¢ã»ã³ãã«ããããã€ã¹ããã©ãã·ã¥ããŠããUSBã¹ãã¬ãŒãžããã€ã¹ãã«èŠåã®ããŒã¯ãä»ããŠããªãããšã確èªããããã£ã¹ã¯ããã€ã¹ãã¿ãã§ãThirdPin Pastilda USBããã€ã¹ããèŠã€ããããšãã§ããŸãã ãããŠããã¹ãŠãé 調ã ãšæãããŸãã ãããããªã=ïŒããã«åé¡ããããŸãïŒ
1.ãã£ã¹ã¯ã«ã¢ã¯ã»ã¹ããããšã¯ã§ããŸããã ãããè¡ãããšãããšããã¹ãŠããã³ã°ããæ»ã«ãã³ã³ãã¥ãŒã¿ãŒãéåžžã«æªããªããŸãã
2.ããã€ã¹ããã£ã¹ã¯ãšããŠèªèããã«ã¯ã2å以äžããããŸãã
ãããã®åé¡ãšãå¥åº·ã«å®³ãåãŒããã«ãããã解決ããæ¹æ³ã«ã€ããŠã¯ã
USB倧容éã¹ãã¬ãŒãžããã€ã¹ãšlibopencm3ã§èª¬æããŠããŸãã
ãããŠããããå¥è·¡ïŒ ã¹ããããªã=ïŒããã§ãã¹ãŠãæ©èœããŸãã USBãã¹ããšè€åUSBããã€ã¹ããããŸãã 圌ãã®ä»äºãçµã¿åãããã ãã§ãã
ãã¹ããšè€åããã€ã¹ã®çµã¿åããç§ãã¡ã®ç®æšïŒ
- Ctrl + Shift +ãã®çµã¿åãããæŒããããŸã§ãããŒããŒãããPCãžã¡ãã»ãŒãžããããŒããã£ã¹ãããŸãã
- Ctrl + Shift +ãã®çµã¿åãããæŒããåŸãPastildaã¯ã³ã³ãããŒã«ãååŸããããŒããŒããšããŠã¡ãã»ãŒãžãPCã«éä¿¡ããŸãããã®åŸããããŒããã£ã¹ãã¢ãŒãã«æ»ããåã³çµã¿åãããåŸ
ã¡ãŸãã
ããããã¹ãŠå®è£
ããã³ãŒãã¯ãã¹ãã£ãã¯ã®ããã«ç°¡åã§ãã
App.cpp App *app_pointer; App::App() { app_pointer = this; clock_setup(); systick_init(); _leds_api = new LEDS_api(); _flash = new FlashMemory(); usb_host = new USB_host(redirect, control_interception); usb_composite = new USB_composite(_flash->flash_blocks(), _flash->flash_read, _flash->flash_write); } void App::process() { _leds_api->toggle(); usb_host->poll(); } void App::redirect(uint8_t *data, uint8_t len) { app_pointer->usb_composite->usb_send_packet(data, len); } void App::control_interception() { memset(app_pointer->key, 0, 8); app_pointer->key[2] = KEY_W; app_pointer->key[3] = KEY_O; app_pointer->key[4] = KEY_N; app_pointer->key[5] = KEY_D; app_pointer->key[6] = KEY_E; app_pointer->key[7] = KEY_R; app_pointer->usb_composite->usb_send_packet(app_pointer->key, 8); app_pointer->key[2] = 0; app_pointer->key[3] = 0; app_pointer->key[4] = 0; app_pointer->key[5] = 0; app_pointer->key[6] = 0; app_pointer->key[7] = 0; app_pointer->usb_composite->usb_send_packet(app_pointer->key, 8); app_pointer->key[2] = KEY_SPACEBAR; app_pointer->key[3] = KEY_W; app_pointer->key[4] = KEY_O; app_pointer->key[5] = KEY_M; app_pointer->key[6] = KEY_A; app_pointer->key[7] = KEY_N; app_pointer->usb_composite->usb_send_packet(app_pointer->key, 8); app_pointer->key[2] = 0; app_pointer->key[3] = 0; app_pointer->key[4] = 0; app_pointer->key[5] = 0; app_pointer->key[6] = 0; app_pointer->key[7] = 0; app_pointer->usb_composite->usb_send_packet(app_pointer->key, 8); }
ã³ã³ã¹ãã©ã¯ã¿ãŒã§ãå¿
èŠãªãã®ããã¹ãŠåæåããŸãã
- ç¹æ»
ããLEDã
- ãã©ãã·ã¥ããã£ã¹ã¯äžã®ãã¡ã€ã«ãäœæ/åé€ã§ããŸãã
- ãã¹ãããªãã€ã¬ã¯ãé¢æ°ïŒââçµã¿åããããªãå Žåã®åŠçââïŒããã³control_interceptionïŒçµã¿åãããæŒãããå Žåã®åŠçââïŒãæž¡ããŸãã
- ã¡ã¢ãªã®èªã¿åã/æžã蟌ã¿æ©èœãæž¡ãè€åããã€ã¹ã
ãããŠãããã ãã§ãã éå§ãããããã€ã¹ã®ã¹ã±ã«ãã³ãäœæãããŸããã ãã¡ã€ã«ã·ã¹ãã ã¯ãCtrl + Shift +ãã®çµã¿åãããæŒãããšã§ãããã«ç¢ºå®ããŸãã1è¡ã®ã¡ãã¥ãŒã衚瀺ãããæå·åããããã¹ã¯ãŒãããŒã¿ããŒã¹ããã©ãã·ã¥ã«ä¿åãããŸãã
ã³ã¡ã³ããææ¡ãããã°å¬ããã§ãã
ãããŠããã¡ããã
githubãžã®ãªã³ã¯ã
UPD 06/27/2017ïŒ
- Pastildaãããžã§ã¯ããªããžããªã¯ããã«ç§»åããŸãã ã æè¿ããªãªãŒã¹1.0ãå
¬éãããŸããã
- ãããžã§ã¯ãã®ææ°ãã¥ãŒã¹ã¯ãã¡ãã§ã芧ããã ããŸã ã
- ãããŠã€ãã«ãããžã§ã¯ããµã€ããç«ã¡äžããŸãã ïŒ