From: Jun Wako Date: Sat, 17 Oct 2015 06:28:21 +0000 (+0900) Subject: Fix drop key stroke X-Git-Url: https://git.friedersdorff.com/?a=commitdiff_plain;h=8bcddd24f7320344aba9c9e757be2a7d516f4faa;p=max%2Ftmk_keyboard.git Fix drop key stroke Keyboard report should be checked if its transfer finishs successfully. Otherwise key stroke can be missing when other key event occurs before the last report transfer is done. Boot protocol 10ms interval probably causes this problem in case it receives key events in a row within the period. NKRO protocol suffers less or nothing due to its interval 1ms. --- diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index 619b798b..0fc2f6e3 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -1121,19 +1121,24 @@ void send_keyboard(report_keyboard_t *report) { } osalSysUnlock(); + bool ret; #ifdef NKRO_ENABLE if(keyboard_nkro) { /* NKRO protocol */ usbPrepareTransmit(&USB_DRIVER, NKRO_ENDPOINT, (uint8_t *)report, sizeof(report_keyboard_t)); - osalSysLock(); - usbStartTransmitI(&USB_DRIVER, NKRO_ENDPOINT); - osalSysUnlock(); + do { + osalSysLock(); + ret = usbStartTransmitI(&USB_DRIVER, NKRO_ENDPOINT); + osalSysUnlock(); + } while (ret); } else #endif /* NKRO_ENABLE */ { /* boot protocol */ usbPrepareTransmit(&USB_DRIVER, KBD_ENDPOINT, (uint8_t *)report, KBD_EPSIZE); - osalSysLock(); - usbStartTransmitI(&USB_DRIVER, KBD_ENDPOINT); - osalSysUnlock(); + do { + osalSysLock(); + ret = usbStartTransmitI(&USB_DRIVER, KBD_ENDPOINT); + osalSysUnlock(); + } while (ret); } keyboard_report_sent = *report; }