diff options
author | tmk <nobody@nowhere> | 2014-11-20 17:06:46 +0900 |
---|---|---|
committer | tmk <nobody@nowhere> | 2014-11-20 17:24:56 +0900 |
commit | c2d830c07c823c48a17c214b093ec1bab989fb6a (patch) | |
tree | 388b86cd7bfbf3b78528a498c8e3f39a20fc778f /common/avr/suspend.c | |
parent | 6c06b9031fd09479d552f9750a3b1cfe259678fd (diff) |
USB initialize when plug-in during battery powered
Diffstat (limited to 'common/avr/suspend.c')
-rw-r--r-- | common/avr/suspend.c | 49 |
1 files changed, 34 insertions, 15 deletions
diff --git a/common/avr/suspend.c b/common/avr/suspend.c index f44a036beb..66a579fd78 100644 --- a/common/avr/suspend.c +++ b/common/avr/suspend.c @@ -7,6 +7,9 @@ #include "backlight.h" #include "suspend_avr.h" #include "suspend.h" +#ifdef PROTOCOL_LUFA +#include "lufa.h" +#endif #define wdt_intr_enable(value) \ @@ -26,30 +29,45 @@ __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 <avr/wdt.h> + * WDTO_15MS + * WDTO_30MS + * WDTO_60MS + * WDTO_120MS + * WDTO_250MS + * WDTO_500MS + * WDTO_1S + * WDTO_2S + * WDTO_4S + * WDTO_8S + */ +void suspend_power_down(uint8_t wdto) +{ +#ifdef PROTOCOL_LUFA + if (USB_DeviceState == DEVICE_STATE_Configured) return; +#endif - // 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 +76,13 @@ void suspend_power_down(void) // Disable watchdog after sleep wdt_disable(); -#endif } 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; } |