diff options
author | Joel Challis <git@zvecr.com> | 2021-08-18 00:11:07 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-18 00:11:07 +0100 |
commit | 96e2b13d1de227cdc2b918fb0292bd832d346a25 (patch) | |
tree | 0a558972c834d47728acaa41c043165592c5ceb5 | |
parent | 4c9003b1779b7b404e3bb0ce103db683bd92bccb (diff) | |
download | qmk_firmware-96e2b13d1de227cdc2b918fb0292bd832d346a25.tar.gz qmk_firmware-96e2b13d1de227cdc2b918fb0292bd832d346a25.zip |
Begin to carve out platform/protocol API - Single main loop (#13843)
* Begin to carve out platform/protocol API
* Fix up after rebase
-rw-r--r-- | build_keyboard.mk | 6 | ||||
-rw-r--r-- | quantum/main.c | 41 | ||||
-rw-r--r-- | tmk_core/common.mk | 1 | ||||
-rw-r--r-- | tmk_core/common/arm_atsam/platform.c | 21 | ||||
-rw-r--r-- | tmk_core/common/avr/platform.c | 21 | ||||
-rw-r--r-- | tmk_core/common/chibios/platform.c | 22 | ||||
-rw-r--r-- | tmk_core/common/test/platform.c | 21 | ||||
-rw-r--r-- | tmk_core/protocol/chibios.mk | 2 | ||||
-rw-r--r-- | tmk_core/protocol/chibios/chibios.c (renamed from tmk_core/protocol/chibios/main.c) | 66 | ||||
-rw-r--r-- | tmk_core/protocol/lufa/lufa.c | 64 | ||||
-rw-r--r-- | tmk_core/protocol/vusb.mk | 2 | ||||
-rw-r--r-- | tmk_core/protocol/vusb/protocol.c (renamed from tmk_core/protocol/vusb/main.c) | 89 |
12 files changed, 236 insertions, 120 deletions
diff --git a/build_keyboard.mk b/build_keyboard.mk index 62a7ba6a0..46d1e4566 100644 --- a/build_keyboard.mk +++ b/build_keyboard.mk | |||
@@ -338,9 +338,11 @@ ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","") | |||
338 | endif | 338 | endif |
339 | 339 | ||
340 | # project specific files | 340 | # project specific files |
341 | SRC += $(KEYBOARD_SRC) \ | 341 | SRC += \ |
342 | $(KEYBOARD_SRC) \ | ||
342 | $(KEYMAP_C) \ | 343 | $(KEYMAP_C) \ |
343 | $(QUANTUM_SRC) | 344 | $(QUANTUM_SRC) \ |
345 | $(QUANTUM_DIR)/main.c \ | ||
344 | 346 | ||
345 | # Optimize size but this may cause error "relocation truncated to fit" | 347 | # Optimize size but this may cause error "relocation truncated to fit" |
346 | #EXTRALDFLAGS = -Wl,--relax | 348 | #EXTRALDFLAGS = -Wl,--relax |
diff --git a/quantum/main.c b/quantum/main.c new file mode 100644 index 000000000..2cbcd73d8 --- /dev/null +++ b/quantum/main.c | |||
@@ -0,0 +1,41 @@ | |||
1 | /* Copyright 2021 QMK | ||
2 | * | ||
3 | * This program is free software: you can redistribute it and/or modify | ||
4 | * it under the terms of the GNU General Public License as published by | ||
5 | * the Free Software Foundation, either version 3 of the License, or | ||
6 | * (at your option) any later version. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | |||
17 | #include "keyboard.h" | ||
18 | |||
19 | void platform_setup(void); | ||
20 | |||
21 | void protocol_setup(void); | ||
22 | void protocol_init(void); | ||
23 | void protocol_task(void); | ||
24 | |||
25 | /** \brief Main | ||
26 | * | ||
27 | * FIXME: Needs doc | ||
28 | */ | ||
29 | int main(void) __attribute__((weak)); | ||
30 | int main(void) { | ||
31 | platform_setup(); | ||
32 | protocol_setup(); | ||
33 | |||
34 | protocol_init(); | ||
35 | |||
36 | /* Main loop */ | ||
37 | while (true) { | ||
38 | protocol_task(); | ||
39 | housekeeping_task(); | ||
40 | } | ||
41 | } | ||
diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 923a736d3..57de8d95e 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk | |||
@@ -12,6 +12,7 @@ TMK_COMMON_SRC += $(COMMON_DIR)/host.c \ | |||
12 | $(COMMON_DIR)/report.c \ | 12 | $(COMMON_DIR)/report.c \ |
13 | $(COMMON_DIR)/sync_timer.c \ | 13 | $(COMMON_DIR)/sync_timer.c \ |
14 | $(COMMON_DIR)/usb_util.c \ | 14 | $(COMMON_DIR)/usb_util.c \ |
15 | $(PLATFORM_COMMON_DIR)/platform.c \ | ||
15 | $(PLATFORM_COMMON_DIR)/suspend.c \ | 16 | $(PLATFORM_COMMON_DIR)/suspend.c \ |
16 | $(PLATFORM_COMMON_DIR)/timer.c \ | 17 | $(PLATFORM_COMMON_DIR)/timer.c \ |
17 | $(PLATFORM_COMMON_DIR)/bootloader.c \ | 18 | $(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 000000000..3e35b4fe4 --- /dev/null +++ b/tmk_core/common/arm_atsam/platform.c | |||
@@ -0,0 +1,21 @@ | |||
1 | /* Copyright 2021 QMK | ||
2 | * | ||
3 | * This program is free software: you can redistribute it and/or modify | ||
4 | * it under the terms of the GNU General Public License as published by | ||
5 | * the Free Software Foundation, either version 3 of the License, or | ||
6 | * (at your option) any later version. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | |||
17 | #include "platform_deps.h" | ||
18 | |||
19 | void platform_setup(void) { | ||
20 | // do nothing | ||
21 | } | ||
diff --git a/tmk_core/common/avr/platform.c b/tmk_core/common/avr/platform.c new file mode 100644 index 000000000..3e35b4fe4 --- /dev/null +++ b/tmk_core/common/avr/platform.c | |||
@@ -0,0 +1,21 @@ | |||
1 | /* Copyright 2021 QMK | ||
2 | * | ||
3 | * This program is free software: you can redistribute it and/or modify | ||
4 | * it under the terms of the GNU General Public License as published by | ||
5 | * the Free Software Foundation, either version 3 of the License, or | ||
6 | * (at your option) any later version. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | |||
17 | #include "platform_deps.h" | ||
18 | |||
19 | void platform_setup(void) { | ||
20 | // do nothing | ||
21 | } | ||
diff --git a/tmk_core/common/chibios/platform.c b/tmk_core/common/chibios/platform.c new file mode 100644 index 000000000..d4a229f27 --- /dev/null +++ b/tmk_core/common/chibios/platform.c | |||
@@ -0,0 +1,22 @@ | |||
1 | /* Copyright 2021 QMK | ||
2 | * | ||
3 | * This program is free software: you can redistribute it and/or modify | ||
4 | * it under the terms of the GNU General Public License as published by | ||
5 | * the Free Software Foundation, either version 3 of the License, or | ||
6 | * (at your option) any later version. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | |||
17 | #include "platform_deps.h" | ||
18 | |||
19 | void platform_setup(void) { | ||
20 | halInit(); | ||
21 | chSysInit(); | ||
22 | } \ 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 000000000..8ddceeda8 --- /dev/null +++ b/tmk_core/common/test/platform.c | |||
@@ -0,0 +1,21 @@ | |||
1 | /* Copyright 2021 QMK | ||
2 | * | ||
3 | * This program is free software: you can redistribute it and/or modify | ||
4 | * it under the terms of the GNU General Public License as published by | ||
5 | * the Free Software Foundation, either version 3 of the License, or | ||
6 | * (at your option) any later version. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
15 | */ | ||
16 | |||
17 | #include "platform_deps.h" | ||
18 | |||
19 | void platform_setup(void) { | ||
20 | // do nothing | ||
21 | } \ No newline at end of file | ||
diff --git a/tmk_core/protocol/chibios.mk b/tmk_core/protocol/chibios.mk index d01697835..a7f2d8e93 100644 --- a/tmk_core/protocol/chibios.mk +++ b/tmk_core/protocol/chibios.mk | |||
@@ -3,7 +3,7 @@ CHIBIOS_DIR = $(PROTOCOL_DIR)/chibios | |||
3 | 3 | ||
4 | 4 | ||
5 | SRC += $(CHIBIOS_DIR)/usb_main.c | 5 | SRC += $(CHIBIOS_DIR)/usb_main.c |
6 | SRC += $(CHIBIOS_DIR)/main.c | 6 | SRC += $(CHIBIOS_DIR)/chibios.c |
7 | SRC += usb_descriptor.c | 7 | SRC += usb_descriptor.c |
8 | SRC += $(CHIBIOS_DIR)/usb_driver.c | 8 | SRC += $(CHIBIOS_DIR)/usb_driver.c |
9 | SRC += $(CHIBIOS_DIR)/usb_util.c | 9 | SRC += $(CHIBIOS_DIR)/usb_util.c |
diff --git a/tmk_core/protocol/chibios/main.c b/tmk_core/protocol/chibios/chibios.c index e41d6ff19..78a2e3fcb 100644 --- a/tmk_core/protocol/chibios/main.c +++ b/tmk_core/protocol/chibios/chibios.c | |||
@@ -138,18 +138,14 @@ void boardInit(void) { | |||
138 | board_init(); | 138 | board_init(); |
139 | } | 139 | } |
140 | 140 | ||
141 | /* Main thread | 141 | void protocol_setup(void) { |
142 | */ | ||
143 | int main(void) { | ||
144 | /* ChibiOS/RT init */ | ||
145 | halInit(); | ||
146 | chSysInit(); | ||
147 | |||
148 | // TESTING | 142 | // TESTING |
149 | // chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); | 143 | // chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); |
150 | 144 | ||
151 | keyboard_setup(); | 145 | keyboard_setup(); |
146 | } | ||
152 | 147 | ||
148 | void protocol_init(void) { | ||
153 | /* Init USB */ | 149 | /* Init USB */ |
154 | usb_event_queue_init(); | 150 | usb_event_queue_init(); |
155 | init_usb_driver(&USB_DRIVER); | 151 | init_usb_driver(&USB_DRIVER); |
@@ -207,57 +203,53 @@ int main(void) { | |||
207 | #endif | 203 | #endif |
208 | 204 | ||
209 | print("Keyboard start.\n"); | 205 | print("Keyboard start.\n"); |
206 | } | ||
210 | 207 | ||
211 | /* Main loop */ | 208 | void protocol_task(void) { |
212 | while (true) { | 209 | usb_event_queue_task(); |
213 | usb_event_queue_task(); | ||
214 | 210 | ||
215 | #if !defined(NO_USB_STARTUP_CHECK) | 211 | #if !defined(NO_USB_STARTUP_CHECK) |
216 | if (USB_DRIVER.state == USB_SUSPENDED) { | 212 | if (USB_DRIVER.state == USB_SUSPENDED) { |
217 | print("[s]"); | 213 | print("[s]"); |
218 | # ifdef VISUALIZER_ENABLE | 214 | # ifdef VISUALIZER_ENABLE |
219 | visualizer_suspend(); | 215 | visualizer_suspend(); |
220 | # endif | 216 | # endif |
221 | while (USB_DRIVER.state == USB_SUSPENDED) { | 217 | while (USB_DRIVER.state == USB_SUSPENDED) { |
222 | /* Do this in the suspended state */ | 218 | /* Do this in the suspended state */ |
223 | # ifdef SERIAL_LINK_ENABLE | 219 | # ifdef SERIAL_LINK_ENABLE |
224 | serial_link_update(); | 220 | serial_link_update(); |
225 | # endif | 221 | # endif |
226 | suspend_power_down(); // on AVR this deep sleeps for 15ms | 222 | suspend_power_down(); // on AVR this deep sleeps for 15ms |
227 | /* Remote wakeup */ | 223 | /* Remote wakeup */ |
228 | if (suspend_wakeup_condition()) { | 224 | if (suspend_wakeup_condition()) { |
229 | usbWakeupHost(&USB_DRIVER); | 225 | usbWakeupHost(&USB_DRIVER); |
230 | restart_usb_driver(&USB_DRIVER); | 226 | restart_usb_driver(&USB_DRIVER); |
231 | } | ||
232 | } | 227 | } |
233 | /* Woken up */ | 228 | } |
234 | // variables has been already cleared by the wakeup hook | 229 | /* Woken up */ |
235 | send_keyboard_report(); | 230 | // variables has been already cleared by the wakeup hook |
231 | send_keyboard_report(); | ||
236 | # ifdef MOUSEKEY_ENABLE | 232 | # ifdef MOUSEKEY_ENABLE |
237 | mousekey_send(); | 233 | mousekey_send(); |
238 | # endif /* MOUSEKEY_ENABLE */ | 234 | # endif /* MOUSEKEY_ENABLE */ |
239 | 235 | ||
240 | # ifdef VISUALIZER_ENABLE | 236 | # ifdef VISUALIZER_ENABLE |
241 | visualizer_resume(); | 237 | visualizer_resume(); |
242 | # endif | 238 | # endif |
243 | } | 239 | } |
244 | #endif | 240 | #endif |
245 | 241 | ||
246 | keyboard_task(); | 242 | keyboard_task(); |
247 | #ifdef CONSOLE_ENABLE | 243 | #ifdef CONSOLE_ENABLE |
248 | console_task(); | 244 | console_task(); |
249 | #endif | 245 | #endif |
250 | #ifdef MIDI_ENABLE | 246 | #ifdef MIDI_ENABLE |
251 | midi_ep_task(); | 247 | midi_ep_task(); |
252 | #endif | 248 | #endif |
253 | #ifdef VIRTSER_ENABLE | 249 | #ifdef VIRTSER_ENABLE |
254 | virtser_task(); | 250 | virtser_task(); |
255 | #endif | 251 | #endif |
256 | #ifdef RAW_ENABLE | 252 | #ifdef RAW_ENABLE |
257 | raw_hid_task(); | 253 | raw_hid_task(); |
258 | #endif | 254 | #endif |
259 | |||
260 | // Run housekeeping | ||
261 | housekeeping_task(); | ||
262 | } | ||
263 | } | 255 | } |
diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index 8ddb8b1c4..e638dbc0f 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c | |||
@@ -1033,18 +1033,16 @@ static void setup_usb(void) { | |||
1033 | USB_Device_EnableSOFEvents(); | 1033 | USB_Device_EnableSOFEvents(); |
1034 | } | 1034 | } |
1035 | 1035 | ||
1036 | /** \brief Main | 1036 | void protocol_setup(void) { |
1037 | * | ||
1038 | * FIXME: Needs doc | ||
1039 | */ | ||
1040 | int main(void) __attribute__((weak)); | ||
1041 | int main(void) { | ||
1042 | #ifdef MIDI_ENABLE | 1037 | #ifdef MIDI_ENABLE |
1043 | setup_midi(); | 1038 | setup_midi(); |
1044 | #endif | 1039 | #endif |
1045 | 1040 | ||
1046 | setup_mcu(); | 1041 | setup_mcu(); |
1047 | keyboard_setup(); | 1042 | keyboard_setup(); |
1043 | } | ||
1044 | |||
1045 | void protocol_init(void) { | ||
1048 | setup_usb(); | 1046 | setup_usb(); |
1049 | sei(); | 1047 | sei(); |
1050 | 1048 | ||
@@ -1078,57 +1076,55 @@ int main(void) { | |||
1078 | #endif | 1076 | #endif |
1079 | 1077 | ||
1080 | print("Keyboard start.\n"); | 1078 | print("Keyboard start.\n"); |
1081 | while (1) { | 1079 | } |
1080 | |||
1081 | void protocol_task(void) { | ||
1082 | #if !defined(NO_USB_STARTUP_CHECK) | 1082 | #if !defined(NO_USB_STARTUP_CHECK) |
1083 | if (USB_DeviceState == DEVICE_STATE_Suspended) { | 1083 | if (USB_DeviceState == DEVICE_STATE_Suspended) { |
1084 | print("[s]"); | 1084 | print("[s]"); |
1085 | while (USB_DeviceState == DEVICE_STATE_Suspended) { | 1085 | while (USB_DeviceState == DEVICE_STATE_Suspended) { |
1086 | suspend_power_down(); | 1086 | suspend_power_down(); |
1087 | if (USB_Device_RemoteWakeupEnabled && suspend_wakeup_condition()) { | 1087 | if (USB_Device_RemoteWakeupEnabled && suspend_wakeup_condition()) { |
1088 | USB_Device_SendRemoteWakeup(); | 1088 | USB_Device_SendRemoteWakeup(); |
1089 | clear_keyboard(); | 1089 | clear_keyboard(); |
1090 | 1090 | ||
1091 | # if USB_SUSPEND_WAKEUP_DELAY > 0 | 1091 | # if USB_SUSPEND_WAKEUP_DELAY > 0 |
1092 | // Some hubs, kvm switches, and monitors do | 1092 | // Some hubs, kvm switches, and monitors do |
1093 | // weird things, with USB device state bouncing | 1093 | // weird things, with USB device state bouncing |
1094 | // around wildly on wakeup, yielding race | 1094 | // around wildly on wakeup, yielding race |
1095 | // conditions that can corrupt the keyboard state. | 1095 | // conditions that can corrupt the keyboard state. |
1096 | // | 1096 | // |
1097 | // Pause for a while to let things settle... | 1097 | // Pause for a while to let things settle... |
1098 | wait_ms(USB_SUSPEND_WAKEUP_DELAY); | 1098 | wait_ms(USB_SUSPEND_WAKEUP_DELAY); |
1099 | # endif | 1099 | # endif |
1100 | } | ||
1101 | } | 1100 | } |
1102 | suspend_wakeup_init(); | ||
1103 | } | 1101 | } |
1102 | suspend_wakeup_init(); | ||
1103 | } | ||
1104 | #endif | 1104 | #endif |
1105 | 1105 | ||
1106 | keyboard_task(); | 1106 | keyboard_task(); |
1107 | 1107 | ||
1108 | #ifdef MIDI_ENABLE | 1108 | #ifdef MIDI_ENABLE |
1109 | MIDI_Device_USBTask(&USB_MIDI_Interface); | 1109 | MIDI_Device_USBTask(&USB_MIDI_Interface); |
1110 | #endif | 1110 | #endif |
1111 | 1111 | ||
1112 | #ifdef MODULE_ADAFRUIT_BLE | 1112 | #ifdef MODULE_ADAFRUIT_BLE |
1113 | adafruit_ble_task(); | 1113 | adafruit_ble_task(); |
1114 | #endif | 1114 | #endif |
1115 | 1115 | ||
1116 | #ifdef VIRTSER_ENABLE | 1116 | #ifdef VIRTSER_ENABLE |
1117 | virtser_task(); | 1117 | virtser_task(); |
1118 | CDC_Device_USBTask(&cdc_device); | 1118 | CDC_Device_USBTask(&cdc_device); |
1119 | #endif | 1119 | #endif |
1120 | 1120 | ||
1121 | #ifdef RAW_ENABLE | 1121 | #ifdef RAW_ENABLE |
1122 | raw_hid_task(); | 1122 | raw_hid_task(); |
1123 | #endif | 1123 | #endif |
1124 | 1124 | ||
1125 | #if !defined(INTERRUPT_CONTROL_ENDPOINT) | 1125 | #if !defined(INTERRUPT_CONTROL_ENDPOINT) |
1126 | USB_USBTask(); | 1126 | USB_USBTask(); |
1127 | #endif | 1127 | #endif |
1128 | |||
1129 | // Run housekeeping | ||
1130 | housekeeping_task(); | ||
1131 | } | ||
1132 | } | 1128 | } |
1133 | 1129 | ||
1134 | uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, const uint16_t wIndex, const void **const DescriptorAddress) { return get_usb_descriptor(wValue, wIndex, DescriptorAddress); } | 1130 | 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 e4d013b38..5572597e2 100644 --- a/tmk_core/protocol/vusb.mk +++ b/tmk_core/protocol/vusb.mk | |||
@@ -3,7 +3,7 @@ VUSB_DIR = protocol/vusb | |||
3 | # Path to the V-USB library | 3 | # Path to the V-USB library |
4 | VUSB_PATH = $(LIB_PATH)/vusb | 4 | VUSB_PATH = $(LIB_PATH)/vusb |
5 | 5 | ||
6 | SRC += $(VUSB_DIR)/main.c \ | 6 | SRC += $(VUSB_DIR)/protocol.c \ |
7 | $(VUSB_DIR)/vusb.c \ | 7 | $(VUSB_DIR)/vusb.c \ |
8 | $(VUSB_DIR)/usb_util.c \ | 8 | $(VUSB_DIR)/usb_util.c \ |
9 | $(VUSB_PATH)/usbdrv/usbdrv.c \ | 9 | $(VUSB_PATH)/usbdrv/usbdrv.c \ |
diff --git a/tmk_core/protocol/vusb/main.c b/tmk_core/protocol/vusb/protocol.c index 53926a749..89dc795b2 100644 --- a/tmk_core/protocol/vusb/main.c +++ b/tmk_core/protocol/vusb/protocol.c | |||
@@ -99,14 +99,11 @@ static void vusb_wakeup(void) { | |||
99 | */ | 99 | */ |
100 | static void setup_usb(void) { initForUsbConnectivity(); } | 100 | static void setup_usb(void) { initForUsbConnectivity(); } |
101 | 101 | ||
102 | /** \brief Main | 102 | uint16_t sof_timer = 0; |
103 | * | 103 | |
104 | * FIXME: Needs doc | 104 | void protocol_setup(void) { |
105 | */ | ||
106 | int main(void) __attribute__((weak)); | ||
107 | int main(void) { | ||
108 | #if USB_COUNT_SOF | 105 | #if USB_COUNT_SOF |
109 | uint16_t sof_timer = timer_read(); | 106 | sof_timer = timer_read(); |
110 | #endif | 107 | #endif |
111 | 108 | ||
112 | #ifdef CLKPR | 109 | #ifdef CLKPR |
@@ -115,9 +112,14 @@ int main(void) { | |||
115 | clock_prescale_set(clock_div_1); | 112 | clock_prescale_set(clock_div_1); |
116 | #endif | 113 | #endif |
117 | keyboard_setup(); | 114 | keyboard_setup(); |
115 | } | ||
116 | |||
117 | void protocol_init(void) { | ||
118 | setup_usb(); | 118 | setup_usb(); |
119 | sei(); | 119 | sei(); |
120 | |||
120 | keyboard_init(); | 121 | keyboard_init(); |
122 | |||
121 | host_set_driver(vusb_driver()); | 123 | host_set_driver(vusb_driver()); |
122 | 124 | ||
123 | wait_ms(50); | 125 | wait_ms(50); |
@@ -125,55 +127,52 @@ int main(void) { | |||
125 | #ifdef SLEEP_LED_ENABLE | 127 | #ifdef SLEEP_LED_ENABLE |
126 | sleep_led_init(); | 128 | sleep_led_init(); |
127 | #endif | 129 | #endif |
130 | } | ||
128 | 131 | ||
129 | while (1) { | 132 | void protocol_task(void) { |
130 | #if USB_COUNT_SOF | 133 | #if USB_COUNT_SOF |
131 | if (usbSofCount != 0) { | 134 | if (usbSofCount != 0) { |
132 | usbSofCount = 0; | 135 | usbSofCount = 0; |
133 | sof_timer = timer_read(); | 136 | sof_timer = timer_read(); |
134 | if (vusb_suspended) { | ||
135 | vusb_wakeup(); | ||
136 | } | ||
137 | } else { | ||
138 | // Suspend when no SOF in 3ms-10ms(7.1.7.4 Suspending of USB1.1) | ||
139 | if (!vusb_suspended && timer_elapsed(sof_timer) > 5) { | ||
140 | vusb_suspend(); | ||
141 | } | ||
142 | } | ||
143 | #endif | ||
144 | if (vusb_suspended) { | 137 | if (vusb_suspended) { |
138 | vusb_wakeup(); | ||
139 | } | ||
140 | } else { | ||
141 | // Suspend when no SOF in 3ms-10ms(7.1.7.4 Suspending of USB1.1) | ||
142 | if (!vusb_suspended && timer_elapsed(sof_timer) > 5) { | ||
145 | vusb_suspend(); | 143 | vusb_suspend(); |
146 | if (suspend_wakeup_condition()) { | 144 | } |
147 | vusb_send_remote_wakeup(); | 145 | } |
148 | } | 146 | #endif |
149 | } else { | 147 | if (vusb_suspended) { |
150 | usbPoll(); | 148 | vusb_suspend(); |
151 | 149 | if (suspend_wakeup_condition()) { | |
152 | // TODO: configuration process is inconsistent. it sometime fails. | 150 | vusb_send_remote_wakeup(); |
153 | // To prevent failing to configure NOT scan keyboard during configuration | 151 | } |
154 | if (usbConfiguration && usbInterruptIsReady()) { | 152 | } else { |
155 | keyboard_task(); | 153 | usbPoll(); |
156 | } | 154 | |
157 | vusb_transfer_keyboard(); | 155 | // TODO: configuration process is inconsistent. it sometime fails. |
156 | // To prevent failing to configure NOT scan keyboard during configuration | ||
157 | if (usbConfiguration && usbInterruptIsReady()) { | ||
158 | keyboard_task(); | ||
159 | } | ||
160 | vusb_transfer_keyboard(); | ||
158 | 161 | ||
159 | #ifdef RAW_ENABLE | 162 | #ifdef RAW_ENABLE |
160 | usbPoll(); | 163 | usbPoll(); |
161 | 164 | ||
162 | if (usbConfiguration && usbInterruptIsReady3()) { | 165 | if (usbConfiguration && usbInterruptIsReady3()) { |
163 | raw_hid_task(); | 166 | raw_hid_task(); |
164 | } | 167 | } |
165 | #endif | 168 | #endif |
166 | 169 | ||
167 | #ifdef CONSOLE_ENABLE | 170 | #ifdef CONSOLE_ENABLE |
168 | usbPoll(); | 171 | usbPoll(); |
169 | 172 | ||
170 | if (usbConfiguration && usbInterruptIsReady3()) { | 173 | if (usbConfiguration && usbInterruptIsReady3()) { |
171 | console_task(); | 174 | console_task(); |
172 | } | ||
173 | #endif | ||
174 | |||
175 | // Run housekeeping | ||
176 | housekeeping_task(); | ||
177 | } | 175 | } |
176 | #endif | ||
178 | } | 177 | } |
179 | } | 178 | } |