aboutsummaryrefslogtreecommitdiff
path: root/tmk_core
diff options
context:
space:
mode:
authorJoel Challis <git@zvecr.com>2021-09-15 16:30:26 +0100
committerGitHub <noreply@github.com>2021-09-15 16:30:26 +0100
commit1a68feb842ebcc6a7d1aef7cd7f83865cc18fab1 (patch)
tree4e792c29ce0587486d325c55fa3fb76cba6e1ede /tmk_core
parent6cb8a658847b90f1633b4b331bd72bbc39e69132 (diff)
downloadqmk_firmware-1a68feb842ebcc6a7d1aef7cd7f83865cc18fab1.tar.gz
qmk_firmware-1a68feb842ebcc6a7d1aef7cd7f83865cc18fab1.zip
Implement F4 eeprom (#14195)
Diffstat (limited to 'tmk_core')
-rw-r--r--tmk_core/common/chibios/eeprom_stm32_defs.h17
-rw-r--r--tmk_core/common/chibios/flash_stm32.c41
2 files changed, 53 insertions, 5 deletions
diff --git a/tmk_core/common/chibios/eeprom_stm32_defs.h b/tmk_core/common/chibios/eeprom_stm32_defs.h
index 22b4ab858..57de42c6b 100644
--- a/tmk_core/common/chibios/eeprom_stm32_defs.h
+++ b/tmk_core/common/chibios/eeprom_stm32_defs.h
@@ -32,6 +32,13 @@
32# ifndef FEE_PAGE_COUNT 32# ifndef FEE_PAGE_COUNT
33# define FEE_PAGE_COUNT 4 // How many pages are used 33# define FEE_PAGE_COUNT 4 // How many pages are used
34# endif 34# endif
35# elif defined(STM32F401xC) || defined(STM32F411xE)
36# ifndef FEE_PAGE_SIZE
37# define FEE_PAGE_SIZE 0x4000 // Page size = 16KByte
38# endif
39# ifndef FEE_PAGE_COUNT
40# define FEE_PAGE_COUNT 1 // How many pages are used
41# endif
35# endif 42# endif
36#endif 43#endif
37 44
@@ -40,17 +47,19 @@
40# define FEE_MCU_FLASH_SIZE 32 // Size in Kb 47# define FEE_MCU_FLASH_SIZE 32 // Size in Kb
41# elif defined(STM32F103xB) || defined(STM32F072xB) || defined(STM32F070xB) 48# elif defined(STM32F103xB) || defined(STM32F072xB) || defined(STM32F070xB)
42# define FEE_MCU_FLASH_SIZE 128 // Size in Kb 49# define FEE_MCU_FLASH_SIZE 128 // Size in Kb
43# elif defined(STM32F303xC) 50# elif defined(STM32F303xC) || defined(STM32F401xC)
44# define FEE_MCU_FLASH_SIZE 256 // Size in Kb 51# define FEE_MCU_FLASH_SIZE 256 // Size in Kb
45# elif defined(STM32F103xE) 52# elif defined(STM32F103xE) || defined(STM32F411xE)
46# define FEE_MCU_FLASH_SIZE 512 // Size in Kb 53# define FEE_MCU_FLASH_SIZE 512 // Size in Kb
47# endif 54# endif
48#endif 55#endif
49 56
50/* Start of the emulated eeprom */ 57/* Start of the emulated eeprom */
51#if !defined(FEE_PAGE_BASE_ADDRESS) 58#if !defined(FEE_PAGE_BASE_ADDRESS)
52# if 0 59# if defined(STM32F401xC) || defined(STM32F411xE)
53/* TODO: Add support for F4 */ 60# ifndef FEE_PAGE_BASE_ADDRESS
61# define FEE_PAGE_BASE_ADDRESS 0x08004000 // bodge to force 2nd 16k page
62# endif
54# else 63# else
55# ifndef FEE_FLASH_BASE 64# ifndef FEE_FLASH_BASE
56# define FEE_FLASH_BASE 0x8000000 65# define FEE_FLASH_BASE 0x8000000
diff --git a/tmk_core/common/chibios/flash_stm32.c b/tmk_core/common/chibios/flash_stm32.c
index 6b80ff71c..8f10903d3 100644
--- a/tmk_core/common/chibios/flash_stm32.c
+++ b/tmk_core/common/chibios/flash_stm32.c
@@ -23,6 +23,29 @@
23# define FLASH_SR_WRPERR FLASH_SR_WRPRTERR 23# define FLASH_SR_WRPERR FLASH_SR_WRPRTERR
24#endif 24#endif
25 25
26#if defined(EEPROM_EMU_STM32F401xC)
27# define FLASH_SR_PGERR (FLASH_SR_PGSERR | FLASH_SR_PGPERR | FLASH_SR_PGAERR)
28
29# define FLASH_KEY1 0x45670123U
30# define FLASH_KEY2 0xCDEF89ABU
31
32static uint8_t ADDR2PAGE(uint32_t Page_Address) {
33 switch (Page_Address) {
34 case 0x08000000 ... 0x08003FFF:
35 return 0;
36 case 0x08004000 ... 0x08007FFF:
37 return 1;
38 case 0x08008000 ... 0x0800BFFF:
39 return 2;
40 case 0x0800C000 ... 0x0800FFFF:
41 return 3;
42 }
43
44 // TODO: bad times...
45 return 7;
46}
47#endif
48
26/* Delay definition */ 49/* Delay definition */
27#define EraseTimeout ((uint32_t)0x00000FFF) 50#define EraseTimeout ((uint32_t)0x00000FFF)
28#define ProgramTimeout ((uint32_t)0x0000001F) 51#define ProgramTimeout ((uint32_t)0x0000001F)
@@ -53,7 +76,9 @@ FLASH_Status FLASH_GetStatus(void) {
53 76
54 if ((FLASH->SR & FLASH_SR_WRPERR) != 0) return FLASH_ERROR_WRP; 77 if ((FLASH->SR & FLASH_SR_WRPERR) != 0) return FLASH_ERROR_WRP;
55 78
79#if defined(FLASH_OBR_OPTERR)
56 if ((FLASH->SR & FLASH_OBR_OPTERR) != 0) return FLASH_ERROR_OPT; 80 if ((FLASH->SR & FLASH_OBR_OPTERR) != 0) return FLASH_ERROR_OPT;
81#endif
57 82
58 return FLASH_COMPLETE; 83 return FLASH_COMPLETE;
59} 84}
@@ -95,15 +120,24 @@ FLASH_Status FLASH_ErasePage(uint32_t Page_Address) {
95 120
96 if (status == FLASH_COMPLETE) { 121 if (status == FLASH_COMPLETE) {
97 /* if the previous operation is completed, proceed to erase the page */ 122 /* if the previous operation is completed, proceed to erase the page */
123#if defined(FLASH_CR_SNB)
124 FLASH->CR &= ~FLASH_CR_SNB;
125 FLASH->CR |= FLASH_CR_SER | (ADDR2PAGE(Page_Address) << FLASH_CR_SNB_Pos);
126#else
98 FLASH->CR |= FLASH_CR_PER; 127 FLASH->CR |= FLASH_CR_PER;
99 FLASH->AR = Page_Address; 128 FLASH->AR = Page_Address;
129#endif
100 FLASH->CR |= FLASH_CR_STRT; 130 FLASH->CR |= FLASH_CR_STRT;
101 131
102 /* Wait for last operation to be completed */ 132 /* Wait for last operation to be completed */
103 status = FLASH_WaitForLastOperation(EraseTimeout); 133 status = FLASH_WaitForLastOperation(EraseTimeout);
104 if (status != FLASH_TIMEOUT) { 134 if (status != FLASH_TIMEOUT) {
105 /* if the erase operation is completed, disable the PER Bit */ 135 /* if the erase operation is completed, disable the configured Bits */
136#if defined(FLASH_CR_SNB)
137 FLASH->CR &= ~(FLASH_CR_SER | FLASH_CR_SNB);
138#else
106 FLASH->CR &= ~FLASH_CR_PER; 139 FLASH->CR &= ~FLASH_CR_PER;
140#endif
107 } 141 }
108 FLASH->SR = (FLASH_SR_EOP | FLASH_SR_PGERR | FLASH_SR_WRPERR); 142 FLASH->SR = (FLASH_SR_EOP | FLASH_SR_PGERR | FLASH_SR_WRPERR);
109 } 143 }
@@ -126,6 +160,11 @@ FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data) {
126 status = FLASH_WaitForLastOperation(ProgramTimeout); 160 status = FLASH_WaitForLastOperation(ProgramTimeout);
127 if (status == FLASH_COMPLETE) { 161 if (status == FLASH_COMPLETE) {
128 /* if the previous operation is completed, proceed to program the new data */ 162 /* if the previous operation is completed, proceed to program the new data */
163
164#if defined(FLASH_CR_PSIZE)
165 FLASH->CR &= ~FLASH_CR_PSIZE;
166 FLASH->CR |= FLASH_CR_PSIZE_0;
167#endif
129 FLASH->CR |= FLASH_CR_PG; 168 FLASH->CR |= FLASH_CR_PG;
130 *(__IO uint16_t*)Address = Data; 169 *(__IO uint16_t*)Address = Data;
131 /* Wait for last operation to be completed */ 170 /* Wait for last operation to be completed */