From 96e2b13d1de227cdc2b918fb0292bd832d346a25 Mon Sep 17 00:00:00 2001
From: Joel Challis
Date: Wed, 18 Aug 2021 00:11:07 +0100
Subject: Begin to carve out platform/protocol API - Single main loop (#13843)
* Begin to carve out platform/protocol API
* Fix up after rebase---
tmk_core/common.mk | 1 +
tmk_core/common/arm_atsam/platform.c | 21 +++
tmk_core/common/avr/platform.c | 21 +++
tmk_core/common/chibios/platform.c | 22 +++
tmk_core/common/test/platform.c | 21 +++
tmk_core/protocol/chibios.mk | 2 +-
tmk_core/protocol/chibios/chibios.c | 255 +++++++++++++++++++++++++++++++++
tmk_core/protocol/chibios/main.c | 263 -----------------------------------
tmk_core/protocol/lufa/lufa.c | 64 ++++-----
tmk_core/protocol/vusb.mk | 2 +-
tmk_core/protocol/vusb/main.c | 179 ------------------------
tmk_core/protocol/vusb/protocol.c | 178 ++++++++++++++++++++++++
12 files changed, 551 insertions(+), 478 deletions(-)
create mode 100644 tmk_core/common/arm_atsam/platform.c
create mode 100644 tmk_core/common/avr/platform.c
create mode 100644 tmk_core/common/chibios/platform.c
create mode 100644 tmk_core/common/test/platform.c
create mode 100644 tmk_core/protocol/chibios/chibios.c
delete mode 100644 tmk_core/protocol/chibios/main.c
delete mode 100644 tmk_core/protocol/vusb/main.c
create mode 100644 tmk_core/protocol/vusb/protocol.c
(limited to 'tmk_core')
diff --git a/tmk_core/common.mk b/tmk_core/common.mk
index 923a736d35..57de8d95e8 100644
--- a/tmk_core/common.mk
+++ b/tmk_core/common.mk
@@ -12,6 +12,7 @@ TMK_COMMON_SRC += $(COMMON_DIR)/host.c \
$(COMMON_DIR)/report.c \
$(COMMON_DIR)/sync_timer.c \
$(COMMON_DIR)/usb_util.c \
+ $(PLATFORM_COMMON_DIR)/platform.c \
$(PLATFORM_COMMON_DIR)/suspend.c \
$(PLATFORM_COMMON_DIR)/timer.c \
$(PLATFORM_COMMON_DIR)/bootloader.c \
diff --git a/tmk_core/common/arm_atsam/platform.c b/tmk_core/common/arm_atsam/platform.c
new file mode 100644
index 0000000000..3e35b4fe4c
--- /dev/null
+++ b/tmk_core/common/arm_atsam/platform.c
@@ -0,0 +1,21 @@
+/* Copyright 2021 QMK
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include "platform_deps.h"
+
+void platform_setup(void) {
+ // do nothing
+}
diff --git a/tmk_core/common/avr/platform.c b/tmk_core/common/avr/platform.c
new file mode 100644
index 0000000000..3e35b4fe4c
--- /dev/null
+++ b/tmk_core/common/avr/platform.c
@@ -0,0 +1,21 @@
+/* Copyright 2021 QMK
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include "platform_deps.h"
+
+void platform_setup(void) {
+ // do nothing
+}
diff --git a/tmk_core/common/chibios/platform.c b/tmk_core/common/chibios/platform.c
new file mode 100644
index 0000000000..d4a229f278
--- /dev/null
+++ b/tmk_core/common/chibios/platform.c
@@ -0,0 +1,22 @@
+/* Copyright 2021 QMK
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include "platform_deps.h"
+
+void platform_setup(void) {
+ halInit();
+ chSysInit();
+}
\ No newline at end of file
diff --git a/tmk_core/common/test/platform.c b/tmk_core/common/test/platform.c
new file mode 100644
index 0000000000..8ddceeda8f
--- /dev/null
+++ b/tmk_core/common/test/platform.c
@@ -0,0 +1,21 @@
+/* Copyright 2021 QMK
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include "platform_deps.h"
+
+void platform_setup(void) {
+ // do nothing
+}
\ No newline at end of file
diff --git a/tmk_core/protocol/chibios.mk b/tmk_core/protocol/chibios.mk
index d01697835b..a7f2d8e93d 100644
--- a/tmk_core/protocol/chibios.mk
+++ b/tmk_core/protocol/chibios.mk
@@ -3,7 +3,7 @@ CHIBIOS_DIR = $(PROTOCOL_DIR)/chibios
SRC += $(CHIBIOS_DIR)/usb_main.c
-SRC += $(CHIBIOS_DIR)/main.c
+SRC += $(CHIBIOS_DIR)/chibios.c
SRC += usb_descriptor.c
SRC += $(CHIBIOS_DIR)/usb_driver.c
SRC += $(CHIBIOS_DIR)/usb_util.c
diff --git a/tmk_core/protocol/chibios/chibios.c b/tmk_core/protocol/chibios/chibios.c
new file mode 100644
index 0000000000..78a2e3fcbb
--- /dev/null
+++ b/tmk_core/protocol/chibios/chibios.c
@@ -0,0 +1,255 @@
+/*
+ * (c) 2015 flabberast
+ *
+ * Based on the following work:
+ * - Guillaume Duc's raw hid example (MIT License)
+ * https://github.com/guiduc/usb-hid-chibios-example
+ * - PJRC Teensy examples (MIT License)
+ * https://www.pjrc.com/teensy/usb_keyboard.html
+ * - hasu's TMK keyboard code (GPL v2 and some code Modified BSD)
+ * https://github.com/tmk/tmk_keyboard/
+ * - ChibiOS demo code (Apache 2.0 License)
+ * http://www.chibios.org
+ *
+ * Since some GPL'd code is used, this work is licensed under
+ * GPL v2 or later.
+ */
+
+#include
+#include
+
+#include "usb_main.h"
+
+/* TMK includes */
+#include "report.h"
+#include "host.h"
+#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"
+#include "print.h"
+
+#ifndef EARLY_INIT_PERFORM_BOOTLOADER_JUMP
+// Change this to be TRUE once we've migrated keyboards to the new init system
+// Remember to change docs/platformdev_chibios_earlyinit.md as well.
+# define EARLY_INIT_PERFORM_BOOTLOADER_JUMP FALSE
+#endif
+
+#ifdef SLEEP_LED_ENABLE
+# include "sleep_led.h"
+#endif
+#ifdef SERIAL_LINK_ENABLE
+# include "serial_link/system/serial_link.h"
+#endif
+#ifdef VISUALIZER_ENABLE
+# include "visualizer/visualizer.h"
+#endif
+#ifdef MIDI_ENABLE
+# include "qmk_midi.h"
+#endif
+#include "suspend.h"
+#include "wait.h"
+
+/* -------------------------
+ * TMK host driver defs
+ * -------------------------
+ */
+
+/* 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);
+void send_digitizer(report_digitizer_t *report);
+
+/* host struct */
+host_driver_t chibios_driver = {keyboard_leds, send_keyboard, send_mouse, send_system, send_consumer};
+
+#ifdef VIRTSER_ENABLE
+void virtser_task(void);
+#endif
+
+#ifdef RAW_ENABLE
+void raw_hid_task(void);
+#endif
+
+#ifdef CONSOLE_ENABLE
+void console_task(void);
+#endif
+#ifdef MIDI_ENABLE
+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) {
+#if EARLY_INIT_PERFORM_BOOTLOADER_JUMP
+ void enter_bootloader_mode_if_requested(void);
+ enter_bootloader_mode_if_requested();
+#endif // EARLY_INIT_PERFORM_BOOTLOADER_JUMP
+}
+
+__attribute__((weak)) void early_hardware_init_post(void) {}
+
+__attribute__((weak)) void board_init(void) {}
+
+// This overrides what's normally in ChibiOS board definitions
+void __early_init(void) {
+ early_hardware_init_pre();
+
+ // This is the renamed equivalent of __early_init in the board.c file
+ void __chibios_override___early_init(void);
+ __chibios_override___early_init();
+
+ early_hardware_init_post();
+}
+
+// This overrides what's normally in ChibiOS board definitions
+void boardInit(void) {
+ // This is the renamed equivalent of boardInit in the board.c file
+ void __chibios_override_boardInit(void);
+ __chibios_override_boardInit();
+
+ board_init();
+}
+
+void protocol_setup(void) {
+ // TESTING
+ // chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL);
+
+ keyboard_setup();
+}
+
+void protocol_init(void) {
+ /* Init USB */
+ usb_event_queue_init();
+ init_usb_driver(&USB_DRIVER);
+
+#ifdef MIDI_ENABLE
+ setup_midi();
+#endif
+
+#ifdef SERIAL_LINK_ENABLE
+ init_serial_link();
+#endif
+
+#ifdef VISUALIZER_ENABLE
+ visualizer_init();
+#endif
+
+ host_driver_t *driver = NULL;
+
+ /* Wait until the USB or serial link is active */
+ while (true) {
+#if defined(WAIT_FOR_USB) || defined(SERIAL_LINK_ENABLE)
+ if (USB_DRIVER.state == USB_ACTIVE) {
+ driver = &chibios_driver;
+ break;
+ }
+#else
+ driver = &chibios_driver;
+ break;
+#endif
+#ifdef SERIAL_LINK_ENABLE
+ if (is_serial_link_connected()) {
+ driver = get_serial_link_driver();
+ break;
+ }
+ serial_link_update();
+#endif
+ wait_ms(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.
+ */
+ wait_ms(50);
+
+ print("USB configured.\n");
+
+ /* init TMK modules */
+ keyboard_init();
+ host_set_driver(driver);
+
+#ifdef SLEEP_LED_ENABLE
+ sleep_led_init();
+#endif
+
+ print("Keyboard start.\n");
+}
+
+void protocol_task(void) {
+ usb_event_queue_task();
+
+#if !defined(NO_USB_STARTUP_CHECK)
+ if (USB_DRIVER.state == USB_SUSPENDED) {
+ print("[s]");
+# ifdef VISUALIZER_ENABLE
+ visualizer_suspend();
+# endif
+ while (USB_DRIVER.state == USB_SUSPENDED) {
+ /* Do this in the suspended state */
+# ifdef SERIAL_LINK_ENABLE
+ serial_link_update();
+# endif
+ suspend_power_down(); // on AVR this deep sleeps for 15ms
+ /* Remote wakeup */
+ if (suspend_wakeup_condition()) {
+ usbWakeupHost(&USB_DRIVER);
+ restart_usb_driver(&USB_DRIVER);
+ }
+ }
+ /* Woken up */
+ // variables has been already cleared by the wakeup hook
+ send_keyboard_report();
+# ifdef MOUSEKEY_ENABLE
+ mousekey_send();
+# endif /* MOUSEKEY_ENABLE */
+
+# ifdef VISUALIZER_ENABLE
+ visualizer_resume();
+# endif
+ }
+#endif
+
+ keyboard_task();
+#ifdef CONSOLE_ENABLE
+ console_task();
+#endif
+#ifdef MIDI_ENABLE
+ midi_ep_task();
+#endif
+#ifdef VIRTSER_ENABLE
+ virtser_task();
+#endif
+#ifdef RAW_ENABLE
+ raw_hid_task();
+#endif
+}
diff --git a/tmk_core/protocol/chibios/main.c b/tmk_core/protocol/chibios/main.c
deleted file mode 100644
index e41d6ff195..0000000000
--- a/tmk_core/protocol/chibios/main.c
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * (c) 2015 flabberast
- *
- * Based on the following work:
- * - Guillaume Duc's raw hid example (MIT License)
- * https://github.com/guiduc/usb-hid-chibios-example
- * - PJRC Teensy examples (MIT License)
- * https://www.pjrc.com/teensy/usb_keyboard.html
- * - hasu's TMK keyboard code (GPL v2 and some code Modified BSD)
- * https://github.com/tmk/tmk_keyboard/
- * - ChibiOS demo code (Apache 2.0 License)
- * http://www.chibios.org
- *
- * Since some GPL'd code is used, this work is licensed under
- * GPL v2 or later.
- */
-
-#include
-#include
-
-#include "usb_main.h"
-
-/* TMK includes */
-#include "report.h"
-#include "host.h"
-#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"
-#include "print.h"
-
-#ifndef EARLY_INIT_PERFORM_BOOTLOADER_JUMP
-// Change this to be TRUE once we've migrated keyboards to the new init system
-// Remember to change docs/platformdev_chibios_earlyinit.md as well.
-# define EARLY_INIT_PERFORM_BOOTLOADER_JUMP FALSE
-#endif
-
-#ifdef SLEEP_LED_ENABLE
-# include "sleep_led.h"
-#endif
-#ifdef SERIAL_LINK_ENABLE
-# include "serial_link/system/serial_link.h"
-#endif
-#ifdef VISUALIZER_ENABLE
-# include "visualizer/visualizer.h"
-#endif
-#ifdef MIDI_ENABLE
-# include "qmk_midi.h"
-#endif
-#include "suspend.h"
-#include "wait.h"
-
-/* -------------------------
- * TMK host driver defs
- * -------------------------
- */
-
-/* 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);
-void send_digitizer(report_digitizer_t *report);
-
-/* host struct */
-host_driver_t chibios_driver = {keyboard_leds, send_keyboard, send_mouse, send_system, send_consumer};
-
-#ifdef VIRTSER_ENABLE
-void virtser_task(void);
-#endif
-
-#ifdef RAW_ENABLE
-void raw_hid_task(void);
-#endif
-
-#ifdef CONSOLE_ENABLE
-void console_task(void);
-#endif
-#ifdef MIDI_ENABLE
-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) {
-#if EARLY_INIT_PERFORM_BOOTLOADER_JUMP
- void enter_bootloader_mode_if_requested(void);
- enter_bootloader_mode_if_requested();
-#endif // EARLY_INIT_PERFORM_BOOTLOADER_JUMP
-}
-
-__attribute__((weak)) void early_hardware_init_post(void) {}
-
-__attribute__((weak)) void board_init(void) {}
-
-// This overrides what's normally in ChibiOS board definitions
-void __early_init(void) {
- early_hardware_init_pre();
-
- // This is the renamed equivalent of __early_init in the board.c file
- void __chibios_override___early_init(void);
- __chibios_override___early_init();
-
- early_hardware_init_post();
-}
-
-// This overrides what's normally in ChibiOS board definitions
-void boardInit(void) {
- // This is the renamed equivalent of boardInit in the board.c file
- void __chibios_override_boardInit(void);
- __chibios_override_boardInit();
-
- board_init();
-}
-
-/* Main thread
- */
-int main(void) {
- /* ChibiOS/RT init */
- halInit();
- chSysInit();
-
- // TESTING
- // chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL);
-
- keyboard_setup();
-
- /* Init USB */
- usb_event_queue_init();
- init_usb_driver(&USB_DRIVER);
-
-#ifdef MIDI_ENABLE
- setup_midi();
-#endif
-
-#ifdef SERIAL_LINK_ENABLE
- init_serial_link();
-#endif
-
-#ifdef VISUALIZER_ENABLE
- visualizer_init();
-#endif
-
- host_driver_t *driver = NULL;
-
- /* Wait until the USB or serial link is active */
- while (true) {
-#if defined(WAIT_FOR_USB) || defined(SERIAL_LINK_ENABLE)
- if (USB_DRIVER.state == USB_ACTIVE) {
- driver = &chibios_driver;
- break;
- }
-#else
- driver = &chibios_driver;
- break;
-#endif
-#ifdef SERIAL_LINK_ENABLE
- if (is_serial_link_connected()) {
- driver = get_serial_link_driver();
- break;
- }
- serial_link_update();
-#endif
- wait_ms(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.
- */
- wait_ms(50);
-
- print("USB configured.\n");
-
- /* init TMK modules */
- keyboard_init();
- host_set_driver(driver);
-
-#ifdef SLEEP_LED_ENABLE
- sleep_led_init();
-#endif
-
- print("Keyboard start.\n");
-
- /* Main loop */
- while (true) {
- usb_event_queue_task();
-
-#if !defined(NO_USB_STARTUP_CHECK)
- if (USB_DRIVER.state == USB_SUSPENDED) {
- print("[s]");
-# ifdef VISUALIZER_ENABLE
- visualizer_suspend();
-# endif
- while (USB_DRIVER.state == USB_SUSPENDED) {
- /* Do this in the suspended state */
-# ifdef SERIAL_LINK_ENABLE
- serial_link_update();
-# endif
- suspend_power_down(); // on AVR this deep sleeps for 15ms
- /* Remote wakeup */
- if (suspend_wakeup_condition()) {
- usbWakeupHost(&USB_DRIVER);
- restart_usb_driver(&USB_DRIVER);
- }
- }
- /* Woken up */
- // variables has been already cleared by the wakeup hook
- send_keyboard_report();
-# ifdef MOUSEKEY_ENABLE
- mousekey_send();
-# endif /* MOUSEKEY_ENABLE */
-
-# ifdef VISUALIZER_ENABLE
- visualizer_resume();
-# endif
- }
-#endif
-
- keyboard_task();
-#ifdef CONSOLE_ENABLE
- console_task();
-#endif
-#ifdef MIDI_ENABLE
- midi_ep_task();
-#endif
-#ifdef VIRTSER_ENABLE
- virtser_task();
-#endif
-#ifdef RAW_ENABLE
- raw_hid_task();
-#endif
-
- // Run housekeeping
- housekeeping_task();
- }
-}
diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c
index 8ddb8b1c4b..e638dbc0fb 100644
--- a/tmk_core/protocol/lufa/lufa.c
+++ b/tmk_core/protocol/lufa/lufa.c
@@ -1033,18 +1033,16 @@ static void setup_usb(void) {
USB_Device_EnableSOFEvents();
}
-/** \brief Main
- *
- * FIXME: Needs doc
- */
-int main(void) __attribute__((weak));
-int main(void) {
+void protocol_setup(void) {
#ifdef MIDI_ENABLE
setup_midi();
#endif
setup_mcu();
keyboard_setup();
+}
+
+void protocol_init(void) {
setup_usb();
sei();
@@ -1078,57 +1076,55 @@ int main(void) {
#endif
print("Keyboard start.\n");
- while (1) {
+}
+
+void protocol_task(void) {
#if !defined(NO_USB_STARTUP_CHECK)
- if (USB_DeviceState == DEVICE_STATE_Suspended) {
- print("[s]");
- while (USB_DeviceState == DEVICE_STATE_Suspended) {
- suspend_power_down();
- if (USB_Device_RemoteWakeupEnabled && suspend_wakeup_condition()) {
- USB_Device_SendRemoteWakeup();
- clear_keyboard();
+ if (USB_DeviceState == DEVICE_STATE_Suspended) {
+ print("[s]");
+ while (USB_DeviceState == DEVICE_STATE_Suspended) {
+ suspend_power_down();
+ if (USB_Device_RemoteWakeupEnabled && suspend_wakeup_condition()) {
+ USB_Device_SendRemoteWakeup();
+ clear_keyboard();
# 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);
+ // 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
- }
}
- suspend_wakeup_init();
}
+ suspend_wakeup_init();
+ }
#endif
- keyboard_task();
+ keyboard_task();
#ifdef MIDI_ENABLE
- MIDI_Device_USBTask(&USB_MIDI_Interface);
+ MIDI_Device_USBTask(&USB_MIDI_Interface);
#endif
#ifdef MODULE_ADAFRUIT_BLE
- adafruit_ble_task();
+ adafruit_ble_task();
#endif
#ifdef VIRTSER_ENABLE
- virtser_task();
- CDC_Device_USBTask(&cdc_device);
+ virtser_task();
+ CDC_Device_USBTask(&cdc_device);
#endif
#ifdef RAW_ENABLE
- raw_hid_task();
+ raw_hid_task();
#endif
#if !defined(INTERRUPT_CONTROL_ENDPOINT)
- USB_USBTask();
+ USB_USBTask();
#endif
-
- // Run housekeeping
- housekeeping_task();
- }
}
uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, const uint16_t wIndex, const void **const DescriptorAddress) { return get_usb_descriptor(wValue, wIndex, DescriptorAddress); }
diff --git a/tmk_core/protocol/vusb.mk b/tmk_core/protocol/vusb.mk
index e4d013b38d..5572597e21 100644
--- a/tmk_core/protocol/vusb.mk
+++ b/tmk_core/protocol/vusb.mk
@@ -3,7 +3,7 @@ VUSB_DIR = protocol/vusb
# Path to the V-USB library
VUSB_PATH = $(LIB_PATH)/vusb
-SRC += $(VUSB_DIR)/main.c \
+SRC += $(VUSB_DIR)/protocol.c \
$(VUSB_DIR)/vusb.c \
$(VUSB_DIR)/usb_util.c \
$(VUSB_PATH)/usbdrv/usbdrv.c \
diff --git a/tmk_core/protocol/vusb/main.c b/tmk_core/protocol/vusb/main.c
deleted file mode 100644
index 53926a7493..0000000000
--- a/tmk_core/protocol/vusb/main.c
+++ /dev/null
@@ -1,179 +0,0 @@
-/* Name: main.c
- * Project: hid-mouse, a very simple HID example
- * Author: Christian Starkjohann
- * Creation Date: 2008-04-07
- * Tabsize: 4
- * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: main.c 790 2010-05-30 21:00:26Z cs $
- */
-
-#include
-
-#include
-#include
-#include
-#include
-
-#include
-
-#include "vusb.h"
-
-#include "keyboard.h"
-#include "host.h"
-#include "timer.h"
-#include "print.h"
-#include "suspend.h"
-#include "wait.h"
-#include "sendchar.h"
-
-#ifdef SLEEP_LED_ENABLE
-# include "sleep_led.h"
-#endif
-
-#ifdef CONSOLE_ENABLE
-void console_task(void);
-#endif
-
-#ifdef RAW_ENABLE
-void raw_hid_task(void);
-#endif
-
-/* This is from main.c of USBaspLoader */
-static void initForUsbConnectivity(void) {
- uint8_t i = 0;
-
- usbInit();
- /* enforce USB re-enumerate: */
- usbDeviceDisconnect(); /* do this while interrupts are disabled */
- while (--i) { /* fake USB disconnect for > 250 ms */
- wdt_reset();
- wait_ms(1);
- }
- usbDeviceConnect();
-}
-
-static void vusb_send_remote_wakeup(void) {
- cli();
-
- uint8_t ddr_orig = USBDDR;
- USBOUT |= (1 << USBMINUS);
- USBDDR = ddr_orig | USBMASK;
- USBOUT ^= USBMASK;
-
- wait_ms(25);
-
- USBOUT ^= USBMASK;
- USBDDR = ddr_orig;
- USBOUT &= ~(1 << USBMINUS);
-
- sei();
-}
-
-bool vusb_suspended = false;
-
-static void vusb_suspend(void) {
- vusb_suspended = true;
-
-#ifdef SLEEP_LED_ENABLE
- sleep_led_enable();
-#endif
-
- suspend_power_down();
-}
-
-#if USB_COUNT_SOF
-static void vusb_wakeup(void) {
- vusb_suspended = false;
- suspend_wakeup_init();
-
-# ifdef SLEEP_LED_ENABLE
- sleep_led_disable();
-# endif
-}
-#endif
-
-/** \brief Setup USB
- *
- * FIXME: Needs doc
- */
-static void setup_usb(void) { initForUsbConnectivity(); }
-
-/** \brief Main
- *
- * FIXME: Needs doc
- */
-int main(void) __attribute__((weak));
-int main(void) {
-#if USB_COUNT_SOF
- uint16_t sof_timer = timer_read();
-#endif
-
-#ifdef CLKPR
- // avoid unintentional changes of clock frequency in devices that have a
- // clock prescaler
- clock_prescale_set(clock_div_1);
-#endif
- keyboard_setup();
- setup_usb();
- sei();
- keyboard_init();
- host_set_driver(vusb_driver());
-
- wait_ms(50);
-
-#ifdef SLEEP_LED_ENABLE
- sleep_led_init();
-#endif
-
- while (1) {
-#if USB_COUNT_SOF
- if (usbSofCount != 0) {
- usbSofCount = 0;
- sof_timer = timer_read();
- if (vusb_suspended) {
- vusb_wakeup();
- }
- } else {
- // Suspend when no SOF in 3ms-10ms(7.1.7.4 Suspending of USB1.1)
- if (!vusb_suspended && timer_elapsed(sof_timer) > 5) {
- vusb_suspend();
- }
- }
-#endif
- if (vusb_suspended) {
- vusb_suspend();
- if (suspend_wakeup_condition()) {
- vusb_send_remote_wakeup();
- }
- } else {
- usbPoll();
-
- // TODO: configuration process is inconsistent. it sometime fails.
- // To prevent failing to configure NOT scan keyboard during configuration
- if (usbConfiguration && usbInterruptIsReady()) {
- keyboard_task();
- }
- vusb_transfer_keyboard();
-
-#ifdef RAW_ENABLE
- usbPoll();
-
- if (usbConfiguration && usbInterruptIsReady3()) {
- raw_hid_task();
- }
-#endif
-
-#ifdef CONSOLE_ENABLE
- usbPoll();
-
- if (usbConfiguration && usbInterruptIsReady3()) {
- console_task();
- }
-#endif
-
- // Run housekeeping
- housekeeping_task();
- }
- }
-}
diff --git a/tmk_core/protocol/vusb/protocol.c b/tmk_core/protocol/vusb/protocol.c
new file mode 100644
index 0000000000..89dc795b21
--- /dev/null
+++ b/tmk_core/protocol/vusb/protocol.c
@@ -0,0 +1,178 @@
+/* Name: main.c
+ * Project: hid-mouse, a very simple HID example
+ * Author: Christian Starkjohann
+ * Creation Date: 2008-04-07
+ * Tabsize: 4
+ * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH
+ * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
+ * This Revision: $Id: main.c 790 2010-05-30 21:00:26Z cs $
+ */
+
+#include
+
+#include
+#include
+#include
+#include
+
+#include
+
+#include "vusb.h"
+
+#include "keyboard.h"
+#include "host.h"
+#include "timer.h"
+#include "print.h"
+#include "suspend.h"
+#include "wait.h"
+#include "sendchar.h"
+
+#ifdef SLEEP_LED_ENABLE
+# include "sleep_led.h"
+#endif
+
+#ifdef CONSOLE_ENABLE
+void console_task(void);
+#endif
+
+#ifdef RAW_ENABLE
+void raw_hid_task(void);
+#endif
+
+/* This is from main.c of USBaspLoader */
+static void initForUsbConnectivity(void) {
+ uint8_t i = 0;
+
+ usbInit();
+ /* enforce USB re-enumerate: */
+ usbDeviceDisconnect(); /* do this while interrupts are disabled */
+ while (--i) { /* fake USB disconnect for > 250 ms */
+ wdt_reset();
+ wait_ms(1);
+ }
+ usbDeviceConnect();
+}
+
+static void vusb_send_remote_wakeup(void) {
+ cli();
+
+ uint8_t ddr_orig = USBDDR;
+ USBOUT |= (1 << USBMINUS);
+ USBDDR = ddr_orig | USBMASK;
+ USBOUT ^= USBMASK;
+
+ wait_ms(25);
+
+ USBOUT ^= USBMASK;
+ USBDDR = ddr_orig;
+ USBOUT &= ~(1 << USBMINUS);
+
+ sei();
+}
+
+bool vusb_suspended = false;
+
+static void vusb_suspend(void) {
+ vusb_suspended = true;
+
+#ifdef SLEEP_LED_ENABLE
+ sleep_led_enable();
+#endif
+
+ suspend_power_down();
+}
+
+#if USB_COUNT_SOF
+static void vusb_wakeup(void) {
+ vusb_suspended = false;
+ suspend_wakeup_init();
+
+# ifdef SLEEP_LED_ENABLE
+ sleep_led_disable();
+# endif
+}
+#endif
+
+/** \brief Setup USB
+ *
+ * FIXME: Needs doc
+ */
+static void setup_usb(void) { initForUsbConnectivity(); }
+
+uint16_t sof_timer = 0;
+
+void protocol_setup(void) {
+#if USB_COUNT_SOF
+ sof_timer = timer_read();
+#endif
+
+#ifdef CLKPR
+ // avoid unintentional changes of clock frequency in devices that have a
+ // clock prescaler
+ clock_prescale_set(clock_div_1);
+#endif
+ keyboard_setup();
+}
+
+void protocol_init(void) {
+ setup_usb();
+ sei();
+
+ keyboard_init();
+
+ host_set_driver(vusb_driver());
+
+ wait_ms(50);
+
+#ifdef SLEEP_LED_ENABLE
+ sleep_led_init();
+#endif
+}
+
+void protocol_task(void) {
+#if USB_COUNT_SOF
+ if (usbSofCount != 0) {
+ usbSofCount = 0;
+ sof_timer = timer_read();
+ if (vusb_suspended) {
+ vusb_wakeup();
+ }
+ } else {
+ // Suspend when no SOF in 3ms-10ms(7.1.7.4 Suspending of USB1.1)
+ if (!vusb_suspended && timer_elapsed(sof_timer) > 5) {
+ vusb_suspend();
+ }
+ }
+#endif
+ if (vusb_suspended) {
+ vusb_suspend();
+ if (suspend_wakeup_condition()) {
+ vusb_send_remote_wakeup();
+ }
+ } else {
+ usbPoll();
+
+ // TODO: configuration process is inconsistent. it sometime fails.
+ // To prevent failing to configure NOT scan keyboard during configuration
+ if (usbConfiguration && usbInterruptIsReady()) {
+ keyboard_task();
+ }
+ vusb_transfer_keyboard();
+
+#ifdef RAW_ENABLE
+ usbPoll();
+
+ if (usbConfiguration && usbInterruptIsReady3()) {
+ raw_hid_task();
+ }
+#endif
+
+#ifdef CONSOLE_ENABLE
+ usbPoll();
+
+ if (usbConfiguration && usbInterruptIsReady3()) {
+ console_task();
+ }
+#endif
+ }
+}
--
cgit v1.2.3