Browse Source

[Bug] Fix non-functional S3 wakeup / resume from suspense (#19780)

* Update ChibiOS-Contrib for USB suspend fixes

* Remove S3 wakup workaround

ChibiOS OTGv1 driver has a remote wakeup bug that prevents the device to
resume it's operation. 02516cbc24 
introduced a hotfix that forcefully restarted the usb driver as a workaround. 
This workaround broke multiple boards which do not use this driver / 
peripheral. With the update of ChibiOS this hotfix is now obsolete.

* Remove restart_usb_driver overrides

they are no longer necessary as the workaround is not needed anymore
for stm32f4

* Remove unused RP_USB_USE_SOF_INTR defines

The SOF interrupt is enabled dynamically by the RP2040 usb driver
pull/21391/head
Stefan Kerkmann 10 months ago
committed by GitHub
parent
commit
a87c74ebe1
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 14 additions and 47 deletions
  1. +1
    -1
      lib/chibios-contrib
  2. +0
    -1
      platforms/chibios/boards/GENERIC_PROMICRO_RP2040/configs/mcuconf.h
  3. +0
    -1
      platforms/chibios/boards/GENERIC_RP_RP2040/configs/mcuconf.h
  4. +0
    -4
      platforms/chibios/boards/GENERIC_WB32_F3G71XX/board/board.c
  5. +0
    -4
      platforms/chibios/boards/GENERIC_WB32_FQ95XX/board/board.c
  6. +0
    -5
      platforms/chibios/boards/IC_TEENSY_3_1/board/board.c
  7. +1
    -1
      platforms/chibios/boards/PJRC_TEENSY_3_5/board/board.mk
  8. +0
    -7
      platforms/chibios/boards/PJRC_TEENSY_3_5/board/extra.c
  9. +1
    -1
      platforms/chibios/boards/PJRC_TEENSY_3_6/board/board.mk
  10. +0
    -7
      platforms/chibios/boards/PJRC_TEENSY_3_6/board/extra.c
  11. +0
    -1
      platforms/chibios/boards/QMK_PM2040/configs/mcuconf.h
  12. +1
    -0
      platforms/chibios/suspend.c
  13. +9
    -13
      tmk_core/protocol/chibios/chibios.c
  14. +1
    -1
      tmk_core/protocol/lufa/lufa.c

+ 1
- 1
lib/chibios-contrib

@ -1 +1 @@
Subproject commit a224be155ae18d38deccf33a6c1d259b9a5ad8d3
Subproject commit 5d2d95c520a13d2c3e42343f51b18822d63781d6

+ 0
- 1
platforms/chibios/boards/GENERIC_PROMICRO_RP2040/configs/mcuconf.h View File

@ -106,7 +106,6 @@
#define RP_USB_USE_USBD0 TRUE
#define RP_USB_FORCE_VBUS_DETECT TRUE
#define RP_USE_EXTERNAL_VBUS_DETECT FALSE
#define RP_USB_USE_SOF_INTR TRUE
#define RP_USB_USE_ERROR_DATA_SEQ_INTR FALSE
#endif /* MCUCONF_H */

+ 0
- 1
platforms/chibios/boards/GENERIC_RP_RP2040/configs/mcuconf.h View File

@ -106,7 +106,6 @@
#define RP_USB_USE_USBD0 TRUE
#define RP_USB_FORCE_VBUS_DETECT TRUE
#define RP_USE_EXTERNAL_VBUS_DETECT FALSE
#define RP_USB_USE_SOF_INTR TRUE
#define RP_USB_USE_ERROR_DATA_SEQ_INTR FALSE
#endif /* MCUCONF_H */

+ 0
- 4
platforms/chibios/boards/GENERIC_WB32_F3G71XX/board/board.c View File

@ -80,7 +80,3 @@ void __early_init(void) {
void boardInit(void) {
}
void restart_usb_driver(USBDriver *usbp) {
// Do nothing. Restarting the USB driver on these boards breaks it.
}

+ 0
- 4
platforms/chibios/boards/GENERIC_WB32_FQ95XX/board/board.c View File

@ -80,7 +80,3 @@ void __early_init(void) {
void boardInit(void) {
}
void restart_usb_driver(USBDriver *usbp) {
// Do nothing. Restarting the USB driver on these boards breaks it.
}

+ 0
- 5
platforms/chibios/boards/IC_TEENSY_3_1/board/board.c View File

@ -144,8 +144,3 @@ void __early_init(void) {
* @todo Add your board-specific code, if any.
*/
void boardInit(void) {}
void restart_usb_driver(USBDriver *usbp) {
// Do nothing. Restarting the USB driver on these boards breaks it.
}

+ 1
- 1
platforms/chibios/boards/PJRC_TEENSY_3_5/board/board.mk View File

@ -1,7 +1,7 @@
include $(CHIBIOS_CONTRIB)/os/hal/boards/PJRC_TEENSY_3_5/board.mk
# List of all the board related files.
BOARDSRC += $(BOARD_PATH)/board/extra.c
BOARDSRC +=
# Required include directories
BOARDINC += $(BOARD_PATH)/board


+ 0
- 7
platforms/chibios/boards/PJRC_TEENSY_3_5/board/extra.c View File

@ -1,7 +0,0 @@
#include <hal.h>
void restart_usb_driver(USBDriver *usbp) {
// Do nothing. Restarting the USB driver on the Teensy 3.6 breaks it,
// resulting in a keyboard which can wake up a PC from Suspend-to-RAM, but
// does not actually produce any keypresses until you un-plug and re-plug.
}

+ 1
- 1
platforms/chibios/boards/PJRC_TEENSY_3_6/board/board.mk View File

@ -1,7 +1,7 @@
include $(CHIBIOS_CONTRIB)/os/hal/boards/PJRC_TEENSY_3_6/board.mk
# List of all the board related files.
BOARDSRC += $(BOARD_PATH)/board/extra.c
BOARDSRC +=
# Required include directories
BOARDINC += $(BOARD_PATH)/board


+ 0
- 7
platforms/chibios/boards/PJRC_TEENSY_3_6/board/extra.c View File

@ -1,7 +0,0 @@
#include <hal.h>
void restart_usb_driver(USBDriver *usbp) {
// Do nothing. Restarting the USB driver on the Teensy 3.6 breaks it,
// resulting in a keyboard which can wake up a PC from Suspend-to-RAM, but
// does not actually produce any keypresses until you un-plug and re-plug.
}

+ 0
- 1
platforms/chibios/boards/QMK_PM2040/configs/mcuconf.h View File

@ -106,7 +106,6 @@
#define RP_USB_USE_USBD0 TRUE
#define RP_USB_FORCE_VBUS_DETECT TRUE
#define RP_USE_EXTERNAL_VBUS_DETECT FALSE
#define RP_USB_USE_SOF_INTR TRUE
#define RP_USB_USE_ERROR_DATA_SEQ_INTR FALSE
#endif /* MCUCONF_H */

+ 1
- 0
platforms/chibios/suspend.c View File

@ -42,6 +42,7 @@ void suspend_wakeup_init(void) {
clear_keys();
#ifdef MOUSEKEY_ENABLE
mousekey_clear();
mousekey_send();
#endif /* MOUSEKEY_ENABLE */
#ifdef PROGRAMMABLE_BUTTON_ENABLE
programmable_button_clear();


+ 9
- 13
tmk_core/protocol/chibios/chibios.c View File

@ -180,28 +180,24 @@ void protocol_post_init(void) {
}
void protocol_pre_task(void) {
usb_event_queue_task();
#if !defined(NO_USB_STARTUP_CHECK)
if (USB_DRIVER.state == USB_SUSPENDED) {
print("[s]");
dprintln("suspending keyboard");
while (USB_DRIVER.state == USB_SUSPENDED) {
/* Do this in the suspended state */
suspend_power_down(); // on AVR this deep sleeps for 15ms
/* Remote wakeup */
suspend_power_down();
if ((USB_DRIVER.status & USB_GETSTATUS_REMOTE_WAKEUP_ENABLED) && suspend_wakeup_condition()) {
/* issue a remote wakeup event to the host which should resume
* the bus and get our keyboard out of suspension. */
usbWakeupHost(&USB_DRIVER);
restart_usb_driver(&USB_DRIVER);
}
}
/* Woken up */
// variables has been already cleared by the wakeup hook
send_keyboard_report();
# ifdef MOUSEKEY_ENABLE
mousekey_send();
# endif /* MOUSEKEY_ENABLE */
/* after a successful wakeup a USB_EVENT_WAKEUP is signaled to QMK by
* ChibiOS, which triggers a wakeup callback that restores the state of
* the keyboard. Therefore we do nothing here. */
}
#endif
usb_event_queue_task();
}
void protocol_post_task(void) {


+ 1
- 1
tmk_core/protocol/lufa/lufa.c View File

@ -858,7 +858,7 @@ void protocol_post_init(void) {
void protocol_pre_task(void) {
#if !defined(NO_USB_STARTUP_CHECK)
if (USB_DeviceState == DEVICE_STATE_Suspended) {
print("[s]");
dprintln("suspending keyboard");
while (USB_DeviceState == DEVICE_STATE_Suspended) {
suspend_power_down();
if (USB_Device_RemoteWakeupEnabled && suspend_wakeup_condition()) {


Loading…
Cancel
Save