diff --git a/platforms/eeprom.h b/platforms/eeprom.h index fbfef203341..8e69eecc4cb 100644 --- a/platforms/eeprom.h +++ b/platforms/eeprom.h @@ -22,6 +22,10 @@ void eeprom_update_dword(uint32_t *__p, uint32_t __value); void eeprom_update_block(const void *__src, void *__dst, size_t __n); #endif +static inline void eeprom_write_qword(uint64_t *__p, uint64_t __value) { + eeprom_update_block(&__value, __p, sizeof(uint64_t)); +} + #if defined(EEPROM_CUSTOM) # ifndef EEPROM_SIZE # error EEPROM_SIZE has not been defined for custom driver. diff --git a/quantum/eeconfig.c b/quantum/eeconfig.c index 99606fe6192..72c3fe74b97 100644 --- a/quantum/eeconfig.c +++ b/quantum/eeconfig.c @@ -23,6 +23,8 @@ void dynamic_keymap_reset(void); void dynamic_keymap_macro_reset(void); #endif +_Static_assert((intptr_t)EECONFIG_HANDEDNESS == 14, "EEPROM handedness offset is incorrect"); + /** \brief eeconfig enable * * FIXME: needs doc @@ -61,11 +63,9 @@ void eeconfig_init_quantum(void) { eeprom_update_byte(EECONFIG_AUDIO, 0); eeprom_update_dword(EECONFIG_RGBLIGHT, 0); eeprom_update_byte(EECONFIG_RGBLIGHT_EXTENDED, 0); - eeprom_update_byte(EECONFIG_UNUSED, 0); eeprom_update_byte(EECONFIG_UNICODEMODE, 0); eeprom_update_byte(EECONFIG_STENOMODE, 0); - uint64_t dummy = 0; - eeprom_update_block(&dummy, EECONFIG_RGB_MATRIX, sizeof(uint64_t)); + eeprom_write_qword(EECONFIG_RGB_MATRIX, 0); eeprom_update_dword(EECONFIG_HAPTIC, 0); #if defined(HAPTIC_ENABLE) haptic_reset(); diff --git a/quantum/eeconfig.h b/quantum/eeconfig.h index 718fe7c9064..59d19a11820 100644 --- a/quantum/eeconfig.h +++ b/quantum/eeconfig.h @@ -19,39 +19,59 @@ along with this program. If not, see . #include #include +#include // offsetof #include "eeprom.h" +#include "util.h" #ifndef EECONFIG_MAGIC_NUMBER -# define EECONFIG_MAGIC_NUMBER (uint16_t)0xFEE6 // When changing, decrement this value to avoid future re-init issues +# define EECONFIG_MAGIC_NUMBER (uint16_t)0xFEE5 // When changing, decrement this value to avoid future re-init issues #endif #define EECONFIG_MAGIC_NUMBER_OFF (uint16_t)0xFFFF +// Dummy struct only used to calculate offsets +typedef struct PACKED { + uint16_t magic; + uint8_t debug; + uint8_t default_layer; + uint16_t keymap; + uint8_t backlight; + uint8_t audio; + uint32_t rgblight; + uint8_t unicode; + uint8_t steno; + uint8_t handedness; + uint32_t keyboard; + uint32_t user; + union { // Mutually exclusive + uint32_t led_matrix; + uint64_t rgb_matrix; + }; + uint32_t haptic; + uint8_t rgblight_ext; + uint32_t keymap_hash; +} eeprom_core_t; + /* EEPROM parameter address */ -#define EECONFIG_MAGIC (uint16_t *)0 -#define EECONFIG_DEBUG (uint8_t *)2 -#define EECONFIG_DEFAULT_LAYER (uint8_t *)3 -#define EECONFIG_KEYMAP (uint16_t *)4 -#define EECONFIG_BACKLIGHT (uint8_t *)6 -#define EECONFIG_AUDIO (uint8_t *)7 -#define EECONFIG_RGBLIGHT (uint32_t *)8 -#define EECONFIG_UNICODEMODE (uint8_t *)12 -#define EECONFIG_STENOMODE (uint8_t *)13 -// EEHANDS for two handed boards -#define EECONFIG_HANDEDNESS (uint8_t *)14 -#define EECONFIG_KEYBOARD (uint32_t *)15 -#define EECONFIG_USER (uint32_t *)19 -#define EECONFIG_UNUSED (uint8_t *)23 -// Mutually exclusive -#define EECONFIG_LED_MATRIX (uint32_t *)24 -#define EECONFIG_RGB_MATRIX (uint64_t *)24 - -#define EECONFIG_HAPTIC (uint32_t *)32 -#define EECONFIG_RGBLIGHT_EXTENDED (uint8_t *)36 - -#define EECONFIG_KEYMAP_HASH (uint32_t *)37 +#define EECONFIG_MAGIC (uint16_t *)(offsetof(eeprom_core_t, magic)) +#define EECONFIG_DEBUG (uint8_t *)(offsetof(eeprom_core_t, debug)) +#define EECONFIG_DEFAULT_LAYER (uint8_t *)(offsetof(eeprom_core_t, default_layer)) +#define EECONFIG_KEYMAP (uint16_t *)(offsetof(eeprom_core_t, keymap)) +#define EECONFIG_BACKLIGHT (uint8_t *)(offsetof(eeprom_core_t, backlight)) +#define EECONFIG_AUDIO (uint8_t *)(offsetof(eeprom_core_t, audio)) +#define EECONFIG_RGBLIGHT (uint32_t *)(offsetof(eeprom_core_t, rgblight)) +#define EECONFIG_UNICODEMODE (uint8_t *)(offsetof(eeprom_core_t, unicode)) +#define EECONFIG_STENOMODE (uint8_t *)(offsetof(eeprom_core_t, steno)) +#define EECONFIG_HANDEDNESS (uint8_t *)(offsetof(eeprom_core_t, handedness)) +#define EECONFIG_KEYBOARD (uint32_t *)(offsetof(eeprom_core_t, keyboard)) +#define EECONFIG_USER (uint32_t *)(offsetof(eeprom_core_t, user)) +#define EECONFIG_LED_MATRIX (uint32_t *)(offsetof(eeprom_core_t, led_matrix)) +#define EECONFIG_RGB_MATRIX (uint64_t *)(offsetof(eeprom_core_t, rgb_matrix)) +#define EECONFIG_HAPTIC (uint32_t *)(offsetof(eeprom_core_t, haptic)) +#define EECONFIG_RGBLIGHT_EXTENDED (uint8_t *)(offsetof(eeprom_core_t, rgblight_ext)) +#define EECONFIG_KEYMAP_HASH (uint32_t *)(offsetof(eeprom_core_t, keymap_hash)) // Size of EEPROM being used for core data storage -#define EECONFIG_BASE_SIZE 41 +#define EECONFIG_BASE_SIZE ((uint8_t)sizeof(eeprom_core_t)) // Size of EEPROM dedicated to keyboard- and user-specific data #ifndef EECONFIG_KB_DATA_SIZE diff --git a/quantum/main.c b/quantum/main.c index 3b101c522c3..01a6cbf6d0b 100644 --- a/quantum/main.c +++ b/quantum/main.c @@ -25,22 +25,9 @@ void protocol_pre_task(void); void protocol_post_task(void); // Bodge as refactoring this area sucks.... -void protocol_init(void) __attribute__((weak)); -void protocol_init(void) { - protocol_pre_init(); - - keyboard_init(); - - protocol_post_init(); -} - -void protocol_task(void) __attribute__((weak)); -void protocol_task(void) { - protocol_pre_task(); - +void protocol_keyboard_task(void) __attribute__((weak)); +void protocol_keyboard_task(void) { keyboard_task(); - - protocol_post_task(); } /** \brief Main @@ -53,11 +40,30 @@ int main(void) { protocol_setup(); keyboard_setup(); - protocol_init(); + protocol_pre_init(); + keyboard_init(); + protocol_post_init(); /* Main loop */ while (true) { - protocol_task(); + protocol_pre_task(); + protocol_keyboard_task(); + protocol_post_task(); + +#ifdef RAW_ENABLE + void raw_hid_task(void); + raw_hid_task(); +#endif + +#ifdef XAP_ENABLE + void xap_task(void); + xap_task(); +#endif + +#ifdef CONSOLE_ENABLE + void console_task(void); + console_task(); +#endif #ifdef QUANTUM_PAINTER_ENABLE // Run Quantum Painter task diff --git a/tmk_core/protocol/chibios/chibios.c b/tmk_core/protocol/chibios/chibios.c index 2d5ad347a6a..360e6b4b046 100644 --- a/tmk_core/protocol/chibios/chibios.c +++ b/tmk_core/protocol/chibios/chibios.c @@ -70,17 +70,6 @@ host_driver_t chibios_driver = {keyboard_leds, send_keyboard, send_nkro, send_mo void virtser_task(void); #endif -#ifdef RAW_ENABLE -void raw_hid_task(void); -#endif - -#ifdef XAP_ENABLE -void xap_task(void); -#endif - -#ifdef CONSOLE_ENABLE -void console_task(void); -#endif #ifdef MIDI_ENABLE void midi_ep_task(void); #endif @@ -213,20 +202,11 @@ void protocol_pre_task(void) { } void protocol_post_task(void) { -#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 -#ifdef XAP_ENABLE - xap_task(); #endif usb_idle_task(); } diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index 7dd44d1ed21..9757c17f705 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -155,7 +155,7 @@ __attribute__((weak)) void raw_hid_receive(uint8_t *data, uint8_t length) { * * FIXME: Needs doc */ -static void raw_hid_task(void) { +void raw_hid_task(void) { // Create a temporary buffer to hold the read in data from the host uint8_t data[RAW_EPSIZE]; bool data_read = false; @@ -974,14 +974,6 @@ void protocol_post_task(void) { CDC_Device_USBTask(&cdc_device); #endif -#ifdef RAW_ENABLE - raw_hid_task(); -#endif - -#ifdef XAP_ENABLE - xap_task(); -#endif - #if !defined(INTERRUPT_CONTROL_ENDPOINT) USB_USBTask(); #endif diff --git a/tmk_core/protocol/vusb/protocol.c b/tmk_core/protocol/vusb/protocol.c index 97a4989fb18..41ccf451fdb 100644 --- a/tmk_core/protocol/vusb/protocol.c +++ b/tmk_core/protocol/vusb/protocol.c @@ -31,18 +31,6 @@ # include "sleep_led.h" #endif -#ifdef CONSOLE_ENABLE -void console_task(void); -#endif - -#ifdef RAW_ENABLE -void raw_hid_task(void); -#endif - -#ifdef XAP_ENABLE -void xap_task(void); -#endif - /* This is from main.c of USBaspLoader */ static void initForUsbConnectivity(void) { uint8_t i = 0; @@ -140,7 +128,7 @@ static inline bool should_do_suspend(void) { return vusb_suspended; } -void protocol_task(void) { +void protocol_pre_task(void) { #if !defined(NO_USB_STARTUP_CHECK) if (should_do_suspend()) { dprintln("suspending keyboard"); @@ -163,7 +151,9 @@ void protocol_task(void) { vusb_wakeup(); } #endif +} +void protocol_keyboard_task(void) { usbPoll(); // TODO: configuration process is inconsistent. it sometime fails. @@ -171,28 +161,8 @@ void protocol_task(void) { if (usbConfiguration && usbInterruptIsReady()) { keyboard_task(); } - -#ifdef RAW_ENABLE - usbPoll(); - - if (usbConfiguration && usbInterruptIsReady4()) { - raw_hid_task(); - } -#endif - -#ifdef XAP_ENABLE - usbPoll(); - - if (usbConfiguration && usbInterruptIsReady4()) { - xap_task(); - } -#endif - -#ifdef CONSOLE_ENABLE - usbPoll(); - - if (usbConfiguration && usbInterruptIsReady3()) { - console_task(); - } -#endif +} + +void protocol_post_task(void) { + // do nothing } diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c index 59939c454fb..637ce288ff2 100644 --- a/tmk_core/protocol/vusb/vusb.c +++ b/tmk_core/protocol/vusb/vusb.c @@ -171,6 +171,12 @@ __attribute__((weak)) void raw_hid_receive(uint8_t *data, uint8_t length) { } void raw_hid_task(void) { + usbPoll(); + + if (!usbConfiguration || !usbInterruptIsReady4()) { + return; + } + if (raw_output_received_bytes == RAW_BUFFER_SIZE) { raw_hid_receive(raw_output_buffer, RAW_BUFFER_SIZE); raw_output_received_bytes = 0; @@ -239,6 +245,12 @@ void xap_receive_base(const void *data) { } void xap_task(void) { + usbPoll(); + + if (!usbConfiguration || !usbInterruptIsReady4()) { + return; + } + if (xap_output_received_bytes == XAP_BUFFER_SIZE) { xap_receive_base(xap_output_buffer); xap_output_received_bytes = 0; @@ -259,7 +271,9 @@ int8_t sendchar(uint8_t c) { } void console_task(void) { - if (!usbConfiguration) { + usbPoll(); + + if (!usbConfiguration || !usbInterruptIsReady3()) { return; }