]> git.donarmstrong.com Git - tmk_firmware.git/blobdiff - protocol/lufa/lufa.c
Merge branch 'suspend_fix'
[tmk_firmware.git] / protocol / lufa / lufa.c
index 98c3a68ffbdc30fa1c0128072070e5f4a5c15abc..7c707209014f94569b2d9bf190532bc6407d0f04 100644 (file)
 #include "host.h"
 #include "host_driver.h"
 #include "keyboard.h"
+#include "action.h"
+#include "led.h"
 #include "sendchar.h"
 #include "debug.h"
+#ifdef SLEEP_LED_ENABLE
+#include "sleep_led.h"
+#endif
+#include "suspend.h"
 
 #include "descriptor.h"
 #include "lufa.h"
@@ -133,16 +139,43 @@ static void Console_Task(void)
 /*******************************************************************************
  * USB Events
  ******************************************************************************/
-/** Event handler for the USB_Connect event. */
+/*
+ * Event Order of Plug in:
+ * 0) EVENT_USB_Device_Connect
+ * 1) EVENT_USB_Device_Suspend
+ * 2) EVENT_USB_Device_Reset
+ * 3) EVENT_USB_Device_Wake
+*/
 void EVENT_USB_Device_Connect(void)
 {
+    led_set(0x1f);  // all on
 }
 
-/** Event handler for the USB_Disconnect event. */
 void EVENT_USB_Device_Disconnect(void)
 {
 }
 
+void EVENT_USB_Device_Reset(void)
+{
+}
+
+void EVENT_USB_Device_Suspend()
+{
+#ifdef SLEEP_LED_ENABLE
+    sleep_led_enable();
+#endif
+}
+
+void EVENT_USB_Device_WakeUp()
+{
+    suspend_wakeup_init();
+
+#ifdef SLEEP_LED_ENABLE
+    sleep_led_disable();
+#endif
+    led_set(host_keyboard_leds());
+}
+
 void EVENT_USB_Device_StartOfFrame(void)
 {
     Console_Task();
@@ -472,11 +505,19 @@ int main(void)
     SetupHardware();
     keyboard_init();
     host_set_driver(&lufa_driver);
+#ifdef SLEEP_LED_ENABLE
+    sleep_led_init();
+#endif
     sei();
 
-    // TODO: can't print here
-    debug("LUFA init\n");
     while (1) {
+        while (USB_DeviceState == DEVICE_STATE_Suspended) {
+            suspend_power_down();
+            if (USB_Device_RemoteWakeupEnabled && suspend_wakeup_condition()) {
+                    USB_Device_SendRemoteWakeup();
+            }
+        }
+
         keyboard_task();
 
 #if !defined(INTERRUPT_CONTROL_ENDPOINT)