]> git.friedersdorff.com Git - max/tmk_keyboard.git/commitdiff
USB initialize when plug-in during battery powered
authortmk <nobody@nowhere>
Thu, 20 Nov 2014 08:06:46 +0000 (17:06 +0900)
committertmk <nobody@nowhere>
Thu, 20 Nov 2014 08:24:56 +0000 (17:24 +0900)
common/avr/suspend.c
common/suspend.h
protocol/lufa/lufa.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;
     }
index 9b76f280d1f182f9c649fd2df07731fb70b3b2cd..f339c670ac0431ed48b214e47f0cfa60fa157fd6 100644 (file)
@@ -5,7 +5,8 @@
 #include <stdbool.h>
 
 
-void suspend_power_down(void);
+void suspend_idle(uint8_t timeout);
+void suspend_power_down(uint8_t timeout);
 bool suspend_wakeup_condition(void);
 void suspend_wakeup_init(void);
 
index 16a602df13f76d7bd4485ac273af01fbc90dd50a..6802f3b6319c7cd0a0a4509cbf429e263b49eb07 100644 (file)
@@ -148,10 +148,23 @@ static void Console_Task(void)
 */
 void EVENT_USB_Device_Connect(void)
 {
+    /* For battery powered device */
+    if (!USB_IsInitialized) {
+        USB_Init();
+        USB_Device_EnableSOFEvents();
+    }
 }
 
 void EVENT_USB_Device_Disconnect(void)
 {
+    /* For battery powered device */
+/* TODO: This doesn't work. After several plug in/outs can not be enumerated. 
+    if (USB_IsInitialized) {
+        USB_Disable();  // Disable all interrupts
+       USB_Controller_Enable();
+        USB_INT_Enable(USB_INT_VBUSTI);
+    }
+*/
 }
 
 void EVENT_USB_Device_Reset(void)
@@ -574,7 +587,7 @@ int main(void)
     print("Keyboard start.\n");
     while (1) {
         while (USB_DeviceState == DEVICE_STATE_Suspended) {
-            suspend_power_down();
+            suspend_power_down(WDTO_120MS);
             if (USB_Device_RemoteWakeupEnabled && suspend_wakeup_condition()) {
                     USB_Device_SendRemoteWakeup();
             }