X-Git-Url: https://git.friedersdorff.com/?a=blobdiff_plain;f=common%2Favr%2Fsuspend.c;h=80243f02bc7448d8a6880afad9718bdff11af4fd;hb=d5ac54449ad7726e4d392d14551f3559cc63afbf;hp=f44a036beb5d475645f0e1ac4df09466fcc89122;hpb=adbb86b1ec8b07e86ae7425374e95b82122e48a7;p=max%2Ftmk_keyboard.git diff --git a/common/avr/suspend.c b/common/avr/suspend.c index f44a036b..80243f02 100644 --- a/common/avr/suspend.c +++ b/common/avr/suspend.c @@ -7,6 +7,10 @@ #include "backlight.h" #include "suspend_avr.h" #include "suspend.h" +#include "timer.h" +#ifdef PROTOCOL_LUFA +#include "lufa.h" +#endif #define wdt_intr_enable(value) \ @@ -26,30 +30,46 @@ __asm__ __volatile__ ( \ ) -void suspend_power_down(void) +void suspend_idle(uint8_t time) { -#ifdef BACKLIGHT_ENABLE - backlight_set(0); -#endif -#ifndef NO_SUSPEND_POWER_DOWN - // Enable watchdog to wake from MCU sleep cli(); - wdt_reset(); + set_sleep_mode(SLEEP_MODE_IDLE); + sleep_enable(); + sei(); + sleep_cpu(); + sleep_disable(); +} + +/* Power down MCU with watchdog timer + * wdto: watchdog timer timeout defined in + * WDTO_15MS + * WDTO_30MS + * WDTO_60MS + * WDTO_120MS + * WDTO_250MS + * WDTO_500MS + * WDTO_1S + * WDTO_2S + * WDTO_4S + * WDTO_8S + */ +static uint8_t wdt_timeout = 0; +static void power_down(uint8_t wdto) +{ +#ifdef PROTOCOL_LUFA + if (USB_DeviceState == DEVICE_STATE_Configured) return; +#endif + wdt_timeout = wdto; - // Watchdog Interrupt and System Reset Mode - //wdt_enable(WDTO_1S); - //WDTCSR |= _BV(WDIE); - // Watchdog Interrupt Mode - wdt_intr_enable(WDTO_120MS); - + wdt_intr_enable(wdto); + // TODO: more power saving // See PicoPower application note // - I/O port input with pullup // - prescale clock // - BOD disable // - Power Reduction Register PRR - // sleep in power down mode set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); sei(); @@ -58,12 +78,18 @@ void suspend_power_down(void) // Disable watchdog after sleep wdt_disable(); -#endif +} + +void suspend_power_down(void) +{ + power_down(WDTO_15MS); } bool suspend_wakeup_condition(void) { + matrix_power_up(); matrix_scan(); + matrix_power_down(); for (uint8_t r = 0; r < MATRIX_ROWS; r++) { if (matrix_get_row(r)) return true; } @@ -84,15 +110,13 @@ void suspend_wakeup_init(void) /* watchdog timeout */ ISR(WDT_vect) { - /* wakeup from MCU sleep mode */ -/* - // blink LED - static uint8_t led_state = 0; - static uint8_t led_count = 0; - led_count++; - if ((led_count & 0x07) == 0) { - led_set((led_state ^= (1<