aboutsummaryrefslogtreecommitdiff
path: root/tmk_core
diff options
context:
space:
mode:
authorMichael Stapelberg <stapelberg@users.noreply.github.com>2021-11-01 22:52:34 +0100
committerGitHub <noreply@github.com>2021-11-01 21:52:34 +0000
commit7f8faa429e0c0662cec34a7d60e33ca58333d6d7 (patch)
treec368b9cf7de15cbb0d360562bb6fc772805e93b2 /tmk_core
parent92385e30cdad61ddfc0461b1ce1340bcb494a68a (diff)
downloadqmk_firmware-7f8faa429e0c0662cec34a7d60e33ca58333d6d7.tar.gz
qmk_firmware-7f8faa429e0c0662cec34a7d60e33ca58333d6d7.zip
core: make the full 4096 bytes of EEPROM work on Teensy 3.6 (#12947)
This commit updates QMK’s copy of the the teensy3 Arduino core code with the necessary changes to make the Teensy 3.6 work. Aside from different values for the partitioning, HSRUN mode must be left temporarily while using the EEPROM. fixes https://github.com/kinx-project/kint/issues/8 related to https://github.com/kinx-project/kint/issues/10
Diffstat (limited to 'tmk_core')
-rw-r--r--tmk_core/common/chibios/eeprom_teensy.c213
1 files changed, 199 insertions, 14 deletions
diff --git a/tmk_core/common/chibios/eeprom_teensy.c b/tmk_core/common/chibios/eeprom_teensy.c
index 4aaf66526..2493c607d 100644
--- a/tmk_core/common/chibios/eeprom_teensy.c
+++ b/tmk_core/common/chibios/eeprom_teensy.c
@@ -39,7 +39,126 @@
39 * SOFTWARE. 39 * SOFTWARE.
40 */ 40 */
41 41
42#if defined(K20x) /* chip selection */ 42#define SMC_PMSTAT_RUN ((uint8_t)0x01)
43#define SMC_PMSTAT_HSRUN ((uint8_t)0x80)
44
45#define F_CPU KINETIS_SYSCLK_FREQUENCY
46
47static int kinetis_hsrun_disable(void) {
48#if defined(MK66F18)
49 if (SMC->PMSTAT == SMC_PMSTAT_HSRUN) {
50// First, reduce the CPU clock speed, but do not change
51// the peripheral speed (F_BUS). Serial1 & Serial2 baud
52// rates will be impacted, but most other peripherals
53// will continue functioning at the same speed.
54# if F_CPU == 256000000 && F_BUS == 64000000
55 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(1, 3, 1, 7); // TODO: TEST
56# elif F_CPU == 256000000 && F_BUS == 128000000
57 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(1, 1, 1, 7); // TODO: TEST
58# elif F_CPU == 240000000 && F_BUS == 60000000
59 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(1, 3, 1, 7); // ok
60# elif F_CPU == 240000000 && F_BUS == 80000000
61 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(2, 2, 2, 8); // ok
62# elif F_CPU == 240000000 && F_BUS == 120000000
63 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(1, 1, 1, 7); // ok
64# elif F_CPU == 216000000 && F_BUS == 54000000
65 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(1, 3, 1, 7); // ok
66# elif F_CPU == 216000000 && F_BUS == 72000000
67 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(2, 2, 2, 8); // ok
68# elif F_CPU == 216000000 && F_BUS == 108000000
69 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(1, 1, 1, 7); // ok
70# elif F_CPU == 192000000 && F_BUS == 48000000
71 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(1, 3, 1, 7); // ok
72# elif F_CPU == 192000000 && F_BUS == 64000000
73 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(2, 2, 2, 8); // ok
74# elif F_CPU == 192000000 && F_BUS == 96000000
75 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(1, 1, 1, 7); // ok
76# elif F_CPU == 180000000 && F_BUS == 60000000
77 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(2, 2, 2, 8); // ok
78# elif F_CPU == 180000000 && F_BUS == 90000000
79 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(1, 1, 1, 7); // ok
80# elif F_CPU == 168000000 && F_BUS == 56000000
81 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(2, 2, 2, 5); // ok
82# elif F_CPU == 144000000 && F_BUS == 48000000
83 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(2, 2, 2, 5); // ok
84# elif F_CPU == 144000000 && F_BUS == 72000000
85 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(1, 1, 1, 5); // ok
86# elif F_CPU == 120000000 && F_BUS == 60000000
87 SIM->CLKDIV1 = SIM_CLKDIV1_OUTDIV1(KINETIS_CLKDIV1_OUTDIV1 - 1) | SIM_CLKDIV1_OUTDIV2(KINETIS_CLKDIV1_OUTDIV2 - 1) |
88# if defined(MK66F18)
89 SIM_CLKDIV1_OUTDIV3(KINETIS_CLKDIV1_OUTDIV3 - 1) |
90# endif
91 SIM_CLKDIV1_OUTDIV4(KINETIS_CLKDIV1_OUTDIV4 - 1);
92# else
93 return 0;
94# endif
95 // Then turn off HSRUN mode
96 SMC->PMCTRL = SMC_PMCTRL_RUNM_SET(0);
97 while (SMC->PMSTAT == SMC_PMSTAT_HSRUN)
98 ; // wait
99 return 1;
100 }
101#endif
102 return 0;
103}
104
105static int kinetis_hsrun_enable(void) {
106#if defined(MK66F18)
107 if (SMC->PMSTAT == SMC_PMSTAT_RUN) {
108 // Turn HSRUN mode on
109 SMC->PMCTRL = SMC_PMCTRL_RUNM_SET(3);
110 while (SMC->PMSTAT != SMC_PMSTAT_HSRUN) {
111 ;
112 } // wait
113// Then configure clock for full speed
114# if F_CPU == 256000000 && F_BUS == 64000000
115 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 3, 0, 7);
116# elif F_CPU == 256000000 && F_BUS == 128000000
117 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 1, 0, 7);
118# elif F_CPU == 240000000 && F_BUS == 60000000
119 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 3, 0, 7);
120# elif F_CPU == 240000000 && F_BUS == 80000000
121 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 2, 0, 7);
122# elif F_CPU == 240000000 && F_BUS == 120000000
123 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 1, 0, 7);
124# elif F_CPU == 216000000 && F_BUS == 54000000
125 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 3, 0, 7);
126# elif F_CPU == 216000000 && F_BUS == 72000000
127 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 2, 0, 7);
128# elif F_CPU == 216000000 && F_BUS == 108000000
129 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 1, 0, 7);
130# elif F_CPU == 192000000 && F_BUS == 48000000
131 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 3, 0, 6);
132# elif F_CPU == 192000000 && F_BUS == 64000000
133 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 2, 0, 6);
134# elif F_CPU == 192000000 && F_BUS == 96000000
135 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 1, 0, 6);
136# elif F_CPU == 180000000 && F_BUS == 60000000
137 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 2, 0, 6);
138# elif F_CPU == 180000000 && F_BUS == 90000000
139 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 1, 0, 6);
140# elif F_CPU == 168000000 && F_BUS == 56000000
141 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 2, 0, 5);
142# elif F_CPU == 144000000 && F_BUS == 48000000
143 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 2, 0, 4);
144# elif F_CPU == 144000000 && F_BUS == 72000000
145 SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 1, 0, 4);
146# elif F_CPU == 120000000 && F_BUS == 60000000
147 SIM->CLKDIV1 = SIM_CLKDIV1_OUTDIV1(KINETIS_CLKDIV1_OUTDIV1 - 1) | SIM_CLKDIV1_OUTDIV2(KINETIS_CLKDIV1_OUTDIV2 - 1) |
148# if defined(MK66F18)
149 SIM_CLKDIV1_OUTDIV3(KINETIS_CLKDIV1_OUTDIV3 - 1) |
150# endif
151 SIM_CLKDIV1_OUTDIV4(KINETIS_CLKDIV1_OUTDIV4 - 1);
152# else
153 return 0;
154# endif
155 return 1;
156 }
157#endif
158 return 0;
159}
160
161#if defined(K20x) || defined(MK66F18) /* chip selection */
43/* Teensy 3.0, 3.1, 3.2; mchck; infinity keyboard */ 162/* Teensy 3.0, 3.1, 3.2; mchck; infinity keyboard */
44 163
45// The EEPROM is really RAM with a hardware-based backup system to 164// The EEPROM is really RAM with a hardware-based backup system to
@@ -69,22 +188,34 @@
69// 188//
70# define HANDLE_UNALIGNED_WRITES 189# define HANDLE_UNALIGNED_WRITES
71 190
191# if defined(K20x)
192# define EEPROM_MAX 2048
193# define EEPARTITION 0x03 // all 32K dataflash for EEPROM, none for Data
194# define EEESPLIT 0x30 // must be 0x30 on these chips
195# elif defined(MK66F18)
196# define EEPROM_MAX 4096
197# define EEPARTITION 0x05 // 128K dataflash for EEPROM, 128K for Data
198# define EEESPLIT 0x10 // best endurance: 0x00 = first 12%, 0x10 = first 25%, 0x30 = all equal
199# endif
200
72// Minimum EEPROM Endurance 201// Minimum EEPROM Endurance
73// ------------------------ 202// ------------------------
74# if (EEPROM_SIZE == 2048) // 35000 writes/byte or 70000 writes/word 203# if (EEPROM_SIZE == 4096)
75# define EEESIZE 0x33 204# define EEESIZE 0x02
205# elif (EEPROM_SIZE == 2048) // 35000 writes/byte or 70000 writes/word
206# define EEESIZE 0x03
76# elif (EEPROM_SIZE == 1024) // 75000 writes/byte or 150000 writes/word 207# elif (EEPROM_SIZE == 1024) // 75000 writes/byte or 150000 writes/word
77# define EEESIZE 0x34 208# define EEESIZE 0x04
78# elif (EEPROM_SIZE == 512) // 155000 writes/byte or 310000 writes/word 209# elif (EEPROM_SIZE == 512) // 155000 writes/byte or 310000 writes/word
79# define EEESIZE 0x35 210# define EEESIZE 0x05
80# elif (EEPROM_SIZE == 256) // 315000 writes/byte or 630000 writes/word 211# elif (EEPROM_SIZE == 256) // 315000 writes/byte or 630000 writes/word
81# define EEESIZE 0x36 212# define EEESIZE 0x06
82# elif (EEPROM_SIZE == 128) // 635000 writes/byte or 1270000 writes/word 213# elif (EEPROM_SIZE == 128) // 635000 writes/byte or 1270000 writes/word
83# define EEESIZE 0x37 214# define EEESIZE 0x07
84# elif (EEPROM_SIZE == 64) // 1275000 writes/byte or 2550000 writes/word 215# elif (EEPROM_SIZE == 64) // 1275000 writes/byte or 2550000 writes/word
85# define EEESIZE 0x38 216# define EEESIZE 0x08
86# elif (EEPROM_SIZE == 32) // 2555000 writes/byte or 5110000 writes/word 217# elif (EEPROM_SIZE == 32) // 2555000 writes/byte or 5110000 writes/word
87# define EEESIZE 0x39 218# define EEESIZE 0x09
88# endif 219# endif
89 220
90/** \brief eeprom initialization 221/** \brief eeprom initialization
@@ -97,15 +228,21 @@ void eeprom_initialize(void) {
97 uint8_t status; 228 uint8_t status;
98 229
99 if (FTFL->FCNFG & FTFL_FCNFG_RAMRDY) { 230 if (FTFL->FCNFG & FTFL_FCNFG_RAMRDY) {
231 uint8_t stat = FTFL->FSTAT & 0x70;
232 if (stat) FTFL->FSTAT = stat;
233
100 // FlexRAM is configured as traditional RAM 234 // FlexRAM is configured as traditional RAM
101 // We need to reconfigure for EEPROM usage 235 // We need to reconfigure for EEPROM usage
102 FTFL->FCCOB0 = 0x80; // PGMPART = Program Partition Command 236 kinetis_hsrun_disable();
103 FTFL->FCCOB4 = EEESIZE; // EEPROM Size 237 FTFL->FCCOB0 = FTFE_FCCOB0_CCOBn_SET(0x80); // PGMPART = Program Partition Command
104 FTFL->FCCOB5 = 0x03; // 0K for Dataflash, 32K for EEPROM backup 238 FTFL->FCCOB3 = 0;
239 FTFL->FCCOB4 = EEESPLIT | EEESIZE;
240 FTFL->FCCOB5 = EEPARTITION;
105 __disable_irq(); 241 __disable_irq();
106 // do_flash_cmd() must execute from RAM. Luckily the C syntax is simple... 242 // do_flash_cmd() must execute from RAM. Luckily the C syntax is simple...
107 (*((void (*)(volatile uint8_t *))((uint32_t)do_flash_cmd | 1)))(&(FTFL->FSTAT)); 243 (*((void (*)(volatile uint8_t *))((uint32_t)do_flash_cmd | 1)))(&(FTFL->FSTAT));
108 __enable_irq(); 244 __enable_irq();
245 kinetis_hsrun_enable();
109 status = FTFL->FSTAT; 246 status = FTFL->FSTAT;
110 if (status & (FTFL_FSTAT_RDCOLERR | FTFL_FSTAT_ACCERR | FTFL_FSTAT_FPVIOL)) { 247 if (status & (FTFL_FSTAT_RDCOLERR | FTFL_FSTAT_ACCERR | FTFL_FSTAT_FPVIOL)) {
111 FTFL->FSTAT = (status & (FTFL_FSTAT_RDCOLERR | FTFL_FSTAT_ACCERR | FTFL_FSTAT_FPVIOL)); 248 FTFL->FSTAT = (status & (FTFL_FSTAT_RDCOLERR | FTFL_FSTAT_ACCERR | FTFL_FSTAT_FPVIOL));
@@ -114,11 +251,11 @@ void eeprom_initialize(void) {
114 } 251 }
115 // wait for eeprom to become ready (is this really necessary?) 252 // wait for eeprom to become ready (is this really necessary?)
116 while (!(FTFL->FCNFG & FTFL_FCNFG_EEERDY)) { 253 while (!(FTFL->FCNFG & FTFL_FCNFG_EEERDY)) {
117 if (++count > 20000) break; 254 if (++count > 200000) break;
118 } 255 }
119} 256}
120 257
121# define FlexRAM ((uint8_t *)0x14000000) 258# define FlexRAM ((volatile uint8_t *)0x14000000)
122 259
123/** \brief eeprom read byte 260/** \brief eeprom read byte
124 * 261 *
@@ -195,8 +332,12 @@ void eeprom_write_byte(uint8_t *addr, uint8_t value) {
195 if (offset >= EEPROM_SIZE) return; 332 if (offset >= EEPROM_SIZE) return;
196 if (!(FTFL->FCNFG & FTFL_FCNFG_EEERDY)) eeprom_initialize(); 333 if (!(FTFL->FCNFG & FTFL_FCNFG_EEERDY)) eeprom_initialize();
197 if (FlexRAM[offset] != value) { 334 if (FlexRAM[offset] != value) {
335 kinetis_hsrun_disable();
336 uint8_t stat = FTFL->FSTAT & 0x70;
337 if (stat) FTFL->FSTAT = stat;
198 FlexRAM[offset] = value; 338 FlexRAM[offset] = value;
199 flexram_wait(); 339 flexram_wait();
340 kinetis_hsrun_enable();
200 } 341 }
201} 342}
202 343
@@ -213,18 +354,30 @@ void eeprom_write_word(uint16_t *addr, uint16_t value) {
213 if ((offset & 1) == 0) { 354 if ((offset & 1) == 0) {
214# endif 355# endif
215 if (*(uint16_t *)(&FlexRAM[offset]) != value) { 356 if (*(uint16_t *)(&FlexRAM[offset]) != value) {
357 kinetis_hsrun_disable();
358 uint8_t stat = FTFL->FSTAT & 0x70;
359 if (stat) FTFL->FSTAT = stat;
216 *(uint16_t *)(&FlexRAM[offset]) = value; 360 *(uint16_t *)(&FlexRAM[offset]) = value;
217 flexram_wait(); 361 flexram_wait();
362 kinetis_hsrun_enable();
218 } 363 }
219# ifdef HANDLE_UNALIGNED_WRITES 364# ifdef HANDLE_UNALIGNED_WRITES
220 } else { 365 } else {
221 if (FlexRAM[offset] != value) { 366 if (FlexRAM[offset] != value) {
367 kinetis_hsrun_disable();
368 uint8_t stat = FTFL->FSTAT & 0x70;
369 if (stat) FTFL->FSTAT = stat;
222 FlexRAM[offset] = value; 370 FlexRAM[offset] = value;
223 flexram_wait(); 371 flexram_wait();
372 kinetis_hsrun_enable();
224 } 373 }
225 if (FlexRAM[offset + 1] != (value >> 8)) { 374 if (FlexRAM[offset + 1] != (value >> 8)) {
375 kinetis_hsrun_disable();
376 uint8_t stat = FTFL->FSTAT & 0x70;
377 if (stat) FTFL->FSTAT = stat;
226 FlexRAM[offset + 1] = value >> 8; 378 FlexRAM[offset + 1] = value >> 8;
227 flexram_wait(); 379 flexram_wait();
380 kinetis_hsrun_enable();
228 } 381 }
229 } 382 }
230# endif 383# endif
@@ -244,33 +397,57 @@ void eeprom_write_dword(uint32_t *addr, uint32_t value) {
244 case 0: 397 case 0:
245# endif 398# endif
246 if (*(uint32_t *)(&FlexRAM[offset]) != value) { 399 if (*(uint32_t *)(&FlexRAM[offset]) != value) {
400 kinetis_hsrun_disable();
401 uint8_t stat = FTFL->FSTAT & 0x70;
402 if (stat) FTFL->FSTAT = stat;
247 *(uint32_t *)(&FlexRAM[offset]) = value; 403 *(uint32_t *)(&FlexRAM[offset]) = value;
248 flexram_wait(); 404 flexram_wait();
405 kinetis_hsrun_enable();
249 } 406 }
250 return; 407 return;
251# ifdef HANDLE_UNALIGNED_WRITES 408# ifdef HANDLE_UNALIGNED_WRITES
252 case 2: 409 case 2:
253 if (*(uint16_t *)(&FlexRAM[offset]) != value) { 410 if (*(uint16_t *)(&FlexRAM[offset]) != value) {
411 kinetis_hsrun_disable();
412 uint8_t stat = FTFL->FSTAT & 0x70;
413 if (stat) FTFL->FSTAT = stat;
254 *(uint16_t *)(&FlexRAM[offset]) = value; 414 *(uint16_t *)(&FlexRAM[offset]) = value;
255 flexram_wait(); 415 flexram_wait();
416 kinetis_hsrun_enable();
256 } 417 }
257 if (*(uint16_t *)(&FlexRAM[offset + 2]) != (value >> 16)) { 418 if (*(uint16_t *)(&FlexRAM[offset + 2]) != (value >> 16)) {
419 kinetis_hsrun_disable();
420 uint8_t stat = FTFL->FSTAT & 0x70;
421 if (stat) FTFL->FSTAT = stat;
258 *(uint16_t *)(&FlexRAM[offset + 2]) = value >> 16; 422 *(uint16_t *)(&FlexRAM[offset + 2]) = value >> 16;
259 flexram_wait(); 423 flexram_wait();
424 kinetis_hsrun_enable();
260 } 425 }
261 return; 426 return;
262 default: 427 default:
263 if (FlexRAM[offset] != value) { 428 if (FlexRAM[offset] != value) {
429 kinetis_hsrun_disable();
430 uint8_t stat = FTFL->FSTAT & 0x70;
431 if (stat) FTFL->FSTAT = stat;
264 FlexRAM[offset] = value; 432 FlexRAM[offset] = value;
265 flexram_wait(); 433 flexram_wait();
434 kinetis_hsrun_enable();
266 } 435 }
267 if (*(uint16_t *)(&FlexRAM[offset + 1]) != (value >> 8)) { 436 if (*(uint16_t *)(&FlexRAM[offset + 1]) != (value >> 8)) {
437 kinetis_hsrun_disable();
438 uint8_t stat = FTFL->FSTAT & 0x70;
439 if (stat) FTFL->FSTAT = stat;
268 *(uint16_t *)(&FlexRAM[offset + 1]) = value >> 8; 440 *(uint16_t *)(&FlexRAM[offset + 1]) = value >> 8;
269 flexram_wait(); 441 flexram_wait();
442 kinetis_hsrun_enable();
270 } 443 }
271 if (FlexRAM[offset + 3] != (value >> 24)) { 444 if (FlexRAM[offset + 3] != (value >> 24)) {
445 kinetis_hsrun_disable();
446 uint8_t stat = FTFL->FSTAT & 0x70;
447 if (stat) FTFL->FSTAT = stat;
272 FlexRAM[offset + 3] = value >> 24; 448 FlexRAM[offset + 3] = value >> 24;
273 flexram_wait(); 449 flexram_wait();
450 kinetis_hsrun_enable();
274 } 451 }
275 } 452 }
276# endif 453# endif
@@ -288,6 +465,7 @@ void eeprom_write_block(const void *buf, void *addr, uint32_t len) {
288 if (!(FTFL->FCNFG & FTFL_FCNFG_EEERDY)) eeprom_initialize(); 465 if (!(FTFL->FCNFG & FTFL_FCNFG_EEERDY)) eeprom_initialize();
289 if (len >= EEPROM_SIZE) len = EEPROM_SIZE; 466 if (len >= EEPROM_SIZE) len = EEPROM_SIZE;
290 if (offset + len >= EEPROM_SIZE) len = EEPROM_SIZE - offset; 467 if (offset + len >= EEPROM_SIZE) len = EEPROM_SIZE - offset;
468 kinetis_hsrun_disable();
291 while (len > 0) { 469 while (len > 0) {
292 uint32_t lsb = offset & 3; 470 uint32_t lsb = offset & 3;
293 if (lsb == 0 && len >= 4) { 471 if (lsb == 0 && len >= 4) {
@@ -298,6 +476,8 @@ void eeprom_write_block(const void *buf, void *addr, uint32_t len) {
298 val32 |= (*src++ << 16); 476 val32 |= (*src++ << 16);
299 val32 |= (*src++ << 24); 477 val32 |= (*src++ << 24);
300 if (*(uint32_t *)(&FlexRAM[offset]) != val32) { 478 if (*(uint32_t *)(&FlexRAM[offset]) != val32) {
479 uint8_t stat = FTFL->FSTAT & 0x70;
480 if (stat) FTFL->FSTAT = stat;
301 *(uint32_t *)(&FlexRAM[offset]) = val32; 481 *(uint32_t *)(&FlexRAM[offset]) = val32;
302 flexram_wait(); 482 flexram_wait();
303 } 483 }
@@ -309,6 +489,8 @@ void eeprom_write_block(const void *buf, void *addr, uint32_t len) {
309 val16 = *src++; 489 val16 = *src++;
310 val16 |= (*src++ << 8); 490 val16 |= (*src++ << 8);
311 if (*(uint16_t *)(&FlexRAM[offset]) != val16) { 491 if (*(uint16_t *)(&FlexRAM[offset]) != val16) {
492 uint8_t stat = FTFL->FSTAT & 0x70;
493 if (stat) FTFL->FSTAT = stat;
312 *(uint16_t *)(&FlexRAM[offset]) = val16; 494 *(uint16_t *)(&FlexRAM[offset]) = val16;
313 flexram_wait(); 495 flexram_wait();
314 } 496 }
@@ -318,6 +500,8 @@ void eeprom_write_block(const void *buf, void *addr, uint32_t len) {
318 // write 8 bits 500 // write 8 bits
319 uint8_t val8 = *src++; 501 uint8_t val8 = *src++;
320 if (FlexRAM[offset] != val8) { 502 if (FlexRAM[offset] != val8) {
503 uint8_t stat = FTFL->FSTAT & 0x70;
504 if (stat) FTFL->FSTAT = stat;
321 FlexRAM[offset] = val8; 505 FlexRAM[offset] = val8;
322 flexram_wait(); 506 flexram_wait();
323 } 507 }
@@ -325,6 +509,7 @@ void eeprom_write_block(const void *buf, void *addr, uint32_t len) {
325 len--; 509 len--;
326 } 510 }
327 } 511 }
512 kinetis_hsrun_enable();
328} 513}
329 514
330/* 515/*