X-Git-Url: https://git.friedersdorff.com/?a=blobdiff_plain;f=tmk_core%2Fprotocol%2Fchibios%2Fmain.c;h=9c5254fa6120165f14b5530628b1704b1deeaf4b;hb=9bb5b42a460f71c469cbfd1c591f3bf8c9de3269;hp=7aec7e3e107f8ba1e82cf572ebd1557c10018c92;hpb=dc9fc9a7a457d44efc45f1dce51db3c5d4bc17c9;p=max%2Ftmk_keyboard.git diff --git a/tmk_core/protocol/chibios/main.c b/tmk_core/protocol/chibios/main.c index 7aec7e3e..9c5254fa 100644 --- a/tmk_core/protocol/chibios/main.c +++ b/tmk_core/protocol/chibios/main.c @@ -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" /* ------------------------- @@ -40,6 +43,14 @@ * ------------------------- */ +/* 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,21 +59,38 @@ 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. */ -// uint8_t blinkLedState = 0; -// static THD_WORKING_AREA(waThread1, 128); -// static THD_FUNCTION(Thread1, arg) { +/* 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("blinker1"); +// chRegSetThreadName("blinkOrange"); // while(true) { -// if(blinkLedState) { -// blinkLedState = 0; -// palSetPad(GPIOC, GPIOC_LED_ORANGE); +// if(blinkLed) { +// blinkLed = 0; +// palSetPad(TEENSY_PIN13_IOPORT, TEENSY_PIN13); // chThdSleepMilliseconds(100); -// palClearPad(GPIOC, GPIOC_LED_ORANGE); +// palClearPad(TEENSY_PIN13_IOPORT, TEENSY_PIN13); // } // chThdSleepMilliseconds(100); // } @@ -77,12 +105,10 @@ int main(void) { halInit(); chSysInit(); - palSetPad(GPIOC, GPIOC_LED_BLUE); - chThdSleepMilliseconds(400); - palClearPad(GPIOC, GPIOC_LED_BLUE); - // TESTING - // chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); + // chThdCreateStatic(waBlinkerThread, sizeof(waBlinkerThread), NORMALPRIO, blinkerThread, NULL); + + hook_early_init(); /* Init USB */ init_usb_driver(&USB_DRIVER); @@ -94,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 */ @@ -106,11 +139,24 @@ int main(void) { 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); } }