]> git.friedersdorff.com Git - max/tmk_keyboard.git/commitdiff
lufa: Fix for freeze at re/boot time problem
authortmk <hasu@tmk-kbd.com>
Fri, 29 Mar 2019 06:45:20 +0000 (15:45 +0900)
committertmk <hasu@tmk-kbd.com>
Fri, 10 May 2019 00:43:44 +0000 (09:43 +0900)
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

index 991c2719da016d91ebe1fbe11f24eef56010d74b..48034dbeab18ef9af9a668db43d740406be9e6c2 100644 (file)
@@ -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
 }