aboutsummaryrefslogtreecommitdiff
path: root/tmk_core
diff options
context:
space:
mode:
authorNick Brassel <nick@tzarc.org>2019-11-06 08:04:50 +1100
committerNick Brassel <nick@tzarc.org>2020-01-24 12:45:58 +1100
commitd13ada11622977bcc0b530212b4405229805016d (patch)
tree3f8874ac3c9b5950b1fed6ac4d0081a268d9f487 /tmk_core
parent6ff093efbee21d3f64f5b4bfdbc66d4648490523 (diff)
downloadqmk_firmware-d13ada11622977bcc0b530212b4405229805016d.tar.gz
qmk_firmware-d13ada11622977bcc0b530212b4405229805016d.zip
Add customisable EEPROM driver selection (#7274)
- uprintf -> dprintf - Fix atsam "vendor" eeprom. - Bump Kinetis K20x to 64 bytes, too. - Rollback Kinetis to 32 bytes as partitioning can only be done once. Add warning about changing the value. - Change RAM-backed "fake" EEPROM implementations to match eeconfig's current usage. - Add 24LC128 by request.
Diffstat (limited to 'tmk_core')
-rw-r--r--tmk_core/common.mk30
-rw-r--r--tmk_core/common/arm_atsam/eeprom.c13
-rw-r--r--tmk_core/common/chibios/eeprom_stm32.c6
-rw-r--r--tmk_core/common/chibios/eeprom_teensy.c25
-rw-r--r--tmk_core/common/eeconfig.c10
-rw-r--r--tmk_core/common/eeprom.h9
-rw-r--r--tmk_core/common/test/eeprom.c6
7 files changed, 51 insertions, 48 deletions
diff --git a/tmk_core/common.mk b/tmk_core/common.mk
index 8f355da12..5f149d8f4 100644
--- a/tmk_core/common.mk
+++ b/tmk_core/common.mk
@@ -26,29 +26,11 @@ TMK_COMMON_SRC += $(COMMON_DIR)/host.c \
26 $(PLATFORM_COMMON_DIR)/bootloader.c \ 26 $(PLATFORM_COMMON_DIR)/bootloader.c \
27 27
28ifeq ($(PLATFORM),AVR) 28ifeq ($(PLATFORM),AVR)
29 TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/xprintf.S 29 TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/xprintf.S
30endif 30endif
31 31
32ifeq ($(PLATFORM),CHIBIOS) 32ifeq ($(PLATFORM),CHIBIOS)
33 TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/printf.c 33 TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/printf.c
34 ifeq ($(MCU_SERIES), STM32F3xx)
35 TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom_stm32.c
36 TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/flash_stm32.c
37 TMK_COMMON_DEFS += -DEEPROM_EMU_STM32F303xC
38 TMK_COMMON_DEFS += -DSTM32_EEPROM_ENABLE
39 else ifeq ($(MCU_SERIES), STM32F1xx)
40 TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom_stm32.c
41 TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/flash_stm32.c
42 TMK_COMMON_DEFS += -DEEPROM_EMU_STM32F103xB
43 TMK_COMMON_DEFS += -DSTM32_EEPROM_ENABLE
44 else ifeq ($(MCU_SERIES)_$(MCU_LDSCRIPT), STM32F0xx_STM32F072xB)
45 TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom_stm32.c
46 TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/flash_stm32.c
47 TMK_COMMON_DEFS += -DEEPROM_EMU_STM32F072xB
48 TMK_COMMON_DEFS += -DSTM32_EEPROM_ENABLE
49 else
50 TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom_teensy.c
51 endif
52 ifeq ($(strip $(AUTO_SHIFT_ENABLE)), yes) 34 ifeq ($(strip $(AUTO_SHIFT_ENABLE)), yes)
53 TMK_COMMON_SRC += $(CHIBIOS)/os/various/syscalls.c 35 TMK_COMMON_SRC += $(CHIBIOS)/os/various/syscalls.c
54 else ifeq ($(strip $(TERMINAL_ENABLE)), yes) 36 else ifeq ($(strip $(TERMINAL_ENABLE)), yes)
@@ -57,15 +39,9 @@ ifeq ($(PLATFORM),CHIBIOS)
57endif 39endif
58 40
59ifeq ($(PLATFORM),ARM_ATSAM) 41ifeq ($(PLATFORM),ARM_ATSAM)
60 TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/printf.c 42 TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/printf.c
61 TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom.c
62endif 43endif
63 44
64ifeq ($(PLATFORM),TEST)
65 TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom.c
66endif
67
68
69 45
70# Option modules 46# Option modules
71BOOTMAGIC_ENABLE ?= no 47BOOTMAGIC_ENABLE ?= no
diff --git a/tmk_core/common/arm_atsam/eeprom.c b/tmk_core/common/arm_atsam/eeprom.c
index 44a0bf4d7..a69f38282 100644
--- a/tmk_core/common/arm_atsam/eeprom.c
+++ b/tmk_core/common/arm_atsam/eeprom.c
@@ -16,9 +16,12 @@
16 16
17#include "eeprom.h" 17#include "eeprom.h"
18 18
19#define EEPROM_SIZE 32 19#ifndef EEPROM_SIZE
20# include "eeconfig.h"
21# define EEPROM_SIZE (((EECONFIG_SIZE+3)/4)*4) // based off eeconfig's current usage, aligned to 4-byte sizes, to deal with LTO
22#endif
20 23
21static uint8_t buffer[EEPROM_SIZE]; 24__attribute__((aligned(4))) static uint8_t buffer[EEPROM_SIZE];
22 25
23uint8_t eeprom_read_byte(const uint8_t *addr) { 26uint8_t eeprom_read_byte(const uint8_t *addr) {
24 uintptr_t offset = (uintptr_t)addr; 27 uintptr_t offset = (uintptr_t)addr;
@@ -40,7 +43,7 @@ uint32_t eeprom_read_dword(const uint32_t *addr) {
40 return eeprom_read_byte(p) | (eeprom_read_byte(p + 1) << 8) | (eeprom_read_byte(p + 2) << 16) | (eeprom_read_byte(p + 3) << 24); 43 return eeprom_read_byte(p) | (eeprom_read_byte(p + 1) << 8) | (eeprom_read_byte(p + 2) << 16) | (eeprom_read_byte(p + 3) << 24);
41} 44}
42 45
43void eeprom_read_block(void *buf, const void *addr, uint32_t len) { 46void eeprom_read_block(void *buf, const void *addr, size_t len) {
44 const uint8_t *p = (const uint8_t *)addr; 47 const uint8_t *p = (const uint8_t *)addr;
45 uint8_t * dest = (uint8_t *)buf; 48 uint8_t * dest = (uint8_t *)buf;
46 while (len--) { 49 while (len--) {
@@ -62,7 +65,7 @@ void eeprom_write_dword(uint32_t *addr, uint32_t value) {
62 eeprom_write_byte(p, value >> 24); 65 eeprom_write_byte(p, value >> 24);
63} 66}
64 67
65void eeprom_write_block(const void *buf, void *addr, uint32_t len) { 68void eeprom_write_block(const void *buf, void *addr, size_t len) {
66 uint8_t * p = (uint8_t *)addr; 69 uint8_t * p = (uint8_t *)addr;
67 const uint8_t *src = (const uint8_t *)buf; 70 const uint8_t *src = (const uint8_t *)buf;
68 while (len--) { 71 while (len--) {
@@ -86,7 +89,7 @@ void eeprom_update_dword(uint32_t *addr, uint32_t value) {
86 eeprom_write_byte(p, value >> 24); 89 eeprom_write_byte(p, value >> 24);
87} 90}
88 91
89void eeprom_update_block(const void *buf, void *addr, uint32_t len) { 92void eeprom_update_block(const void *buf, void *addr, size_t len) {
90 uint8_t * p = (uint8_t *)addr; 93 uint8_t * p = (uint8_t *)addr;
91 const uint8_t *src = (const uint8_t *)buf; 94 const uint8_t *src = (const uint8_t *)buf;
92 while (len--) { 95 while (len--) {
diff --git a/tmk_core/common/chibios/eeprom_stm32.c b/tmk_core/common/chibios/eeprom_stm32.c
index 926b581c6..ea5198972 100644
--- a/tmk_core/common/chibios/eeprom_stm32.c
+++ b/tmk_core/common/chibios/eeprom_stm32.c
@@ -173,7 +173,7 @@ void eeprom_update_dword(uint32_t *Address, uint32_t Value) {
173 } 173 }
174} 174}
175 175
176void eeprom_read_block(void *buf, const void *addr, uint32_t len) { 176void eeprom_read_block(void *buf, const void *addr, size_t len) {
177 const uint8_t *p = (const uint8_t *)addr; 177 const uint8_t *p = (const uint8_t *)addr;
178 uint8_t * dest = (uint8_t *)buf; 178 uint8_t * dest = (uint8_t *)buf;
179 while (len--) { 179 while (len--) {
@@ -181,7 +181,7 @@ void eeprom_read_block(void *buf, const void *addr, uint32_t len) {
181 } 181 }
182} 182}
183 183
184void eeprom_write_block(const void *buf, void *addr, uint32_t len) { 184void eeprom_write_block(const void *buf, void *addr, size_t len) {
185 uint8_t * p = (uint8_t *)addr; 185 uint8_t * p = (uint8_t *)addr;
186 const uint8_t *src = (const uint8_t *)buf; 186 const uint8_t *src = (const uint8_t *)buf;
187 while (len--) { 187 while (len--) {
@@ -189,7 +189,7 @@ void eeprom_write_block(const void *buf, void *addr, uint32_t len) {
189 } 189 }
190} 190}
191 191
192void eeprom_update_block(const void *buf, void *addr, uint32_t len) { 192void eeprom_update_block(const void *buf, void *addr, size_t len) {
193 uint8_t * p = (uint8_t *)addr; 193 uint8_t * p = (uint8_t *)addr;
194 const uint8_t *src = (const uint8_t *)buf; 194 const uint8_t *src = (const uint8_t *)buf;
195 while (len--) { 195 while (len--) {
diff --git a/tmk_core/common/chibios/eeprom_teensy.c b/tmk_core/common/chibios/eeprom_teensy.c
index a4093fb3b..0fab9f73d 100644
--- a/tmk_core/common/chibios/eeprom_teensy.c
+++ b/tmk_core/common/chibios/eeprom_teensy.c
@@ -50,7 +50,17 @@
50// (aligned to 2 or 4 byte boundaries) has twice the endurance 50// (aligned to 2 or 4 byte boundaries) has twice the endurance
51// compared to writing 8 bit bytes. 51// compared to writing 8 bit bytes.
52// 52//
53# define EEPROM_SIZE 32 53# ifndef EEPROM_SIZE
54# define EEPROM_SIZE 32
55# endif
56
57/*
58 ^^^ Here be dragons:
59 NXP AppNote AN4282 section 3.1 states that partitioning must only be done once.
60 Once EEPROM partitioning is done, the size is locked to this initial configuration.
61 Attempts to modify the EEPROM_SIZE setting may brick your board.
62*/
63
54 64
55// Writing unaligned 16 or 32 bit data is handled automatically when 65// Writing unaligned 16 or 32 bit data is handled automatically when
56// this is defined, but at a cost of extra code size. Without this, 66// this is defined, but at a cost of extra code size. Without this,
@@ -517,8 +527,11 @@ void eeprom_write_block(const void *buf, void *addr, uint32_t len) {
517#else 527#else
518// No EEPROM supported, so emulate it 528// No EEPROM supported, so emulate it
519 529
520# define EEPROM_SIZE 32 530# ifndef EEPROM_SIZE
521static uint8_t buffer[EEPROM_SIZE]; 531# include "eeconfig.h"
532# define EEPROM_SIZE (((EECONFIG_SIZE+3)/4)*4) // based off eeconfig's current usage, aligned to 4-byte sizes, to deal with LTO
533# endif
534__attribute__((aligned(4))) static uint8_t buffer[EEPROM_SIZE];
522 535
523uint8_t eeprom_read_byte(const uint8_t *addr) { 536uint8_t eeprom_read_byte(const uint8_t *addr) {
524 uint32_t offset = (uint32_t)addr; 537 uint32_t offset = (uint32_t)addr;
@@ -540,7 +553,7 @@ uint32_t eeprom_read_dword(const uint32_t *addr) {
540 return eeprom_read_byte(p) | (eeprom_read_byte(p + 1) << 8) | (eeprom_read_byte(p + 2) << 16) | (eeprom_read_byte(p + 3) << 24); 553 return eeprom_read_byte(p) | (eeprom_read_byte(p + 1) << 8) | (eeprom_read_byte(p + 2) << 16) | (eeprom_read_byte(p + 3) << 24);
541} 554}
542 555
543void eeprom_read_block(void *buf, const void *addr, uint32_t len) { 556void eeprom_read_block(void *buf, const void *addr, size_t len) {
544 const uint8_t *p = (const uint8_t *)addr; 557 const uint8_t *p = (const uint8_t *)addr;
545 uint8_t * dest = (uint8_t *)buf; 558 uint8_t * dest = (uint8_t *)buf;
546 while (len--) { 559 while (len--) {
@@ -562,7 +575,7 @@ void eeprom_write_dword(uint32_t *addr, uint32_t value) {
562 eeprom_write_byte(p, value >> 24); 575 eeprom_write_byte(p, value >> 24);
563} 576}
564 577
565void eeprom_write_block(const void *buf, void *addr, uint32_t len) { 578void eeprom_write_block(const void *buf, void *addr, size_t len) {
566 uint8_t * p = (uint8_t *)addr; 579 uint8_t * p = (uint8_t *)addr;
567 const uint8_t *src = (const uint8_t *)buf; 580 const uint8_t *src = (const uint8_t *)buf;
568 while (len--) { 581 while (len--) {
@@ -589,7 +602,7 @@ void eeprom_update_dword(uint32_t *addr, uint32_t value) {
589 eeprom_write_byte(p, value >> 24); 602 eeprom_write_byte(p, value >> 24);
590} 603}
591 604
592void eeprom_update_block(const void *buf, void *addr, uint32_t len) { 605void eeprom_update_block(const void *buf, void *addr, size_t len) {
593 uint8_t * p = (uint8_t *)addr; 606 uint8_t * p = (uint8_t *)addr;
594 const uint8_t *src = (const uint8_t *)buf; 607 const uint8_t *src = (const uint8_t *)buf;
595 while (len--) { 608 while (len--) {
diff --git a/tmk_core/common/eeconfig.c b/tmk_core/common/eeconfig.c
index 7cec4bd7d..fe56c57d1 100644
--- a/tmk_core/common/eeconfig.c
+++ b/tmk_core/common/eeconfig.c
@@ -9,6 +9,10 @@
9# include "eeprom_stm32.h" 9# include "eeprom_stm32.h"
10#endif 10#endif
11 11
12#if defined(EEPROM_DRIVER)
13# include "eeprom_driver.h"
14#endif
15
12/** \brief eeconfig enable 16/** \brief eeconfig enable
13 * 17 *
14 * FIXME: needs doc 18 * FIXME: needs doc
@@ -32,6 +36,9 @@ void eeconfig_init_quantum(void) {
32#ifdef STM32_EEPROM_ENABLE 36#ifdef STM32_EEPROM_ENABLE
33 EEPROM_Erase(); 37 EEPROM_Erase();
34#endif 38#endif
39#if defined(EEPROM_DRIVER)
40 eeprom_driver_erase();
41#endif
35 eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER); 42 eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER);
36 eeprom_update_byte(EECONFIG_DEBUG, 0); 43 eeprom_update_byte(EECONFIG_DEBUG, 0);
37 eeprom_update_byte(EECONFIG_DEFAULT_LAYER, 0); 44 eeprom_update_byte(EECONFIG_DEFAULT_LAYER, 0);
@@ -81,6 +88,9 @@ void eeconfig_disable(void) {
81#ifdef STM32_EEPROM_ENABLE 88#ifdef STM32_EEPROM_ENABLE
82 EEPROM_Erase(); 89 EEPROM_Erase();
83#endif 90#endif
91#if defined(EEPROM_DRIVER)
92 eeprom_driver_erase();
93#endif
84 eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER_OFF); 94 eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER_OFF);
85} 95}
86 96
diff --git a/tmk_core/common/eeprom.h b/tmk_core/common/eeprom.h
index fcd1667c0..8a81e7066 100644
--- a/tmk_core/common/eeprom.h
+++ b/tmk_core/common/eeprom.h
@@ -1,23 +1,24 @@
1#ifndef TMK_CORE_COMMON_EEPROM_H_ 1#ifndef TMK_CORE_COMMON_EEPROM_H_
2#define TMK_CORE_COMMON_EEPROM_H_ 2#define TMK_CORE_COMMON_EEPROM_H_
3 3
4#if defined(__AVR__) 4#if defined(__AVR__) && !defined(EEPROM_DRIVER)
5# include <avr/eeprom.h> 5# include <avr/eeprom.h>
6#else 6#else
7# include <stdint.h> 7# include <stdint.h>
8# include <stdlib.h>
8 9
9uint8_t eeprom_read_byte(const uint8_t *__p); 10uint8_t eeprom_read_byte(const uint8_t *__p);
10uint16_t eeprom_read_word(const uint16_t *__p); 11uint16_t eeprom_read_word(const uint16_t *__p);
11uint32_t eeprom_read_dword(const uint32_t *__p); 12uint32_t eeprom_read_dword(const uint32_t *__p);
12void eeprom_read_block(void *__dst, const void *__src, uint32_t __n); 13void eeprom_read_block(void *__dst, const void *__src, size_t __n);
13void eeprom_write_byte(uint8_t *__p, uint8_t __value); 14void eeprom_write_byte(uint8_t *__p, uint8_t __value);
14void eeprom_write_word(uint16_t *__p, uint16_t __value); 15void eeprom_write_word(uint16_t *__p, uint16_t __value);
15void eeprom_write_dword(uint32_t *__p, uint32_t __value); 16void eeprom_write_dword(uint32_t *__p, uint32_t __value);
16void eeprom_write_block(const void *__src, void *__dst, uint32_t __n); 17void eeprom_write_block(const void *__src, void *__dst, size_t __n);
17void eeprom_update_byte(uint8_t *__p, uint8_t __value); 18void eeprom_update_byte(uint8_t *__p, uint8_t __value);
18void eeprom_update_word(uint16_t *__p, uint16_t __value); 19void eeprom_update_word(uint16_t *__p, uint16_t __value);
19void eeprom_update_dword(uint32_t *__p, uint32_t __value); 20void eeprom_update_dword(uint32_t *__p, uint32_t __value);
20void eeprom_update_block(const void *__src, void *__dst, uint32_t __n); 21void eeprom_update_block(const void *__src, void *__dst, size_t __n);
21#endif 22#endif
22 23
23#endif /* TMK_CORE_COMMON_EEPROM_H_ */ 24#endif /* TMK_CORE_COMMON_EEPROM_H_ */
diff --git a/tmk_core/common/test/eeprom.c b/tmk_core/common/test/eeprom.c
index 44a0bf4d7..5c8e69dae 100644
--- a/tmk_core/common/test/eeprom.c
+++ b/tmk_core/common/test/eeprom.c
@@ -40,7 +40,7 @@ uint32_t eeprom_read_dword(const uint32_t *addr) {
40 return eeprom_read_byte(p) | (eeprom_read_byte(p + 1) << 8) | (eeprom_read_byte(p + 2) << 16) | (eeprom_read_byte(p + 3) << 24); 40 return eeprom_read_byte(p) | (eeprom_read_byte(p + 1) << 8) | (eeprom_read_byte(p + 2) << 16) | (eeprom_read_byte(p + 3) << 24);
41} 41}
42 42
43void eeprom_read_block(void *buf, const void *addr, uint32_t len) { 43void eeprom_read_block(void *buf, const void *addr, size_t len) {
44 const uint8_t *p = (const uint8_t *)addr; 44 const uint8_t *p = (const uint8_t *)addr;
45 uint8_t * dest = (uint8_t *)buf; 45 uint8_t * dest = (uint8_t *)buf;
46 while (len--) { 46 while (len--) {
@@ -62,7 +62,7 @@ void eeprom_write_dword(uint32_t *addr, uint32_t value) {
62 eeprom_write_byte(p, value >> 24); 62 eeprom_write_byte(p, value >> 24);
63} 63}
64 64
65void eeprom_write_block(const void *buf, void *addr, uint32_t len) { 65void eeprom_write_block(const void *buf, void *addr, size_t len) {
66 uint8_t * p = (uint8_t *)addr; 66 uint8_t * p = (uint8_t *)addr;
67 const uint8_t *src = (const uint8_t *)buf; 67 const uint8_t *src = (const uint8_t *)buf;
68 while (len--) { 68 while (len--) {
@@ -86,7 +86,7 @@ void eeprom_update_dword(uint32_t *addr, uint32_t value) {
86 eeprom_write_byte(p, value >> 24); 86 eeprom_write_byte(p, value >> 24);
87} 87}
88 88
89void eeprom_update_block(const void *buf, void *addr, uint32_t len) { 89void eeprom_update_block(const void *buf, void *addr, size_t len) {
90 uint8_t * p = (uint8_t *)addr; 90 uint8_t * p = (uint8_t *)addr;
91 const uint8_t *src = (const uint8_t *)buf; 91 const uint8_t *src = (const uint8_t *)buf;
92 while (len--) { 92 while (len--) {