summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Brassel <nick@tzarc.org>2022-02-02 15:04:37 +1100
committerGitHub <noreply@github.com>2022-02-02 15:04:37 +1100
commite22efc037a7e4da17f1051d5053768e40683da68 (patch)
treed58924ef9de401b4e97ba46113ee42874a1593be
parentda5cb5fd6f91c2f7aebbcebbf211252c51d9b4a5 (diff)
Don't make EEPROM size assumptions with dynamic keymaps. (#16054)
* Don't make EEPROM size assumptions with dynamic keymaps. * Add support for checking against emulated flash, error out if someone attempts to build a board without specifying EEPROM size. * Reorder defines so that MCU is considered last. * Refactor EEPROM definitions for simplicity. * Fix max sizing of kabedon/kabedon980. * Fix max sizing of mechlovin/olly/jf. * Fix unit tests. * Review comments, add messages with values during build failures.
-rw-r--r--common_features.mk9
-rw-r--r--keyboards/kabedon/kabedon980/config.h10
-rw-r--r--keyboards/kabedon/kabedon980/keymaps/via/keymap.c20
-rw-r--r--keyboards/mechlovin/olly/jf/keymaps/via/config.h4
-rw-r--r--keyboards/mechlovin/olly/jf/keymaps/via/keymap.c25
-rw-r--r--platforms/arm_atsam/eeprom_samd.c (renamed from platforms/arm_atsam/eeprom.c)6
-rwxr-xr-xplatforms/arm_atsam/eeprom_samd.h8
-rw-r--r--platforms/chibios/eeprom_stm32.c66
-rw-r--r--platforms/chibios/eeprom_stm32_defs.h62
-rw-r--r--platforms/chibios/eeprom_teensy.c15
-rwxr-xr-xplatforms/chibios/eeprom_teensy.h22
-rw-r--r--platforms/eeprom.h49
-rw-r--r--platforms/test/eeprom.c4
-rw-r--r--platforms/test/eeprom_stm32_tests.cpp3
-rw-r--r--platforms/test/eeprom_stm32_tests.h8
-rw-r--r--platforms/test/rules.mk2
-rw-r--r--quantum/dynamic_keymap.c25
17 files changed, 185 insertions, 153 deletions
diff --git a/common_features.mk b/common_features.mk
index d3da487e69..5c5e6a9a25 100644
--- a/common_features.mk
+++ b/common_features.mk
@@ -186,20 +186,21 @@ else
186 else ifeq ($(PLATFORM),CHIBIOS) 186 else ifeq ($(PLATFORM),CHIBIOS)
187 ifneq ($(filter STM32F3xx_% STM32F1xx_% %_STM32F401xC %_STM32F401xE %_STM32F405xG %_STM32F411xE %_STM32F072xB %_STM32F042x6 %_GD32VF103xB %_GD32VF103x8, $(MCU_SERIES)_$(MCU_LDSCRIPT)),) 187 ifneq ($(filter STM32F3xx_% STM32F1xx_% %_STM32F401xC %_STM32F401xE %_STM32F405xG %_STM32F411xE %_STM32F072xB %_STM32F042x6 %_GD32VF103xB %_GD32VF103x8, $(MCU_SERIES)_$(MCU_LDSCRIPT)),)
188 # Emulated EEPROM 188 # Emulated EEPROM
189 OPT_DEFS += -DEEPROM_DRIVER 189 OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_STM32_FLASH_EMULATED
190 COMMON_VPATH += $(DRIVER_PATH)/eeprom 190 COMMON_VPATH += $(DRIVER_PATH)/eeprom
191 SRC += eeprom_driver.c 191 SRC += eeprom_driver.c
192 SRC += $(PLATFORM_COMMON_DIR)/eeprom_stm32.c 192 SRC += $(PLATFORM_COMMON_DIR)/eeprom_stm32.c
193 SRC += $(PLATFORM_COMMON_DIR)/flash_stm32.c 193 SRC += $(PLATFORM_COMMON_DIR)/flash_stm32.c
194 else ifneq ($(filter $(MCU_SERIES),STM32L0xx STM32L1xx),) 194 else ifneq ($(filter $(MCU_SERIES),STM32L0xx STM32L1xx),)
195 # True EEPROM on STM32L0xx, L1xx 195 # True EEPROM on STM32L0xx, L1xx
196 OPT_DEFS += -DEEPROM_DRIVER 196 OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_STM32_L0_L1
197 COMMON_VPATH += $(DRIVER_PATH)/eeprom 197 COMMON_VPATH += $(DRIVER_PATH)/eeprom
198 COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/eeprom 198 COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/eeprom
199 SRC += eeprom_driver.c 199 SRC += eeprom_driver.c
200 SRC += eeprom_stm32_L0_L1.c 200 SRC += eeprom_stm32_L0_L1.c
201 else ifneq ($(filter $(MCU_SERIES),KL2x K20x),) 201 else ifneq ($(filter $(MCU_SERIES),KL2x K20x),)
202 # Teensy EEPROM implementations 202 # Teensy EEPROM implementations
203 OPT_DEFS += -DEEPROM_TEENSY
203 SRC += eeprom_teensy.c 204 SRC += eeprom_teensy.c
204 else 205 else
205 # Fall back to transient, i.e. non-persistent 206 # Fall back to transient, i.e. non-persistent
@@ -209,9 +210,11 @@ else
209 endif 210 endif
210 else ifeq ($(PLATFORM),ARM_ATSAM) 211 else ifeq ($(PLATFORM),ARM_ATSAM)
211 # arm_atsam EEPROM 212 # arm_atsam EEPROM
212 SRC += $(PLATFORM_COMMON_DIR)/eeprom.c 213 OPT_DEFS += -DEEPROM_SAMD
214 SRC += $(PLATFORM_COMMON_DIR)/eeprom_samd.c
213 else ifeq ($(PLATFORM),TEST) 215 else ifeq ($(PLATFORM),TEST)
214 # Test harness "EEPROM" 216 # Test harness "EEPROM"
217 OPT_DEFS += -DEEPROM_TEST_HARNESS
215 SRC += $(PLATFORM_COMMON_DIR)/eeprom.c 218 SRC += $(PLATFORM_COMMON_DIR)/eeprom.c
216 endif 219 endif
217 endif 220 endif
diff --git a/keyboards/kabedon/kabedon980/config.h b/keyboards/kabedon/kabedon980/config.h
index 5dc70dfebf..db93dfcf85 100644
--- a/keyboards/kabedon/kabedon980/config.h
+++ b/keyboards/kabedon/kabedon980/config.h
@@ -32,21 +32,21 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
32#define MATRIX_COLS 13 32#define MATRIX_COLS 13
33 33
34/* Keyboard Matrix Assignments */ 34/* Keyboard Matrix Assignments */
35#define MATRIX_ROW_PINS {D0,D2,F7,B1,B0,D6,C7,D7,B5,B2} 35#define MATRIX_ROW_PINS {D0,D2,F7,B1,B0,D6,C7,D7,B5,B2}
36#define MATRIX_COL_PINS {F5,F4,F6,C6,B6,B4,D3,D1,D4,F1,B3,D5,F0} 36#define MATRIX_COL_PINS {F5,F4,F6,C6,B6,B4,D3,D1,D4,F1,B3,D5,F0}
37#define UNUSED_PINS 37#define UNUSED_PINS
38#define DYNAMIC_KEYMAP_EEPROM_MAX_ADDR 2047 38#define DYNAMIC_KEYMAP_LAYER_COUNT 3
39/* COL2ROW, ROW2COL*/ 39/* COL2ROW, ROW2COL*/
40#define DIODE_DIRECTION ROW2COL 40#define DIODE_DIRECTION ROW2COL
41 41
42#define RGB_DI_PIN B7 42#define RGB_DI_PIN B7
43#ifdef RGB_DI_PIN 43#ifdef RGB_DI_PIN
44 #define RGBLED_NUM 20 44 #define RGBLED_NUM 20
45 #define RGBLIGHT_HUE_STEP 8 45 #define RGBLIGHT_HUE_STEP 8
46 #define RGBLIGHT_SAT_STEP 8 46 #define RGBLIGHT_SAT_STEP 8
47 #define RGBLIGHT_VAL_STEP 8 47 #define RGBLIGHT_VAL_STEP 8
48 #define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */ 48 #define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */
49 #define RGBLIGHT_ANIMATIONS 49 #define RGBLIGHT_ANIMATIONS
50#endif 50#endif
51 51
52/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ 52/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
diff --git a/keyboards/kabedon/kabedon980/keymaps/via/keymap.c b/keyboards/kabedon/kabedon980/keymaps/via/keymap.c
index 44574452bf..76eaa3968a 100644
--- a/keyboards/kabedon/kabedon980/keymaps/via/keymap.c
+++ b/keyboards/kabedon/kabedon980/keymaps/via/keymap.c
@@ -6,32 +6,24 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
6 KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_HOME, KC_PGUP, KC_PGDN, 6 KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_HOME, KC_PGUP, KC_PGDN,
7 KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, 7 KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
8 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PPLS, 8 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PPLS,
9 KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, 9 KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6,
10 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, 10 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT,
11 KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT ), 11 KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT ),
12 12
13 [1] = LAYOUT( 13 [1] = LAYOUT(
14 RGB_MOD, RGB_TOG, RGB_SAI, RGB_SAD, RGB_HUI, RGB_HUD, RGB_SPI, RGB_SPD, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 14 RGB_MOD, RGB_TOG, RGB_SAI, RGB_SAD, RGB_HUI, RGB_HUD, RGB_SPI, RGB_SPD, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
15 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 15 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
16 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 16 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
17 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 17 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
18 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 18 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
19 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), 19 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ),
20 20
21 [2] = LAYOUT( 21 [2] = LAYOUT(
22 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 22 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
23 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 23 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
24 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 24 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
25 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 25 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
26 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 26 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
27 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), 27 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ),
28
29 [3] = LAYOUT(
30 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
31 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
32 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
33 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
34 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
35 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS )
36}; 28};
37 29
diff --git a/keyboards/mechlovin/olly/jf/keymaps/via/config.h b/keyboards/mechlovin/olly/jf/keymaps/via/config.h
index f330025a00..82c2e51eb9 100644
--- a/keyboards/mechlovin/olly/jf/keymaps/via/config.h
+++ b/keyboards/mechlovin/olly/jf/keymaps/via/config.h
@@ -17,6 +17,4 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
17 17
18#pragma once 18#pragma once
19 19
20#define DYNAMIC_KEYMAP_EEPROM_MAX_ADDR 1607 20#define DYNAMIC_KEYMAP_LAYER_COUNT 3
21#define DYNAMIC_KEYMAP_LAYER_COUNT 6
22
diff --git a/keyboards/mechlovin/olly/jf/keymaps/via/keymap.c b/keyboards/mechlovin/olly/jf/keymaps/via/keymap.c
index c90eeb1830..18ac685abc 100644
--- a/keyboards/mechlovin/olly/jf/keymaps/via/keymap.c
+++ b/keyboards/mechlovin/olly/jf/keymaps/via/keymap.c
@@ -40,29 +40,4 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
40 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 40 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
41 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS 41 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
42 ), 42 ),
43 [3] = LAYOUT_all(
44 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
45 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
46 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
47 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
48 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
49 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
50 ),
51 [4] = LAYOUT_all(
52 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
53 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
54 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
55 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
56 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
57 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
58 ),
59 [5] = LAYOUT_all(
60 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
61 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
62 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
63 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
64 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
65 KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
66 ),
67
68}; \ No newline at end of file 43}; \ No newline at end of file
diff --git a/platforms/arm_atsam/eeprom.c b/platforms/arm_atsam/eeprom_samd.c
index ff1a692623..beaffeec30 100644
--- a/platforms/arm_atsam/eeprom.c
+++ b/platforms/arm_atsam/eeprom_samd.c
@@ -18,11 +18,7 @@
18#include "samd51j18a.h" 18#include "samd51j18a.h"
19#include "core_cm4.h" 19#include "core_cm4.h"
20#include "component/nvmctrl.h" 20#include "component/nvmctrl.h"
21 21#include "eeprom_samd.h"
22#ifndef EEPROM_SIZE
23# include "eeconfig.h"
24# define EEPROM_SIZE (((EECONFIG_SIZE + 3) / 4) * 4) // based off eeconfig's current usage, aligned to 4-byte sizes, to deal with LTO
25#endif
26 22
27#ifndef MAX 23#ifndef MAX
28# define MAX(X, Y) ((X) > (Y) ? (X) : (Y)) 24# define MAX(X, Y) ((X) > (Y) ? (X) : (Y))
diff --git a/platforms/arm_atsam/eeprom_samd.h b/platforms/arm_atsam/eeprom_samd.h
new file mode 100755
index 0000000000..7dbff9bfa1
--- /dev/null
+++ b/platforms/arm_atsam/eeprom_samd.h
@@ -0,0 +1,8 @@
1// Copyright 2022 Nick Brassel (@tzarc)
2// SPDX-License-Identifier: GPL-2.0-or-later
3#pragma once
4
5#ifndef EEPROM_SIZE
6# include "eeconfig.h"
7# define EEPROM_SIZE (((EECONFIG_SIZE + 3) / 4) * 4) // based off eeconfig's current usage, aligned to 4-byte sizes, to deal with LTO
8#endif
diff --git a/platforms/chibios/eeprom_stm32.c b/platforms/chibios/eeprom_stm32.c
index acc6a48516..8bf0b19c3d 100644
--- a/platforms/chibios/eeprom_stm32.c
+++ b/platforms/chibios/eeprom_stm32.c
@@ -133,10 +133,6 @@
133 */ 133 */
134 134
135#include "eeprom_stm32_defs.h" 135#include "eeprom_stm32_defs.h"
136#if !defined(FEE_PAGE_SIZE) || !defined(FEE_PAGE_COUNT) || !defined(FEE_MCU_FLASH_SIZE) || !defined(FEE_PAGE_BASE_ADDRESS)
137# error "not implemented."
138#endif
139
140/* These bits are used for optimizing encoding of bytes, 0 and 1 */ 136/* These bits are used for optimizing encoding of bytes, 0 and 1 */
141#define FEE_WORD_ENCODING 0x8000 137#define FEE_WORD_ENCODING 0x8000
142#define FEE_VALUE_NEXT 0x6000 138#define FEE_VALUE_NEXT 0x6000
@@ -144,69 +140,11 @@
144#define FEE_VALUE_ENCODED 0x2000 140#define FEE_VALUE_ENCODED 0x2000
145#define FEE_BYTE_RANGE 0x80 141#define FEE_BYTE_RANGE 0x80
146 142
147/* Addressable range 16KByte: 0 <-> (0x1FFF << 1) */
148#define FEE_ADDRESS_MAX_SIZE 0x4000
149
150/* Flash word value after erase */ 143/* Flash word value after erase */
151#define FEE_EMPTY_WORD ((uint16_t)0xFFFF) 144#define FEE_EMPTY_WORD ((uint16_t)0xFFFF)
152 145
153/* Size of combined compacted eeprom and write log pages */ 146#if !defined(FEE_PAGE_SIZE) || !defined(FEE_PAGE_COUNT) || !defined(FEE_MCU_FLASH_SIZE) || !defined(FEE_PAGE_BASE_ADDRESS)
154#define FEE_DENSITY_MAX_SIZE (FEE_PAGE_COUNT * FEE_PAGE_SIZE) 147# error "not implemented."
155
156#ifndef FEE_MCU_FLASH_SIZE_IGNORE_CHECK /* *TODO: Get rid of this check */
157# if FEE_DENSITY_MAX_SIZE > (FEE_MCU_FLASH_SIZE * 1024)
158# pragma message STR(FEE_DENSITY_MAX_SIZE) " > " STR(FEE_MCU_FLASH_SIZE * 1024)
159# error emulated eeprom: FEE_DENSITY_MAX_SIZE is greater than available flash size
160# endif
161#endif
162
163/* Size of emulated eeprom */
164#ifdef FEE_DENSITY_BYTES
165# if (FEE_DENSITY_BYTES > FEE_DENSITY_MAX_SIZE)
166# pragma message STR(FEE_DENSITY_BYTES) " > " STR(FEE_DENSITY_MAX_SIZE)
167# error emulated eeprom: FEE_DENSITY_BYTES exceeds FEE_DENSITY_MAX_SIZE
168# endif
169# if (FEE_DENSITY_BYTES == FEE_DENSITY_MAX_SIZE)
170# pragma message STR(FEE_DENSITY_BYTES) " == " STR(FEE_DENSITY_MAX_SIZE)
171# warning emulated eeprom: FEE_DENSITY_BYTES leaves no room for a write log. This will greatly increase the flash wear rate!
172# endif
173# if FEE_DENSITY_BYTES > FEE_ADDRESS_MAX_SIZE
174# pragma message STR(FEE_DENSITY_BYTES) " > " STR(FEE_ADDRESS_MAX_SIZE)
175# error emulated eeprom: FEE_DENSITY_BYTES is greater than FEE_ADDRESS_MAX_SIZE allows
176# endif
177# if ((FEE_DENSITY_BYTES) % 2) == 1
178# error emulated eeprom: FEE_DENSITY_BYTES must be even
179# endif
180#else
181/* Default to half of allocated space used for emulated eeprom, half for write log */
182# define FEE_DENSITY_BYTES (FEE_PAGE_COUNT * FEE_PAGE_SIZE / 2)
183#endif
184
185/* Size of write log */
186#ifdef FEE_WRITE_LOG_BYTES
187# if ((FEE_DENSITY_BYTES + FEE_WRITE_LOG_BYTES) > FEE_DENSITY_MAX_SIZE)
188# pragma message STR(FEE_DENSITY_BYTES) " + " STR(FEE_WRITE_LOG_BYTES) " > " STR(FEE_DENSITY_MAX_SIZE)
189# error emulated eeprom: FEE_WRITE_LOG_BYTES exceeds remaining FEE_DENSITY_MAX_SIZE
190# endif
191# if ((FEE_WRITE_LOG_BYTES) % 2) == 1
192# error emulated eeprom: FEE_WRITE_LOG_BYTES must be even
193# endif
194#else
195/* Default to use all remaining space */
196# define FEE_WRITE_LOG_BYTES (FEE_PAGE_COUNT * FEE_PAGE_SIZE - FEE_DENSITY_BYTES)
197#endif
198
199/* Start of the emulated eeprom compacted flash area */
200#define FEE_COMPACTED_BASE_ADDRESS FEE_PAGE_BASE_ADDRESS
201/* End of the emulated eeprom compacted flash area */
202#define FEE_COMPACTED_LAST_ADDRESS (FEE_COMPACTED_BASE_ADDRESS + FEE_DENSITY_BYTES)
203/* Start of the emulated eeprom write log */
204#define FEE_WRITE_LOG_BASE_ADDRESS FEE_COMPACTED_LAST_ADDRESS
205/* End of the emulated eeprom write log */
206#define FEE_WRITE_LOG_LAST_ADDRESS (FEE_WRITE_LOG_BASE_ADDRESS + FEE_WRITE_LOG_BYTES)
207
208#if defined(DYNAMIC_KEYMAP_EEPROM_MAX_ADDR) && (DYNAMIC_KEYMAP_EEPROM_MAX_ADDR >= FEE_DENSITY_BYTES)
209# error emulated eeprom: DYNAMIC_KEYMAP_EEPROM_MAX_ADDR is greater than the FEE_DENSITY_BYTES available
210#endif 148#endif
211 149
212/* In-memory contents of emulated eeprom for faster access */ 150/* In-memory contents of emulated eeprom for faster access */
diff --git a/platforms/chibios/eeprom_stm32_defs.h b/platforms/chibios/eeprom_stm32_defs.h
index 66904f247f..581434eb5e 100644
--- a/platforms/chibios/eeprom_stm32_defs.h
+++ b/platforms/chibios/eeprom_stm32_defs.h
@@ -72,3 +72,65 @@
72# define FEE_PAGE_BASE_ADDRESS ((uintptr_t)(FEE_FLASH_BASE) + FEE_MCU_FLASH_SIZE * 1024 - (FEE_PAGE_COUNT * FEE_PAGE_SIZE)) 72# define FEE_PAGE_BASE_ADDRESS ((uintptr_t)(FEE_FLASH_BASE) + FEE_MCU_FLASH_SIZE * 1024 - (FEE_PAGE_COUNT * FEE_PAGE_SIZE))
73# endif 73# endif
74#endif 74#endif
75
76/* Addressable range 16KByte: 0 <-> (0x1FFF << 1) */
77#define FEE_ADDRESS_MAX_SIZE 0x4000
78
79/* Size of combined compacted eeprom and write log pages */
80#define FEE_DENSITY_MAX_SIZE (FEE_PAGE_COUNT * FEE_PAGE_SIZE)
81
82#ifndef FEE_MCU_FLASH_SIZE_IGNORE_CHECK /* *TODO: Get rid of this check */
83# if FEE_DENSITY_MAX_SIZE > (FEE_MCU_FLASH_SIZE * 1024)
84# pragma message STR(FEE_DENSITY_MAX_SIZE) " > " STR(FEE_MCU_FLASH_SIZE * 1024)
85# error emulated eeprom: FEE_DENSITY_MAX_SIZE is greater than available flash size
86# endif
87#endif
88
89/* Size of emulated eeprom */
90#ifdef FEE_DENSITY_BYTES
91# if (FEE_DENSITY_BYTES > FEE_DENSITY_MAX_SIZE)
92# pragma message STR(FEE_DENSITY_BYTES) " > " STR(FEE_DENSITY_MAX_SIZE)
93# error emulated eeprom: FEE_DENSITY_BYTES exceeds FEE_DENSITY_MAX_SIZE
94# endif
95# if (FEE_DENSITY_BYTES == FEE_DENSITY_MAX_SIZE)
96# pragma message STR(FEE_DENSITY_BYTES) " == " STR(FEE_DENSITY_MAX_SIZE)
97# warning emulated eeprom: FEE_DENSITY_BYTES leaves no room for a write log. This will greatly increase the flash wear rate!
98# endif
99# if FEE_DENSITY_BYTES > FEE_ADDRESS_MAX_SIZE
100# pragma message STR(FEE_DENSITY_BYTES) " > " STR(FEE_ADDRESS_MAX_SIZE)
101# error emulated eeprom: FEE_DENSITY_BYTES is greater than FEE_ADDRESS_MAX_SIZE allows
102# endif
103# if ((FEE_DENSITY_BYTES) % 2) == 1
104# error emulated eeprom: FEE_DENSITY_BYTES must be even
105# endif
106#else
107/* Default to half of allocated space used for emulated eeprom, half for write log */
108# define FEE_DENSITY_BYTES (FEE_PAGE_COUNT * FEE_PAGE_SIZE / 2)
109#endif
110
111/* Size of write log */
112#ifdef FEE_WRITE_LOG_BYTES
113# if ((FEE_DENSITY_BYTES + FEE_WRITE_LOG_BYTES) > FEE_DENSITY_MAX_SIZE)
114# pragma message STR(FEE_DENSITY_BYTES) " + " STR(FEE_WRITE_LOG_BYTES) " > " STR(FEE_DENSITY_MAX_SIZE)
115# error emulated eeprom: FEE_WRITE_LOG_BYTES exceeds remaining FEE_DENSITY_MAX_SIZE
116# endif
117# if ((FEE_WRITE_LOG_BYTES) % 2) == 1
118# error emulated eeprom: FEE_WRITE_LOG_BYTES must be even
119# endif
120#else
121/* Default to use all remaining space */
122# define FEE_WRITE_LOG_BYTES (FEE_PAGE_COUNT * FEE_PAGE_SIZE - FEE_DENSITY_BYTES)
123#endif
124
125/* Start of the emulated eeprom compacted flash area */
126#define FEE_COMPACTED_BASE_ADDRESS FEE_PAGE_BASE_ADDRESS
127/* End of the emulated eeprom compacted flash area */
128#define FEE_COMPACTED_LAST_ADDRESS (FEE_COMPACTED_BASE_ADDRESS + FEE_DENSITY_BYTES)
129/* Start of the emulated eeprom write log */
130#define FEE_WRITE_LOG_BASE_ADDRESS FEE_COMPACTED_LAST_ADDRESS
131/* End of the emulated eeprom write log */
132#define FEE_WRITE_LOG_LAST_ADDRESS (FEE_WRITE_LOG_BASE_ADDRESS + FEE_WRITE_LOG_BYTES)
133
134#if defined(DYNAMIC_KEYMAP_EEPROM_MAX_ADDR) && (DYNAMIC_KEYMAP_EEPROM_MAX_ADDR >= FEE_DENSITY_BYTES)
135# error emulated eeprom: DYNAMIC_KEYMAP_EEPROM_MAX_ADDR is greater than the FEE_DENSITY_BYTES available
136#endif
diff --git a/platforms/chibios/eeprom_teensy.c b/platforms/chibios/eeprom_teensy.c
index 2093f9b4b2..575f51526e 100644
--- a/platforms/chibios/eeprom_teensy.c
+++ b/platforms/chibios/eeprom_teensy.c
@@ -1,6 +1,7 @@
1#include <ch.h> 1#include <ch.h>
2#include <hal.h> 2#include <hal.h>
3 3
4#include "eeprom_teensy.h"
4#include "eeconfig.h" 5#include "eeconfig.h"
5 6
6/*************************************/ 7/*************************************/
@@ -42,18 +43,6 @@
42#if defined(K20x) /* chip selection */ 43#if defined(K20x) /* chip selection */
43/* Teensy 3.0, 3.1, 3.2; mchck; infinity keyboard */ 44/* Teensy 3.0, 3.1, 3.2; mchck; infinity keyboard */
44 45
45// The EEPROM is really RAM with a hardware-based backup system to
46// flash memory. Selecting a smaller size EEPROM allows more wear
47// leveling, for higher write endurance. If you edit this file,
48// set this to the smallest size your application can use. Also,
49// due to Freescale's implementation, writing 16 or 32 bit words
50// (aligned to 2 or 4 byte boundaries) has twice the endurance
51// compared to writing 8 bit bytes.
52//
53# ifndef EEPROM_SIZE
54# define EEPROM_SIZE 32
55# endif
56
57/* 46/*
58 ^^^ Here be dragons: 47 ^^^ Here be dragons:
59 NXP AppNote AN4282 section 3.1 states that partitioning must only be done once. 48 NXP AppNote AN4282 section 3.1 states that partitioning must only be done once.
@@ -350,8 +339,6 @@ void do_flash_cmd(volatile uint8_t *fstat)
350extern uint32_t __eeprom_workarea_start__; 339extern uint32_t __eeprom_workarea_start__;
351extern uint32_t __eeprom_workarea_end__; 340extern uint32_t __eeprom_workarea_end__;
352 341
353# define EEPROM_SIZE 128
354
355static uint32_t flashend = 0; 342static uint32_t flashend = 0;
356 343
357void eeprom_initialize(void) { 344void eeprom_initialize(void) {
diff --git a/platforms/chibios/eeprom_teensy.h b/platforms/chibios/eeprom_teensy.h
new file mode 100755
index 0000000000..ead5998b29
--- /dev/null
+++ b/platforms/chibios/eeprom_teensy.h
@@ -0,0 +1,22 @@
1// Copyright 2022 Nick Brassel (@tzarc)
2// SPDX-License-Identifier: GPL-2.0-or-later
3#pragma once
4
5#if defined(K20x)
6/* Teensy 3.0, 3.1, 3.2; mchck; infinity keyboard */
7// The EEPROM is really RAM with a hardware-based backup system to
8// flash memory. Selecting a smaller size EEPROM allows more wear
9// leveling, for higher write endurance. If you edit this file,
10// set this to the smallest size your application can use. Also,
11// due to Freescale's implementation, writing 16 or 32 bit words
12// (aligned to 2 or 4 byte boundaries) has twice the endurance
13// compared to writing 8 bit bytes.
14//
15# ifndef EEPROM_SIZE
16# define EEPROM_SIZE 32
17# endif
18#elif defined(KL2x) /* Teensy LC (emulated) */
19# define EEPROM_SIZE 128
20#else
21# error Unsupported Teensy EEPROM.
22#endif
diff --git a/platforms/eeprom.h b/platforms/eeprom.h
index f5b3f0ad53..091e6e4400 100644
--- a/platforms/eeprom.h
+++ b/platforms/eeprom.h
@@ -1,3 +1,5 @@
1// Copyright 2018-2022 QMK
2// SPDX-License-Identifier: GPL-2.0-or-later
1#pragma once 3#pragma once
2 4
3#if defined(__AVR__) && !defined(EEPROM_DRIVER) 5#if defined(__AVR__) && !defined(EEPROM_DRIVER)
@@ -19,3 +21,50 @@ void eeprom_update_word(uint16_t *__p, uint16_t __value);
19void eeprom_update_dword(uint32_t *__p, uint32_t __value); 21void eeprom_update_dword(uint32_t *__p, uint32_t __value);
20void eeprom_update_block(const void *__src, void *__dst, size_t __n); 22void eeprom_update_block(const void *__src, void *__dst, size_t __n);
21#endif 23#endif
24
25#if defined(EEPROM_CUSTOM)
26# ifndef EEPROM_SIZE
27# error EEPROM_SIZE has not been defined for custom driver.
28# endif
29# define TOTAL_EEPROM_BYTE_COUNT (EEPROM_SIZE)
30#elif defined(EEPROM_TRANSIENT)
31# include "eeprom_transient.h"
32# define TOTAL_EEPROM_BYTE_COUNT (TRANSIENT_EEPROM_SIZE)
33#elif defined(EEPROM_I2C)
34# include "eeprom_i2c.h"
35# define TOTAL_EEPROM_BYTE_COUNT (EXTERNAL_EEPROM_BYTE_COUNT)
36#elif defined(EEPROM_SPI)
37# include "eeprom_spi.h"
38# define TOTAL_EEPROM_BYTE_COUNT (EXTERNAL_EEPROM_BYTE_COUNT)
39#elif defined(EEPROM_STM32_L0_L1)
40# include "eeprom_stm32_L0_L1.h"
41# define TOTAL_EEPROM_BYTE_COUNT (STM32_ONBOARD_EEPROM_SIZE)
42#elif defined(EEPROM_TEENSY)
43# include "eeprom_teensy.h"
44# define TOTAL_EEPROM_BYTE_COUNT (EEPROM_SIZE)
45#elif defined(EEPROM_STM32_FLASH_EMULATED)
46# include "eeprom_stm32_defs.h"
47# define TOTAL_EEPROM_BYTE_COUNT (FEE_DENSITY_BYTES)
48#elif defined(EEPROM_SAMD)
49# include "eeprom_samd.h"
50# define TOTAL_EEPROM_BYTE_COUNT (EEPROM_SIZE)
51#elif defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega16U4__) || defined(__AVR_AT90USB162__) || defined(__AVR_ATtiny85__)
52# define TOTAL_EEPROM_BYTE_COUNT 512
53#elif defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega32A__)
54# define TOTAL_EEPROM_BYTE_COUNT 1024
55#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__)
56# define TOTAL_EEPROM_BYTE_COUNT 2048
57#elif defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__)
58# define TOTAL_EEPROM_BYTE_COUNT 4096
59#elif defined(EEPROM_TEST_HARNESS)
60# ifndef FLASH_STM32_MOCKED
61// Normal tests
62# define TOTAL_EEPROM_BYTE_COUNT 32
63# else
64// Flash wear-leveling testing
65# include "eeprom_stm32_tests.h"
66# define TOTAL_EEPROM_BYTE_COUNT (EEPROM_SIZE)
67# endif
68#else
69# error Unknown EEPROM driver.
70#endif
diff --git a/platforms/test/eeprom.c b/platforms/test/eeprom.c
index 5c8e69dae3..e292faa644 100644
--- a/platforms/test/eeprom.c
+++ b/platforms/test/eeprom.c
@@ -16,9 +16,7 @@
16 16
17#include "eeprom.h" 17#include "eeprom.h"
18 18
19#define EEPROM_SIZE 32 19static uint8_t buffer[TOTAL_EEPROM_BYTE_COUNT];
20
21static uint8_t buffer[EEPROM_SIZE];
22 20
23uint8_t eeprom_read_byte(const uint8_t *addr) { 21uint8_t eeprom_read_byte(const uint8_t *addr) {
24 uintptr_t offset = (uintptr_t)addr; 22 uintptr_t offset = (uintptr_t)addr;
diff --git a/platforms/test/eeprom_stm32_tests.cpp b/platforms/test/eeprom_stm32_tests.cpp
index 5bc8d87900..57f31d634f 100644
--- a/platforms/test/eeprom_stm32_tests.cpp
+++ b/platforms/test/eeprom_stm32_tests.cpp
@@ -17,8 +17,6 @@
17#include "gtest/gtest.h" 17#include "gtest/gtest.h"
18 18
19extern "C" { 19extern "C" {
20#include "flash_stm32.h"
21#include "eeprom_stm32.h"
22#include "eeprom.h" 20#include "eeprom.h"
23} 21}
24 22
@@ -46,7 +44,6 @@ extern "C" {
46 * 44 *
47 */ 45 */
48 46
49#define EEPROM_SIZE (FEE_PAGE_SIZE * FEE_PAGE_COUNT / 2)
50#define LOG_SIZE EEPROM_SIZE 47#define LOG_SIZE EEPROM_SIZE
51#define LOG_BASE (MOCK_FLASH_SIZE - LOG_SIZE) 48#define LOG_BASE (MOCK_FLASH_SIZE - LOG_SIZE)
52#define EEPROM_BASE (LOG_BASE - EEPROM_SIZE) 49#define EEPROM_BASE (LOG_BASE - EEPROM_SIZE)
diff --git a/platforms/test/eeprom_stm32_tests.h b/platforms/test/eeprom_stm32_tests.h
new file mode 100644
index 0000000000..35ed885e52
--- /dev/null
+++ b/platforms/test/eeprom_stm32_tests.h
@@ -0,0 +1,8 @@
1// Copyright 2018-2022 Nick Brassel (@tzarc)
2// SPDX-License-Identifier: GPL-2.0-or-later
3#pragma once
4
5#include "flash_stm32.h"
6#include "eeprom_stm32.h"
7
8#define EEPROM_SIZE (FEE_PAGE_SIZE * FEE_PAGE_COUNT / 2)
diff --git a/platforms/test/rules.mk b/platforms/test/rules.mk
index 66b853d8ee..55512c7392 100644
--- a/platforms/test/rules.mk
+++ b/platforms/test/rules.mk
@@ -1,4 +1,4 @@
1eeprom_stm32_DEFS := -DFLASH_STM32_MOCKED -DNO_PRINT -DFEE_FLASH_BASE=FlashBuf 1eeprom_stm32_DEFS := -DEEPROM_TEST_HARNESS -DFLASH_STM32_MOCKED -DNO_PRINT -DFEE_FLASH_BASE=FlashBuf
2eeprom_stm32_tiny_DEFS := $(eeprom_stm32_DEFS) \ 2eeprom_stm32_tiny_DEFS := $(eeprom_stm32_DEFS) \
3 -DFEE_MCU_FLASH_SIZE=1 \ 3 -DFEE_MCU_FLASH_SIZE=1 \
4 -DMOCK_FLASH_SIZE=1024 \ 4 -DMOCK_FLASH_SIZE=1024 \
diff --git a/quantum/dynamic_keymap.c b/quantum/dynamic_keymap.c
index 19a6bea59a..8f1f39bc0f 100644
--- a/quantum/dynamic_keymap.c
+++ b/quantum/dynamic_keymap.c
@@ -29,24 +29,22 @@
29# define DYNAMIC_KEYMAP_MACRO_COUNT 16 29# define DYNAMIC_KEYMAP_MACRO_COUNT 16
30#endif 30#endif
31 31
32// This is the default EEPROM max address to use for dynamic keymaps. 32#ifndef TOTAL_EEPROM_BYTE_COUNT
33// The default is the ATmega32u4 EEPROM max address. 33# error Unknown total EEPROM size. Cannot derive maximum for dynamic keymaps.
34// Explicitly override it if the keyboard uses a microcontroller with 34#endif
35// more EEPROM *and* it makes sense to increase it. 35
36#ifndef DYNAMIC_KEYMAP_EEPROM_MAX_ADDR 36#ifndef DYNAMIC_KEYMAP_EEPROM_MAX_ADDR
37# if defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) 37# define DYNAMIC_KEYMAP_EEPROM_MAX_ADDR (TOTAL_EEPROM_BYTE_COUNT - 1)
38# define DYNAMIC_KEYMAP_EEPROM_MAX_ADDR 2047 38#endif
39# elif defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__) 39
40# define DYNAMIC_KEYMAP_EEPROM_MAX_ADDR 4095 40#if DYNAMIC_KEYMAP_EEPROM_MAX_ADDR > (TOTAL_EEPROM_BYTE_COUNT - 1)
41# elif defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega16U4__) || defined(__AVR_AT90USB162__) || defined(__AVR_ATtiny85__) 41# pragma message STR(DYNAMIC_KEYMAP_EEPROM_MAX_ADDR) " > " STR((TOTAL_EEPROM_BYTE_COUNT - 1))
42# define DYNAMIC_KEYMAP_EEPROM_MAX_ADDR 511 42# error DYNAMIC_KEYMAP_EEPROM_MAX_ADDR is configured to use more space than what is available for the selected EEPROM driver
43# else
44# define DYNAMIC_KEYMAP_EEPROM_MAX_ADDR 1023
45# endif
46#endif 43#endif
47 44
48// Due to usage of uint16_t check for max 65535 45// Due to usage of uint16_t check for max 65535
49#if DYNAMIC_KEYMAP_EEPROM_MAX_ADDR > 65535 46#if DYNAMIC_KEYMAP_EEPROM_MAX_ADDR > 65535
47# pragma message STR(DYNAMIC_KEYMAP_EEPROM_MAX_ADDR) " > 65535"
50# error DYNAMIC_KEYMAP_EEPROM_MAX_ADDR must be less than 65536 48# error DYNAMIC_KEYMAP_EEPROM_MAX_ADDR must be less than 65536
51#endif 49#endif
52 50
@@ -71,6 +69,7 @@
71// or DYNAMIC_KEYMAP_EEPROM_MAX_ADDR to increase it, *only if* the microcontroller has 69// or DYNAMIC_KEYMAP_EEPROM_MAX_ADDR to increase it, *only if* the microcontroller has
72// more than the default. 70// more than the default.
73#if DYNAMIC_KEYMAP_EEPROM_MAX_ADDR - DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR < 100 71#if DYNAMIC_KEYMAP_EEPROM_MAX_ADDR - DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR < 100
72# pragma message STR(DYNAMIC_KEYMAP_EEPROM_MAX_ADDR - DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR) " < 100"
74# error Dynamic keymaps are configured to use more EEPROM than is available. 73# error Dynamic keymaps are configured to use more EEPROM than is available.
75#endif 74#endif
76 75