V-USB remote wakeup
authorLuiz Ribeiro <luizribeiro@gmail.com>
Sun, 27 Nov 2016 16:38:24 +0000 (11:38 -0500)
committerLuiz Ribeiro <luizribeiro@gmail.com>
Sun, 27 Nov 2016 20:33:42 +0000 (15:33 -0500)
tmk_core/protocol/vusb/main.c

index 0d809536d3514471cfd1fa3e5e88d95ce3c3c260..794e4000eaddd446eddeae8644f8f986b30ccf7f 100644 (file)
@@ -20,6 +20,7 @@
 #include "timer.h"
 #include "uart.h"
 #include "debug.h"
+#include "suspend.h"
 
 
 #define UART_BAUD_RATE 115200
@@ -41,6 +42,23 @@ static void initForUsbConnectivity(void)
     sei();
 }
 
+void usb_remote_wakeup(void) {
+    cli();
+
+    int8_t ddr_orig = USBDDR;
+    USBOUT |= (1 << USBMINUS);
+    USBDDR = ddr_orig | USBMASK;
+    USBOUT ^= USBMASK;
+
+    _delay_ms(25);
+
+    USBOUT ^= USBMASK;
+    USBDDR = ddr_orig;
+    USBOUT &= ~(1 << USBMINUS);
+
+    sei();
+}
+
 int main(void)
 {
     bool suspended = false;
@@ -70,19 +88,6 @@ int main(void)
             // Suspend when no SOF in 3ms-10ms(7.1.7.4 Suspending of USB1.1)
             if (timer_elapsed(last_timer) > 5) {
                 suspended = true;
-/*
-                uart_putchar('S');
-                _delay_ms(1);
-                cli();
-                set_sleep_mode(SLEEP_MODE_PWR_DOWN);
-                sleep_enable();
-                sleep_bod_disable();
-                sei();
-                sleep_cpu();
-                sleep_disable();
-                _delay_ms(10);
-                uart_putchar('W');
-*/
             }
         }
 #endif
@@ -95,6 +100,8 @@ int main(void)
                 keyboard_task();
             }
             vusb_transfer_keyboard();
+        } else if (suspend_wakeup_condition()) {
+            usb_remote_wakeup();
         }
     }
 }
Imprint / Impressum