From d9c100ecf76107c4ea8dc5f245bbfc876f095a31 Mon Sep 17 00:00:00 2001 From: tmk Date: Wed, 5 Jul 2023 19:03:49 +0900 Subject: [PATCH] lufa: Fix keyboard protocol on bus reset #763 Keyboard can be set as Boot protocol by BIOS/UEFI/GRUB then bus reset occurs before OS boots up. OS(at least Windows10,11/Ubuntu23.04) expects device works on Report protocol. Note that OS does not send SetProtocol(Report) here. Device state should be initialized properly on bus reset. https://github.com/tmk/tmk_keyboard/issues/763 --- tmk_core/protocol/lufa/lufa.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index ec78e49a..c8a008d9 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -41,6 +41,7 @@ #include "host_driver.h" #include "keyboard.h" #include "action.h" +#include "action_util.h" #include "led.h" #include "sendchar.h" #include "ringbuf.h" @@ -73,7 +74,7 @@ uint8_t keyboard_idle = 0; /* 0: Boot Protocol, 1: Report Protocol(default) */ uint8_t keyboard_protocol = 1; static uint8_t keyboard_led_stats = 0; -static report_keyboard_t keyboard_report_sent; +static report_keyboard_t keyboard_report_sent = (report_keyboard_t){}; #endif #ifdef MOUSE_ENABLE @@ -305,6 +306,19 @@ void EVENT_USB_Device_Reset(void) #ifdef TMK_LUFA_DEBUG print("[R]"); #endif + +// reset to initial state: protocol to Report(default) +#ifndef NO_KEYBOARD + keyboard_protocol = 1; + keyboard_idle = 0; + keyboard_led_stats = 0; + keyboard_report_sent = (report_keyboard_t){}; + // keyboard_report keys/bits part is not compatible between Boot and Report protocol + clear_keys(); +#endif +#ifdef MOUSE_ENABLE + mouse_protocol = 1; +#endif } void EVENT_USB_Device_Suspend()