aboutsummaryrefslogtreecommitdiff
path: root/tmk_core/protocol
diff options
context:
space:
mode:
authorJoakim Tufvegren <jocke@barbanet.com>2021-08-03 23:39:34 +0200
committerGitHub <noreply@github.com>2021-08-04 07:39:34 +1000
commit982b782ce30e421f2ad3034bc86efdec58c2ea88 (patch)
treeef5fbec7bc0bcd407b1d044f8e1aab91cb0521ef /tmk_core/protocol
parent1409b368517a8ce9af1320acc75f7a8fbcdfca18 (diff)
downloadqmk_firmware-982b782ce30e421f2ad3034bc86efdec58c2ea88.tar.gz
qmk_firmware-982b782ce30e421f2ad3034bc86efdec58c2ea88.zip
Trigger a wakeup after USB Reset on ChibiOS. (#12831)
After a USB Reset event the device must, according to the spec wake up from any suspend state, so the Configured event that arrives afterwards should be interpreted as an implicit wakeup.
Diffstat (limited to 'tmk_core/protocol')
-rw-r--r--tmk_core/protocol/chibios/usb_main.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c
index 441cfab97..e5edd74dc 100644
--- a/tmk_core/protocol/chibios/usb_main.c
+++ b/tmk_core/protocol/chibios/usb_main.c
@@ -415,14 +415,18 @@ static inline void usb_event_wakeup_handler(void) {
415#endif /* SLEEP_LED_ENABLE */ 415#endif /* SLEEP_LED_ENABLE */
416} 416}
417 417
418bool last_suspend_state = false;
419
418void usb_event_queue_task(void) { 420void usb_event_queue_task(void) {
419 usbevent_t event; 421 usbevent_t event;
420 while (usb_event_queue_dequeue(&event)) { 422 while (usb_event_queue_dequeue(&event)) {
421 switch (event) { 423 switch (event) {
422 case USB_EVENT_SUSPEND: 424 case USB_EVENT_SUSPEND:
425 last_suspend_state = true;
423 usb_event_suspend_handler(); 426 usb_event_suspend_handler();
424 break; 427 break;
425 case USB_EVENT_WAKEUP: 428 case USB_EVENT_WAKEUP:
429 last_suspend_state = false;
426 usb_event_wakeup_handler(); 430 usb_event_wakeup_handler();
427 break; 431 break;
428 default: 432 default:
@@ -464,6 +468,9 @@ static void usb_event_cb(USBDriver *usbp, usbevent_t event) {
464 qmkusbConfigureHookI(&drivers.array[i].driver); 468 qmkusbConfigureHookI(&drivers.array[i].driver);
465 } 469 }
466 osalSysUnlockFromISR(); 470 osalSysUnlockFromISR();
471 if (last_suspend_state) {
472 usb_event_queue_enqueue(USB_EVENT_WAKEUP);
473 }
467 return; 474 return;
468 case USB_EVENT_SUSPEND: 475 case USB_EVENT_SUSPEND:
469 usb_event_queue_enqueue(USB_EVENT_SUSPEND); 476 usb_event_queue_enqueue(USB_EVENT_SUSPEND);