]> git.donarmstrong.com Git - tmk_firmware.git/blobdiff - common/avr/suspend.c
USB initialize when plug-in during battery powered
[tmk_firmware.git] / common / avr / suspend.c
index f44a036beb5d475645f0e1ac4df09466fcc89122..66a579fd7823e2c9d2d9905a5ba6bf78b39636b3 100644 (file)
@@ -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;
     }