]> git.friedersdorff.com Git - max/tmk_keyboard.git/blobdiff - tmk_core/protocol/chibios/main.c
ibmpc: Fix debug print
[max/tmk_keyboard.git] / tmk_core / protocol / chibios / main.c
index ce7cd8e3dfc8dc5c9e5dafc50ad2778c9dfbe282..9c5254fa6120165f14b5530628b1704b1deeaf4b 100644 (file)
@@ -26,6 +26,8 @@
 #include "host_driver.h"
 #include "keyboard.h"
 #include "action.h"
+#include "action_util.h"
+#include "mousekey.h"
 #include "led.h"
 #include "sendchar.h"
 #include "debug.h"
@@ -33,6 +35,7 @@
 #include "sleep_led.h"
 #endif
 #include "suspend.h"
+#include "hook.h"
 
 
 /* -------------------------
  * -------------------------
  */
 
+/* declarations */
+uint8_t keyboard_leds(void);
+void send_keyboard(report_keyboard_t *report);
+void send_mouse(report_mouse_t *report);
+void send_system(uint16_t data);
+void send_consumer(uint16_t data);
+
+/* host struct */
 host_driver_t chibios_driver = {
   keyboard_leds,
   send_keyboard,
@@ -48,6 +59,45 @@ host_driver_t chibios_driver = {
   send_consumer
 };
 
+/* Default hooks definitions. */
+__attribute__((weak))
+void hook_early_init(void) {}
+
+__attribute__((weak))
+void hook_late_init(void) {}
+
+__attribute__((weak))
+void hook_usb_suspend_loop(void) {
+  /* Do this in the suspended state */
+  suspend_power_down(); // on AVR this deep sleeps for 15ms
+  /* Remote wakeup */
+  if((USB_DRIVER.status & 2) && suspend_wakeup_condition()) {
+    send_remote_wakeup(&USB_DRIVER);
+  }
+}
+
+/* TESTING
+ * Amber LED blinker thread, times are in milliseconds.
+ */
+/* set this variable to non-zero anywhere to blink once */
+// uint8_t blinkLed = 0;
+// static THD_WORKING_AREA(waBlinkerThread, 128);
+// static THD_FUNCTION(blinkerThread, arg) {
+//   (void)arg;
+//   chRegSetThreadName("blinkOrange");
+//   while(true) {
+//     if(blinkLed) {
+//       blinkLed = 0;
+//       palSetPad(TEENSY_PIN13_IOPORT, TEENSY_PIN13);
+//       chThdSleepMilliseconds(100);
+//       palClearPad(TEENSY_PIN13_IOPORT, TEENSY_PIN13);
+//     }
+//     chThdSleepMilliseconds(100);
+//   }
+// }
+
+
+
 /* Main thread
  */
 int main(void) {
@@ -55,12 +105,13 @@ int main(void) {
   halInit();
   chSysInit();
 
-  palSetPad(GPIOC, GPIOC_LED_BLUE);
-  chThdSleepMilliseconds(400);
-  palClearPad(GPIOC, GPIOC_LED_BLUE);
+  // TESTING
+  // chThdCreateStatic(waBlinkerThread, sizeof(waBlinkerThread), NORMALPRIO, blinkerThread, NULL);
+
+  hook_early_init();
 
   /* Init USB */
-  init_usb_driver();
+  init_usb_driver(&USB_DRIVER);
 
   /* init printf */
   init_printf(NULL,sendchar_pf);
@@ -69,6 +120,13 @@ int main(void) {
   while(USB_DRIVER.state != USB_ACTIVE)
     chThdSleepMilliseconds(50);
 
+  /* Do need to wait here!
+   * Otherwise the next print might start a transfer on console EP
+   * before the USB is completely ready, which sometimes causes
+   * HardFaults.
+   */
+  chThdSleepMilliseconds(50);
+
   print("USB configured.\n");
 
   /* init TMK modules */
@@ -76,16 +134,29 @@ int main(void) {
   host_set_driver(&chibios_driver);
 
 #ifdef SLEEP_LED_ENABLE
-    sleep_led_init();
+  sleep_led_init();
 #endif
 
   print("Keyboard start.\n");
 
+  hook_late_init();
+
   /* Main loop */
   while(true) {
-    /* TODO: check for suspended event */
+
+    if(USB_DRIVER.state == USB_SUSPENDED) {
+      print("[s]");
+      while(USB_DRIVER.state == USB_SUSPENDED) {
+        hook_usb_suspend_loop();
+      }
+      /* Woken up */
+      // variables have been already cleared
+      send_keyboard_report();
+#ifdef MOUSEKEY_ENABLE
+      mousekey_send();
+#endif /* MOUSEKEY_ENABLE */
+    }
 
     keyboard_task();
-    chThdSleepMilliseconds(5);
   }
 }