|
@@ -39,7 +39,126 @@
|
|
|
* SOFTWARE.
|
|
|
*/
|
|
|
|
|
|
-#if defined(K20x)
|
|
|
+#define SMC_PMSTAT_RUN ((uint8_t)0x01)
|
|
|
+#define SMC_PMSTAT_HSRUN ((uint8_t)0x80)
|
|
|
+
|
|
|
+#define F_CPU KINETIS_SYSCLK_FREQUENCY
|
|
|
+
|
|
|
+static int kinetis_hsrun_disable(void) {
|
|
|
+#if defined(MK66F18)
|
|
|
+ if (SMC->PMSTAT == SMC_PMSTAT_HSRUN) {
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+# if F_CPU == 256000000 && F_BUS == 64000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(1, 3, 1, 7);
|
|
|
+# elif F_CPU == 256000000 && F_BUS == 128000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(1, 1, 1, 7);
|
|
|
+# elif F_CPU == 240000000 && F_BUS == 60000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(1, 3, 1, 7);
|
|
|
+# elif F_CPU == 240000000 && F_BUS == 80000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(2, 2, 2, 8);
|
|
|
+# elif F_CPU == 240000000 && F_BUS == 120000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(1, 1, 1, 7);
|
|
|
+# elif F_CPU == 216000000 && F_BUS == 54000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(1, 3, 1, 7);
|
|
|
+# elif F_CPU == 216000000 && F_BUS == 72000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(2, 2, 2, 8);
|
|
|
+# elif F_CPU == 216000000 && F_BUS == 108000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(1, 1, 1, 7);
|
|
|
+# elif F_CPU == 192000000 && F_BUS == 48000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(1, 3, 1, 7);
|
|
|
+# elif F_CPU == 192000000 && F_BUS == 64000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(2, 2, 2, 8);
|
|
|
+# elif F_CPU == 192000000 && F_BUS == 96000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(1, 1, 1, 7);
|
|
|
+# elif F_CPU == 180000000 && F_BUS == 60000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(2, 2, 2, 8);
|
|
|
+# elif F_CPU == 180000000 && F_BUS == 90000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(1, 1, 1, 7);
|
|
|
+# elif F_CPU == 168000000 && F_BUS == 56000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(2, 2, 2, 5);
|
|
|
+# elif F_CPU == 144000000 && F_BUS == 48000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(2, 2, 2, 5);
|
|
|
+# elif F_CPU == 144000000 && F_BUS == 72000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(1, 1, 1, 5);
|
|
|
+# elif F_CPU == 120000000 && F_BUS == 60000000
|
|
|
+ SIM->CLKDIV1 = SIM_CLKDIV1_OUTDIV1(KINETIS_CLKDIV1_OUTDIV1 - 1) | SIM_CLKDIV1_OUTDIV2(KINETIS_CLKDIV1_OUTDIV2 - 1) |
|
|
|
+# if defined(MK66F18)
|
|
|
+ SIM_CLKDIV1_OUTDIV3(KINETIS_CLKDIV1_OUTDIV3 - 1) |
|
|
|
+# endif
|
|
|
+ SIM_CLKDIV1_OUTDIV4(KINETIS_CLKDIV1_OUTDIV4 - 1);
|
|
|
+# else
|
|
|
+ return 0;
|
|
|
+# endif
|
|
|
+
|
|
|
+ SMC->PMCTRL = SMC_PMCTRL_RUNM_SET(0);
|
|
|
+ while (SMC->PMSTAT == SMC_PMSTAT_HSRUN)
|
|
|
+ ;
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int kinetis_hsrun_enable(void) {
|
|
|
+#if defined(MK66F18)
|
|
|
+ if (SMC->PMSTAT == SMC_PMSTAT_RUN) {
|
|
|
+
|
|
|
+ SMC->PMCTRL = SMC_PMCTRL_RUNM_SET(3);
|
|
|
+ while (SMC->PMSTAT != SMC_PMSTAT_HSRUN) {
|
|
|
+ ;
|
|
|
+ }
|
|
|
+
|
|
|
+# if F_CPU == 256000000 && F_BUS == 64000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 3, 0, 7);
|
|
|
+# elif F_CPU == 256000000 && F_BUS == 128000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 1, 0, 7);
|
|
|
+# elif F_CPU == 240000000 && F_BUS == 60000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 3, 0, 7);
|
|
|
+# elif F_CPU == 240000000 && F_BUS == 80000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 2, 0, 7);
|
|
|
+# elif F_CPU == 240000000 && F_BUS == 120000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 1, 0, 7);
|
|
|
+# elif F_CPU == 216000000 && F_BUS == 54000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 3, 0, 7);
|
|
|
+# elif F_CPU == 216000000 && F_BUS == 72000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 2, 0, 7);
|
|
|
+# elif F_CPU == 216000000 && F_BUS == 108000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 1, 0, 7);
|
|
|
+# elif F_CPU == 192000000 && F_BUS == 48000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 3, 0, 6);
|
|
|
+# elif F_CPU == 192000000 && F_BUS == 64000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 2, 0, 6);
|
|
|
+# elif F_CPU == 192000000 && F_BUS == 96000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 1, 0, 6);
|
|
|
+# elif F_CPU == 180000000 && F_BUS == 60000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 2, 0, 6);
|
|
|
+# elif F_CPU == 180000000 && F_BUS == 90000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 1, 0, 6);
|
|
|
+# elif F_CPU == 168000000 && F_BUS == 56000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 2, 0, 5);
|
|
|
+# elif F_CPU == 144000000 && F_BUS == 48000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 2, 0, 4);
|
|
|
+# elif F_CPU == 144000000 && F_BUS == 72000000
|
|
|
+ SIM_CLKDIV1 = SIM_CLKDIV1_OUTDIVS(0, 1, 0, 4);
|
|
|
+# elif F_CPU == 120000000 && F_BUS == 60000000
|
|
|
+ SIM->CLKDIV1 = SIM_CLKDIV1_OUTDIV1(KINETIS_CLKDIV1_OUTDIV1 - 1) | SIM_CLKDIV1_OUTDIV2(KINETIS_CLKDIV1_OUTDIV2 - 1) |
|
|
|
+# if defined(MK66F18)
|
|
|
+ SIM_CLKDIV1_OUTDIV3(KINETIS_CLKDIV1_OUTDIV3 - 1) |
|
|
|
+# endif
|
|
|
+ SIM_CLKDIV1_OUTDIV4(KINETIS_CLKDIV1_OUTDIV4 - 1);
|
|
|
+# else
|
|
|
+ return 0;
|
|
|
+# endif
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+#if defined(K20x) || defined(MK66F18)
|
|
|
|
|
|
|
|
|
|
|
@@ -69,22 +188,34 @@
|
|
|
|
|
|
# define HANDLE_UNALIGNED_WRITES
|
|
|
|
|
|
+# if defined(K20x)
|
|
|
+# define EEPROM_MAX 2048
|
|
|
+# define EEPARTITION 0x03
|
|
|
+# define EEESPLIT 0x30
|
|
|
+# elif defined(MK66F18)
|
|
|
+# define EEPROM_MAX 4096
|
|
|
+# define EEPARTITION 0x05
|
|
|
+# define EEESPLIT 0x10
|
|
|
+# endif
|
|
|
+
|
|
|
|
|
|
|
|
|
-# if (EEPROM_SIZE == 2048)
|
|
|
-# define EEESIZE 0x33
|
|
|
+# if (EEPROM_SIZE == 4096)
|
|
|
+# define EEESIZE 0x02
|
|
|
+# elif (EEPROM_SIZE == 2048)
|
|
|
+# define EEESIZE 0x03
|
|
|
# elif (EEPROM_SIZE == 1024)
|
|
|
-# define EEESIZE 0x34
|
|
|
+# define EEESIZE 0x04
|
|
|
# elif (EEPROM_SIZE == 512)
|
|
|
-# define EEESIZE 0x35
|
|
|
+# define EEESIZE 0x05
|
|
|
# elif (EEPROM_SIZE == 256)
|
|
|
-# define EEESIZE 0x36
|
|
|
+# define EEESIZE 0x06
|
|
|
# elif (EEPROM_SIZE == 128)
|
|
|
-# define EEESIZE 0x37
|
|
|
+# define EEESIZE 0x07
|
|
|
# elif (EEPROM_SIZE == 64)
|
|
|
-# define EEESIZE 0x38
|
|
|
+# define EEESIZE 0x08
|
|
|
# elif (EEPROM_SIZE == 32)
|
|
|
-# define EEESIZE 0x39
|
|
|
+# define EEESIZE 0x09
|
|
|
# endif
|
|
|
|
|
|
|
|
@@ -97,15 +228,21 @@ void eeprom_initialize(void) {
|
|
|
uint8_t status;
|
|
|
|
|
|
if (FTFL->FCNFG & FTFL_FCNFG_RAMRDY) {
|
|
|
+ uint8_t stat = FTFL->FSTAT & 0x70;
|
|
|
+ if (stat) FTFL->FSTAT = stat;
|
|
|
+
|
|
|
|
|
|
|
|
|
- FTFL->FCCOB0 = 0x80;
|
|
|
- FTFL->FCCOB4 = EEESIZE;
|
|
|
- FTFL->FCCOB5 = 0x03;
|
|
|
+ kinetis_hsrun_disable();
|
|
|
+ FTFL->FCCOB0 = FTFE_FCCOB0_CCOBn_SET(0x80);
|
|
|
+ FTFL->FCCOB3 = 0;
|
|
|
+ FTFL->FCCOB4 = EEESPLIT | EEESIZE;
|
|
|
+ FTFL->FCCOB5 = EEPARTITION;
|
|
|
__disable_irq();
|
|
|
|
|
|
(*((void (*)(volatile uint8_t *))((uint32_t)do_flash_cmd | 1)))(&(FTFL->FSTAT));
|
|
|
__enable_irq();
|
|
|
+ kinetis_hsrun_enable();
|
|
|
status = FTFL->FSTAT;
|
|
|
if (status & (FTFL_FSTAT_RDCOLERR | FTFL_FSTAT_ACCERR | FTFL_FSTAT_FPVIOL)) {
|
|
|
FTFL->FSTAT = (status & (FTFL_FSTAT_RDCOLERR | FTFL_FSTAT_ACCERR | FTFL_FSTAT_FPVIOL));
|
|
@@ -114,11 +251,11 @@ void eeprom_initialize(void) {
|
|
|
}
|
|
|
|
|
|
while (!(FTFL->FCNFG & FTFL_FCNFG_EEERDY)) {
|
|
|
- if (++count > 20000) break;
|
|
|
+ if (++count > 200000) break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-# define FlexRAM ((uint8_t *)0x14000000)
|
|
|
+# define FlexRAM ((volatile uint8_t *)0x14000000)
|
|
|
|
|
|
|
|
|
*
|
|
@@ -195,8 +332,12 @@ void eeprom_write_byte(uint8_t *addr, uint8_t value) {
|
|
|
if (offset >= EEPROM_SIZE) return;
|
|
|
if (!(FTFL->FCNFG & FTFL_FCNFG_EEERDY)) eeprom_initialize();
|
|
|
if (FlexRAM[offset] != value) {
|
|
|
+ kinetis_hsrun_disable();
|
|
|
+ uint8_t stat = FTFL->FSTAT & 0x70;
|
|
|
+ if (stat) FTFL->FSTAT = stat;
|
|
|
FlexRAM[offset] = value;
|
|
|
flexram_wait();
|
|
|
+ kinetis_hsrun_enable();
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -213,18 +354,30 @@ void eeprom_write_word(uint16_t *addr, uint16_t value) {
|
|
|
if ((offset & 1) == 0) {
|
|
|
# endif
|
|
|
if (*(uint16_t *)(&FlexRAM[offset]) != value) {
|
|
|
+ kinetis_hsrun_disable();
|
|
|
+ uint8_t stat = FTFL->FSTAT & 0x70;
|
|
|
+ if (stat) FTFL->FSTAT = stat;
|
|
|
*(uint16_t *)(&FlexRAM[offset]) = value;
|
|
|
flexram_wait();
|
|
|
+ kinetis_hsrun_enable();
|
|
|
}
|
|
|
# ifdef HANDLE_UNALIGNED_WRITES
|
|
|
} else {
|
|
|
if (FlexRAM[offset] != value) {
|
|
|
+ kinetis_hsrun_disable();
|
|
|
+ uint8_t stat = FTFL->FSTAT & 0x70;
|
|
|
+ if (stat) FTFL->FSTAT = stat;
|
|
|
FlexRAM[offset] = value;
|
|
|
flexram_wait();
|
|
|
+ kinetis_hsrun_enable();
|
|
|
}
|
|
|
if (FlexRAM[offset + 1] != (value >> 8)) {
|
|
|
+ kinetis_hsrun_disable();
|
|
|
+ uint8_t stat = FTFL->FSTAT & 0x70;
|
|
|
+ if (stat) FTFL->FSTAT = stat;
|
|
|
FlexRAM[offset + 1] = value >> 8;
|
|
|
flexram_wait();
|
|
|
+ kinetis_hsrun_enable();
|
|
|
}
|
|
|
}
|
|
|
# endif
|
|
@@ -244,33 +397,57 @@ void eeprom_write_dword(uint32_t *addr, uint32_t value) {
|
|
|
case 0:
|
|
|
# endif
|
|
|
if (*(uint32_t *)(&FlexRAM[offset]) != value) {
|
|
|
+ kinetis_hsrun_disable();
|
|
|
+ uint8_t stat = FTFL->FSTAT & 0x70;
|
|
|
+ if (stat) FTFL->FSTAT = stat;
|
|
|
*(uint32_t *)(&FlexRAM[offset]) = value;
|
|
|
flexram_wait();
|
|
|
+ kinetis_hsrun_enable();
|
|
|
}
|
|
|
return;
|
|
|
# ifdef HANDLE_UNALIGNED_WRITES
|
|
|
case 2:
|
|
|
if (*(uint16_t *)(&FlexRAM[offset]) != value) {
|
|
|
+ kinetis_hsrun_disable();
|
|
|
+ uint8_t stat = FTFL->FSTAT & 0x70;
|
|
|
+ if (stat) FTFL->FSTAT = stat;
|
|
|
*(uint16_t *)(&FlexRAM[offset]) = value;
|
|
|
flexram_wait();
|
|
|
+ kinetis_hsrun_enable();
|
|
|
}
|
|
|
if (*(uint16_t *)(&FlexRAM[offset + 2]) != (value >> 16)) {
|
|
|
+ kinetis_hsrun_disable();
|
|
|
+ uint8_t stat = FTFL->FSTAT & 0x70;
|
|
|
+ if (stat) FTFL->FSTAT = stat;
|
|
|
*(uint16_t *)(&FlexRAM[offset + 2]) = value >> 16;
|
|
|
flexram_wait();
|
|
|
+ kinetis_hsrun_enable();
|
|
|
}
|
|
|
return;
|
|
|
default:
|
|
|
if (FlexRAM[offset] != value) {
|
|
|
+ kinetis_hsrun_disable();
|
|
|
+ uint8_t stat = FTFL->FSTAT & 0x70;
|
|
|
+ if (stat) FTFL->FSTAT = stat;
|
|
|
FlexRAM[offset] = value;
|
|
|
flexram_wait();
|
|
|
+ kinetis_hsrun_enable();
|
|
|
}
|
|
|
if (*(uint16_t *)(&FlexRAM[offset + 1]) != (value >> 8)) {
|
|
|
+ kinetis_hsrun_disable();
|
|
|
+ uint8_t stat = FTFL->FSTAT & 0x70;
|
|
|
+ if (stat) FTFL->FSTAT = stat;
|
|
|
*(uint16_t *)(&FlexRAM[offset + 1]) = value >> 8;
|
|
|
flexram_wait();
|
|
|
+ kinetis_hsrun_enable();
|
|
|
}
|
|
|
if (FlexRAM[offset + 3] != (value >> 24)) {
|
|
|
+ kinetis_hsrun_disable();
|
|
|
+ uint8_t stat = FTFL->FSTAT & 0x70;
|
|
|
+ if (stat) FTFL->FSTAT = stat;
|
|
|
FlexRAM[offset + 3] = value >> 24;
|
|
|
flexram_wait();
|
|
|
+ kinetis_hsrun_enable();
|
|
|
}
|
|
|
}
|
|
|
# endif
|
|
@@ -288,6 +465,7 @@ void eeprom_write_block(const void *buf, void *addr, uint32_t len) {
|
|
|
if (!(FTFL->FCNFG & FTFL_FCNFG_EEERDY)) eeprom_initialize();
|
|
|
if (len >= EEPROM_SIZE) len = EEPROM_SIZE;
|
|
|
if (offset + len >= EEPROM_SIZE) len = EEPROM_SIZE - offset;
|
|
|
+ kinetis_hsrun_disable();
|
|
|
while (len > 0) {
|
|
|
uint32_t lsb = offset & 3;
|
|
|
if (lsb == 0 && len >= 4) {
|
|
@@ -298,6 +476,8 @@ void eeprom_write_block(const void *buf, void *addr, uint32_t len) {
|
|
|
val32 |= (*src++ << 16);
|
|
|
val32 |= (*src++ << 24);
|
|
|
if (*(uint32_t *)(&FlexRAM[offset]) != val32) {
|
|
|
+ uint8_t stat = FTFL->FSTAT & 0x70;
|
|
|
+ if (stat) FTFL->FSTAT = stat;
|
|
|
*(uint32_t *)(&FlexRAM[offset]) = val32;
|
|
|
flexram_wait();
|
|
|
}
|
|
@@ -309,6 +489,8 @@ void eeprom_write_block(const void *buf, void *addr, uint32_t len) {
|
|
|
val16 = *src++;
|
|
|
val16 |= (*src++ << 8);
|
|
|
if (*(uint16_t *)(&FlexRAM[offset]) != val16) {
|
|
|
+ uint8_t stat = FTFL->FSTAT & 0x70;
|
|
|
+ if (stat) FTFL->FSTAT = stat;
|
|
|
*(uint16_t *)(&FlexRAM[offset]) = val16;
|
|
|
flexram_wait();
|
|
|
}
|
|
@@ -318,6 +500,8 @@ void eeprom_write_block(const void *buf, void *addr, uint32_t len) {
|
|
|
|
|
|
uint8_t val8 = *src++;
|
|
|
if (FlexRAM[offset] != val8) {
|
|
|
+ uint8_t stat = FTFL->FSTAT & 0x70;
|
|
|
+ if (stat) FTFL->FSTAT = stat;
|
|
|
FlexRAM[offset] = val8;
|
|
|
flexram_wait();
|
|
|
}
|
|
@@ -325,6 +509,7 @@ void eeprom_write_block(const void *buf, void *addr, uint32_t len) {
|
|
|
len--;
|
|
|
}
|
|
|
}
|
|
|
+ kinetis_hsrun_enable();
|
|
|
}
|
|
|
|
|
|
|