diff options
author | Wilba <Jason.S.Williams@gmail.com> | 2020-02-18 12:54:13 +1100 |
---|---|---|
committer | Drashna Jael're <drashna@live.com> | 2020-03-26 00:42:12 -0700 |
commit | f6e33771c5e4157e749a65dcfa00b73852c92f2e (patch) | |
tree | 552f3b51b68bf54826a65807499d1908ccd44958 | |
parent | 72b85f52e7227ca4f295e85206d4860853af8b87 (diff) |
dynamic keymap sanity check (#8181)
-rw-r--r-- | quantum/dynamic_keymap.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/quantum/dynamic_keymap.c b/quantum/dynamic_keymap.c index 5600ce736d..9b86738c64 100644 --- a/quantum/dynamic_keymap.c +++ b/quantum/dynamic_keymap.c @@ -33,6 +33,14 @@ # define DYNAMIC_KEYMAP_MACRO_COUNT 16 #endif +// This is the default EEPROM max address to use for dynamic keymaps. +// The default is the ATmega32u4 EEPROM max address. +// Explicitly override it if the keyboard uses a microcontroller with +// more EEPROM *and* it makes sense to increase it. +#ifndef DYNAMIC_KEYMAP_EEPROM_MAX_ADDR +# define DYNAMIC_KEYMAP_EEPROM_MAX_ADDR 1023 +#endif + // If DYNAMIC_KEYMAP_EEPROM_ADDR not explicitly defined in config.h, // default it start after VIA_EEPROM_CUSTOM_ADDR+VIA_EEPROM_CUSTOM_SIZE #ifndef DYNAMIC_KEYMAP_EEPROM_ADDR @@ -52,11 +60,19 @@ # define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR (DYNAMIC_KEYMAP_EEPROM_ADDR + (DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2)) #endif -// Dynamic macro uses up all remaining memory -// Assumes 1K EEPROM on ATMega32U4 -// Override for anything different +// Sanity check that dynamic keymaps fit in available EEPROM +// If there's not 100 bytes available for macros, then something is wrong. +// The keyboard should override DYNAMIC_KEYMAP_LAYER_COUNT to reduce it, +// or DYNAMIC_KEYMAP_EEPROM_MAX_ADDR to increase it, *only if* the microcontroller has +// more than the default. +#if DYNAMIC_KEYMAP_EEPROM_MAX_ADDR - DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR < 100 +# error Dynamic keymaps are configured to use more EEPROM than is available. +#endif + +// Dynamic macros are stored after the keymaps and use what is available +// up to and including DYNAMIC_KEYMAP_EEPROM_MAX_ADDR. #ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE -# define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE (1024 - DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR) +# define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE (DYNAMIC_KEYMAP_EEPROM_MAX_ADDR - DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + 1) #endif uint8_t dynamic_keymap_get_layer_count(void) { return DYNAMIC_KEYMAP_LAYER_COUNT; } |