From 993a9b02f77eda8b06cf096f345ad3f35fafc7ba Mon Sep 17 00:00:00 2001 From: tmk Date: Fri, 29 Mar 2019 15:45:20 +0900 Subject: [PATCH] lufa: Fix for freeze at re/boot time problem Calling led_set() in ISR can cause the problem. With converter especially, led_set() can take long time and USB can be stuck in the end. USB-USB converter freezes occasionally when computer power up or reboot. https://geekhack.org/index.php?topic=69169.msg2740179#msg2740179 This is also related to suspend/wakeup issue #386. --- tmk_core/protocol/lufa/lufa.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index 991c2719..48034dbe 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -697,12 +697,12 @@ static uint8_t _led_stats = 0; __attribute__((weak)) void hook_usb_suspend_entry(void) { - // Turn LED off to save power - // Set 0 with putting aside status before suspend and restore - // it after wakeup, then LED is updated at keyboard_task() in main loop + // Turn off LED to save power and keep its status to resotre it later. + // LED status will be updated by keyboard_task() in main loop hopefully. _led_stats = keyboard_led_stats; keyboard_led_stats = 0; - led_set(keyboard_led_stats); + + // Calling long task here can prevent USB state transition matrix_clear(); clear_keyboard(); @@ -731,10 +731,8 @@ void hook_usb_wakeup(void) sleep_led_disable(); #endif - // Restore LED status - // BIOS/grub won't recognize/enumerate if led_set() takes long(around 40ms?) - // Converters fall into the case and miss wakeup event(timeout to reply?) in the end. - //led_set(host_keyboard_leds()); - // Instead, restore stats and update at keyboard_task() in main loop + // Restore LED status and update at keyboard_task() in main loop keyboard_led_stats = _led_stats; + + // Calling long task here can prevent USB state transition } -- 2.46.2