X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=tmk_core%2Fcommon%2Favr%2Fsuspend.c;h=5bca64685493609d9046fdadc359aca147e1094b;hb=48a992f1c037658bbacccefd2709ffdcda8bb345;hp=e295dbe18bd226e3fa1b1c8eaea215ab37fa1508;hpb=f2c1e9ddd40573f4b44ffc2ec7df1fb76346f627;p=qmk_firmware.git diff --git a/tmk_core/common/avr/suspend.c b/tmk_core/common/avr/suspend.c index e295dbe18..5bca64685 100644 --- a/tmk_core/common/avr/suspend.c +++ b/tmk_core/common/avr/suspend.c @@ -9,6 +9,8 @@ #include "suspend.h" #include "timer.h" #include "led.h" +#include "host.h" +#include "rgblight_reconfig.h" #ifdef PROTOCOL_LUFA #include "lufa.h" @@ -18,6 +20,9 @@ #include "audio.h" #endif /* AUDIO_ENABLE */ +#if defined(RGBLIGHT_SLEEP) && defined(RGBLIGHT_ENABLE) + #include "rgblight.h" +#endif #define wdt_intr_enable(value) \ @@ -37,6 +42,10 @@ __asm__ __volatile__ ( \ ) +/** \brief Suspend idle + * + * FIXME: needs doc + */ void suspend_idle(uint8_t time) { cli(); @@ -47,7 +56,27 @@ void suspend_idle(uint8_t time) sleep_disable(); } -/* Power down MCU with watchdog timer + +// TODO: This needs some cleanup + +/** \brief Run keyboard level Power down + * + * FIXME: needs doc + */ +__attribute__ ((weak)) +void suspend_power_down_user (void) { } +/** \brief Run keyboard level Power down + * + * FIXME: needs doc + */ +__attribute__ ((weak)) +void suspend_power_down_kb(void) { + suspend_power_down_user(); +} + +#ifndef NO_SUSPEND_POWER_DOWN +/** \brief Power down MCU with watchdog timer + * * wdto: watchdog timer timeout defined in * WDTO_15MS * WDTO_30MS @@ -61,6 +90,11 @@ void suspend_idle(uint8_t time) * WDTO_8S */ static uint8_t wdt_timeout = 0; + +/** \brief Power down + * + * FIXME: needs doc + */ static void power_down(uint8_t wdto) { #ifdef PROTOCOL_LUFA @@ -79,8 +113,16 @@ static void power_down(uint8_t wdto) led_set(0); #ifdef AUDIO_ENABLE - stop_all_notes(); + // This sometimes disables the start-up noise, so it's been disabled + // stop_all_notes(); #endif /* AUDIO_ENABLE */ +#if defined(RGBLIGHT_SLEEP) && defined(RGBLIGHT_ENABLE) +#ifdef RGBLIGHT_ANIMATIONS + rgblight_timer_disable(); +#endif + rgblight_disable_noeeprom(); +#endif + suspend_power_down_kb(); // TODO: more power saving // See PicoPower application note @@ -97,38 +139,71 @@ static void power_down(uint8_t wdto) // Disable watchdog after sleep wdt_disable(); } +#endif +/** \brief Suspend power down + * + * FIXME: needs doc + */ void suspend_power_down(void) { + suspend_power_down_kb(); + +#ifndef NO_SUSPEND_POWER_DOWN power_down(WDTO_15MS); +#endif } __attribute__ ((weak)) void matrix_power_up(void) {} __attribute__ ((weak)) void matrix_power_down(void) {} bool suspend_wakeup_condition(void) { -#ifdef BACKLIGHT_ENABLE - backlight_set(0); -#endif matrix_power_up(); matrix_scan(); matrix_power_down(); for (uint8_t r = 0; r < MATRIX_ROWS; r++) { if (matrix_get_row(r)) return true; } - return false; + return false; } -// run immediately after wakeup +/** \brief run user level code immediately after wakeup + * + * FIXME: needs doc + */ +__attribute__ ((weak)) +void suspend_wakeup_init_user(void) { } + +/** \brief run keyboard level code immediately after wakeup + * + * FIXME: needs doc + */ +__attribute__ ((weak)) +void suspend_wakeup_init_kb(void) { + suspend_wakeup_init_user(); +} +/** \brief run immediately after wakeup + * + * FIXME: needs doc + */ void suspend_wakeup_init(void) { // clear keyboard state clear_keyboard(); #ifdef BACKLIGHT_ENABLE - backlight_set(0); backlight_init(); #endif -led_set(host_keyboard_leds()); + led_set(host_keyboard_leds()); +#if defined(RGBLIGHT_SLEEP) && defined(RGBLIGHT_ENABLE) +#ifdef BOOTLOADER_TEENSY + wait_ms(10); +#endif + rgblight_enable_noeeprom(); +#ifdef RGBLIGHT_ANIMATIONS + rgblight_timer_enable(); +#endif +#endif + suspend_wakeup_init_kb(); } #ifndef NO_SUSPEND_POWER_DOWN @@ -145,4 +220,3 @@ ISR(WDT_vect) } } #endif -