~ruther/qmk_firmware

a87c74ebe14aee0d4a82f5ff8a0170afb8105598 — Stefan Kerkmann 2 years ago 4aa765b
[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. 02516cbc24647f522eee975e69cc0c8a925470eb 
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
M lib/chibios-contrib => lib/chibios-contrib +1 -1
@@ 1,1 1,1 @@
Subproject commit a224be155ae18d38deccf33a6c1d259b9a5ad8d3
Subproject commit 5d2d95c520a13d2c3e42343f51b18822d63781d6

M platforms/chibios/boards/GENERIC_PROMICRO_RP2040/configs/mcuconf.h => platforms/chibios/boards/GENERIC_PROMICRO_RP2040/configs/mcuconf.h +0 -1
@@ 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 */

M platforms/chibios/boards/GENERIC_RP_RP2040/configs/mcuconf.h => platforms/chibios/boards/GENERIC_RP_RP2040/configs/mcuconf.h +0 -1
@@ 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 */

M platforms/chibios/boards/GENERIC_WB32_F3G71XX/board/board.c => platforms/chibios/boards/GENERIC_WB32_F3G71XX/board/board.c +0 -4
@@ 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.
}

M platforms/chibios/boards/GENERIC_WB32_FQ95XX/board/board.c => platforms/chibios/boards/GENERIC_WB32_FQ95XX/board/board.c +0 -4
@@ 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.
}

M platforms/chibios/boards/IC_TEENSY_3_1/board/board.c => platforms/chibios/boards/IC_TEENSY_3_1/board/board.c +0 -5
@@ 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.
}

M platforms/chibios/boards/PJRC_TEENSY_3_5/board/board.mk => platforms/chibios/boards/PJRC_TEENSY_3_5/board/board.mk +1 -1
@@ 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

D platforms/chibios/boards/PJRC_TEENSY_3_5/board/extra.c => platforms/chibios/boards/PJRC_TEENSY_3_5/board/extra.c +0 -7
@@ 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.
}

M platforms/chibios/boards/PJRC_TEENSY_3_6/board/board.mk => platforms/chibios/boards/PJRC_TEENSY_3_6/board/board.mk +1 -1
@@ 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

D platforms/chibios/boards/PJRC_TEENSY_3_6/board/extra.c => platforms/chibios/boards/PJRC_TEENSY_3_6/board/extra.c +0 -7
@@ 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.
}

M platforms/chibios/boards/QMK_PM2040/configs/mcuconf.h => platforms/chibios/boards/QMK_PM2040/configs/mcuconf.h +0 -1
@@ 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 */

M platforms/chibios/suspend.c => platforms/chibios/suspend.c +1 -0
@@ 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();

M tmk_core/protocol/chibios/chibios.c => tmk_core/protocol/chibios/chibios.c +9 -13
@@ 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) {

M tmk_core/protocol/lufa/lufa.c => tmk_core/protocol/lufa/lufa.c +1 -1
@@ 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()) {