From 8bcddd24f7320344aba9c9e757be2a7d516f4faa Mon Sep 17 00:00:00 2001 From: Jun Wako Date: Sat, 17 Oct 2015 15:28:21 +0900 Subject: [PATCH] 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. --- tmk_core/protocol/chibios/usb_main.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) 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; }