diff options
Diffstat (limited to 'tmk_core/protocol/chibios')
-rw-r--r-- | tmk_core/protocol/chibios/chibios.c | 57 | ||||
-rw-r--r-- | tmk_core/protocol/chibios/chibios.mk | 17 | ||||
-rw-r--r-- | tmk_core/protocol/chibios/usb_main.c | 27 |
3 files changed, 43 insertions, 58 deletions
diff --git a/tmk_core/protocol/chibios/chibios.c b/tmk_core/protocol/chibios/chibios.c index 10a976608a..ac39606179 100644 --- a/tmk_core/protocol/chibios/chibios.c +++ b/tmk_core/protocol/chibios/chibios.c @@ -49,6 +49,8 @@ #include "suspend.h" #include "wait.h" +#define USB_GETSTATUS_REMOTE_WAKEUP_ENABLED (2U) + /* ------------------------- * TMK host driver defs * ------------------------- @@ -78,26 +80,6 @@ void console_task(void); void midi_ep_task(void); #endif -/* TESTING - * Amber LED blinker thread, times are in milliseconds. - */ -/* set this variable to non-zero anywhere to blink once */ -// static THD_WORKING_AREA(waThread1, 128); -// static THD_FUNCTION(Thread1, arg) { - -// (void)arg; -// chRegSetThreadName("blinker"); -// while (true) { -// systime_t time; - -// time = USB_DRIVER.state == USB_ACTIVE ? 250 : 500; -// palClearLine(LINE_CAPS_LOCK); -// chSysPolledDelayX(MS2RTC(STM32_HCLK, time)); -// palSetLine(LINE_CAPS_LOCK); -// chSysPolledDelayX(MS2RTC(STM32_HCLK, time)); -// } -// } - /* Early initialisation */ __attribute__((weak)) void early_hardware_init_pre(void) { @@ -133,9 +115,6 @@ void boardInit(void) { void protocol_setup(void) { usb_device_state_init(); - - // TESTING - // chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); } static host_driver_t *driver = NULL; @@ -178,28 +157,32 @@ void protocol_post_init(void) { } void protocol_pre_task(void) { - usb_event_queue_task(); - #if !defined(NO_USB_STARTUP_CHECK) if (USB_DRIVER.state == USB_SUSPENDED) { - print("[s]"); + dprintln("suspending keyboard"); while (USB_DRIVER.state == USB_SUSPENDED) { - /* Do this in the suspended state */ - suspend_power_down(); // on AVR this deep sleeps for 15ms - /* Remote wakeup */ - if (suspend_wakeup_condition()) { + suspend_power_down(); + if ((USB_DRIVER.status & USB_GETSTATUS_REMOTE_WAKEUP_ENABLED) && suspend_wakeup_condition()) { + /* issue a remote wakeup event to the host which should resume + * the bus and get our keyboard out of suspension. */ usbWakeupHost(&USB_DRIVER); - restart_usb_driver(&USB_DRIVER); +# if USB_SUSPEND_WAKEUP_DELAY > 0 + /* Some hubs, kvm switches, and monitors do weird things, with + * USB device state bouncing around wildly on wakeup, yielding + * race conditions that can corrupt the keyboard state. + * + * Pause for a while to let things settle... */ + wait_ms(USB_SUSPEND_WAKEUP_DELAY); +# endif } } - /* Woken up */ - // variables has been already cleared by the wakeup hook - send_keyboard_report(); -# ifdef MOUSEKEY_ENABLE - mousekey_send(); -# endif /* MOUSEKEY_ENABLE */ + /* after a successful wakeup a USB_EVENT_WAKEUP is signaled to QMK by + * ChibiOS, which triggers a wakeup callback that restores the state of + * the keyboard. Therefore we do nothing here. */ } #endif + + usb_event_queue_task(); } void protocol_post_task(void) { diff --git a/tmk_core/protocol/chibios/chibios.mk b/tmk_core/protocol/chibios/chibios.mk new file mode 100644 index 0000000000..8eaf5b10d2 --- /dev/null +++ b/tmk_core/protocol/chibios/chibios.mk @@ -0,0 +1,17 @@ +PROTOCOL_DIR = protocol +CHIBIOS_DIR = $(PROTOCOL_DIR)/chibios + + +SRC += $(CHIBIOS_DIR)/usb_main.c +SRC += $(CHIBIOS_DIR)/chibios.c +SRC += usb_descriptor.c +SRC += $(CHIBIOS_DIR)/usb_driver.c +SRC += $(CHIBIOS_DIR)/usb_util.c +SRC += $(LIBSRC) + +VPATH += $(TMK_PATH)/$(PROTOCOL_DIR) +VPATH += $(TMK_PATH)/$(CHIBIOS_DIR) +VPATH += $(TMK_PATH)/$(CHIBIOS_DIR)/lufa_utils + +OPT_DEFS += -DFIXED_CONTROL_ENDPOINT_SIZE=64 +OPT_DEFS += -DFIXED_NUM_CONFIGURATIONS=1 diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index b14ca30c1a..e1327f065c 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -784,34 +784,19 @@ void init_usb_driver(USBDriver *usbp) { #endif } - /* - * Activates the USB driver and then the USB bus pull-up on D+. - * Note, a delay is inserted in order to not have to disconnect the cable - * after a reset. - */ - usbDisconnectBus(usbp); - usbStop(usbp); - wait_ms(50); - usbStart(usbp, &usbcfg); - usbConnectBus(usbp); + restart_usb_driver(usbp); chVTObjectInit(&keyboard_idle_timer); } +/** @brief Restarts the USB driver and emulates a physical bus reconnection. + * Note that the bus reconnection is MCU and even board specific, so it might + * be a NOP on some hardware platforms. + */ __attribute__((weak)) void restart_usb_driver(USBDriver *usbp) { usbDisconnectBus(usbp); usbStop(usbp); - -#if USB_SUSPEND_WAKEUP_DELAY > 0 - // Some hubs, kvm switches, and monitors do - // weird things, with USB device state bouncing - // around wildly on wakeup, yielding race - // conditions that can corrupt the keyboard state. - // - // Pause for a while to let things settle... - wait_ms(USB_SUSPEND_WAKEUP_DELAY); -#endif - + wait_ms(50); usbStart(usbp, &usbcfg); usbConnectBus(usbp); } |