Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Begin to carve out platform/protocol API - Single main loop #13843

Merged
merged 2 commits into from
Aug 17, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions build_keyboard.mk
Original file line number Diff line number Diff line change
Expand Up @@ -338,9 +338,11 @@ ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","")
endif

# project specific files
SRC += $(KEYBOARD_SRC) \
SRC += \
$(KEYBOARD_SRC) \
$(KEYMAP_C) \
$(QUANTUM_SRC)
$(QUANTUM_SRC) \
$(QUANTUM_DIR)/main.c \

# Optimize size but this may cause error "relocation truncated to fit"
#EXTRALDFLAGS = -Wl,--relax
Expand Down
41 changes: 41 additions & 0 deletions quantum/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/* 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 <http://www.gnu.org/licenses/>.
*/

#include "keyboard.h"

void platform_setup(void);

void protocol_setup(void);
void protocol_init(void);
void protocol_task(void);

/** \brief Main
*
* FIXME: Needs doc
*/
int main(void) __attribute__((weak));
int main(void) {
platform_setup();
protocol_setup();

protocol_init();

/* Main loop */
while (true) {
protocol_task();
housekeeping_task();
}
}
1 change: 1 addition & 0 deletions tmk_core/common.mk
Original file line number Diff line number Diff line change
Expand Up @@ -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 \
Expand Down
21 changes: 21 additions & 0 deletions tmk_core/common/arm_atsam/platform.c
Original file line number Diff line number Diff line change
@@ -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 <http://www.gnu.org/licenses/>.
*/

#include "platform_deps.h"

void platform_setup(void) {
// do nothing
}
21 changes: 21 additions & 0 deletions tmk_core/common/avr/platform.c
Original file line number Diff line number Diff line change
@@ -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 <http://www.gnu.org/licenses/>.
*/

#include "platform_deps.h"

void platform_setup(void) {
// do nothing
}
22 changes: 22 additions & 0 deletions tmk_core/common/chibios/platform.c
Original file line number Diff line number Diff line change
@@ -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 <http://www.gnu.org/licenses/>.
*/

#include "platform_deps.h"

void platform_setup(void) {
halInit();
chSysInit();
}
21 changes: 21 additions & 0 deletions tmk_core/common/test/platform.c
Original file line number Diff line number Diff line change
@@ -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 <http://www.gnu.org/licenses/>.
*/

#include "platform_deps.h"

void platform_setup(void) {
// do nothing
}
2 changes: 1 addition & 1 deletion tmk_core/protocol/chibios.mk
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,18 +138,14 @@ void boardInit(void) {
board_init();
}

/* Main thread
*/
int main(void) {
/* ChibiOS/RT init */
halInit();
chSysInit();

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);
Expand Down Expand Up @@ -207,57 +203,53 @@ int main(void) {
#endif

print("Keyboard start.\n");
}

/* Main loop */
while (true) {
usb_event_queue_task();
void protocol_task(void) {
usb_event_queue_task();

#if !defined(NO_USB_STARTUP_CHECK)
if (USB_DRIVER.state == USB_SUSPENDED) {
print("[s]");
if (USB_DRIVER.state == USB_SUSPENDED) {
print("[s]");
# ifdef VISUALIZER_ENABLE
visualizer_suspend();
visualizer_suspend();
# endif
while (USB_DRIVER.state == USB_SUSPENDED) {
/* Do this in the suspended state */
while (USB_DRIVER.state == USB_SUSPENDED) {
/* Do this in the suspended state */
# ifdef SERIAL_LINK_ENABLE
serial_link_update();
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);
}
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();
}
/* Woken up */
// variables has been already cleared by the wakeup hook
send_keyboard_report();
# ifdef MOUSEKEY_ENABLE
mousekey_send();
mousekey_send();
# endif /* MOUSEKEY_ENABLE */

# ifdef VISUALIZER_ENABLE
visualizer_resume();
visualizer_resume();
# endif
}
}
#endif

keyboard_task();
keyboard_task();
#ifdef CONSOLE_ENABLE
console_task();
console_task();
#endif
#ifdef MIDI_ENABLE
midi_ep_task();
midi_ep_task();
#endif
#ifdef VIRTSER_ENABLE
virtser_task();
virtser_task();
#endif
#ifdef RAW_ENABLE
raw_hid_task();
raw_hid_task();
#endif

// Run housekeeping
housekeeping_task();
}
}
64 changes: 30 additions & 34 deletions tmk_core/protocol/lufa/lufa.c
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down Expand Up @@ -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); }
2 changes: 1 addition & 1 deletion tmk_core/protocol/vusb.mk
Original file line number Diff line number Diff line change
Expand Up @@ -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 \
Expand Down
Loading