| */ | */ | ||||
| #include "kinetis.h" | #include "kinetis.h" | ||||
| #include <stdint.h> | |||||
| #include <avr/eeprom.h> | |||||
| //#include "HardwareSerial.h" | //#include "HardwareSerial.h" | ||||
| #if defined(__MK20DX128__) || defined(__MK20DX256__) | |||||
| #define EEPROM_MAX 2048 | |||||
| #define EEPARTITION 0x03 // all 32K dataflash for EEPROM, none for Data | |||||
| #elif defined(__MK64FX512__) | |||||
| #define EEPROM_MAX 4096 | |||||
| #define EEPARTITION 0x04 // 64K dataflash for EEPROM, 64K for Data | |||||
| #elif defined(__MK66FX1M0__) | |||||
| #define EEPROM_MAX 4096 | |||||
| #define EEPARTITION 0x05 // 128K dataflash for EEPROM, 128K for Data | |||||
| #elif defined(__MKL26Z64__) | |||||
| #define EEPROM_MAX 255 | |||||
| #endif | |||||
| #if E2END > (EEPROM_MAX-1) | |||||
| #error "E2END is set larger than the maximum possible EEPROM size" | |||||
| #endif | |||||
| #if defined(KINETISK) | #if defined(KINETISK) | ||||
| // The EEPROM is really RAM with a hardware-based backup system to | // The EEPROM is really RAM with a hardware-based backup system to | ||||
| // (aligned to 2 or 4 byte boundaries) has twice the endurance | // (aligned to 2 or 4 byte boundaries) has twice the endurance | ||||
| // compared to writing 8 bit bytes. | // compared to writing 8 bit bytes. | ||||
| // | // | ||||
| #if defined(__MK20DX128__) || defined(__MK20DX256__) | |||||
| #define EEPROM_SIZE 2048 | |||||
| #define PARTITION 0x03 // all 32K dataflash for EEPROM, none for Data | |||||
| #elif defined(__MK64FX512__) | |||||
| #define EEPROM_SIZE 4096 | |||||
| #define PARTITION 0x04 // 64K dataflash for EEPROM, 64K for Data | |||||
| #elif defined(__MK66FX1M0__) | |||||
| #define EEPROM_SIZE 4096 | |||||
| #define PARTITION 0x05 // 128K dataflash for EEPROM, 128K for Data | |||||
| #if E2END < 32 | |||||
| #define EEPROM_SIZE 32 | |||||
| #define EEESIZE 0x39 | |||||
| #elif E2END < 64 | |||||
| #define EEPROM_SIZE 64 | |||||
| #define EEESIZE 0x38 | |||||
| #elif E2END < 128 | |||||
| #define EEPROM_SIZE 128 | |||||
| #define EEESIZE 0x37 | |||||
| #elif E2END < 256 | |||||
| #define EEPROM_SIZE 256 | |||||
| #define EEESIZE 0x36 | |||||
| #elif E2END < 512 | |||||
| #define EEPROM_SIZE 512 | |||||
| #define EEESIZE 0x35 | |||||
| #elif E2END < 1024 | |||||
| #define EEPROM_SIZE 1024 | |||||
| #define EEESIZE 0x34 | |||||
| #elif E2END < 2048 | |||||
| #define EEPROM_SIZE 2048 | |||||
| #define EEESIZE 0x33 | |||||
| #elif E2END < 4096 | |||||
| #define EEPROM_SIZE 4096 | |||||
| #define EEESIZE 0x32 | |||||
| #endif | #endif | ||||
| // Writing unaligned 16 or 32 bit data is handled automatically when | // Writing unaligned 16 or 32 bit data is handled automatically when | ||||
| // | // | ||||
| #define HANDLE_UNALIGNED_WRITES | #define HANDLE_UNALIGNED_WRITES | ||||
| // Minimum EEPROM Endurance | |||||
| // ------------------------ | |||||
| #if (EEPROM_SIZE == 4096) // | |||||
| #define EEESIZE 0x32 | |||||
| #elif (EEPROM_SIZE == 2048) // 35000 writes/byte or 70000 writes/word (with 32K) | |||||
| #define EEESIZE 0x33 | |||||
| #elif (EEPROM_SIZE == 1024) // 75000 writes/byte or 150000 writes/word | |||||
| #define EEESIZE 0x34 | |||||
| #elif (EEPROM_SIZE == 512) // 155000 writes/byte or 310000 writes/word | |||||
| #define EEESIZE 0x35 | |||||
| #elif (EEPROM_SIZE == 256) // 315000 writes/byte or 630000 writes/word | |||||
| #define EEESIZE 0x36 | |||||
| #elif (EEPROM_SIZE == 128) // 635000 writes/byte or 1270000 writes/word | |||||
| #define EEESIZE 0x37 | |||||
| #elif (EEPROM_SIZE == 64) // 1275000 writes/byte or 2550000 writes/word | |||||
| #define EEESIZE 0x38 | |||||
| #elif (EEPROM_SIZE == 32) // 2555000 writes/byte or 5110000 writes/word | |||||
| #define EEESIZE 0x39 | |||||
| #endif | |||||
| void eeprom_initialize(void) | void eeprom_initialize(void) | ||||
| { | { | ||||
| // We need to reconfigure for EEPROM usage | // We need to reconfigure for EEPROM usage | ||||
| FTFL_FCCOB0 = 0x80; // PGMPART = Program Partition Command | FTFL_FCCOB0 = 0x80; // PGMPART = Program Partition Command | ||||
| FTFL_FCCOB4 = EEESIZE; // EEPROM Size | FTFL_FCCOB4 = EEESIZE; // EEPROM Size | ||||
| FTFL_FCCOB5 = PARTITION; | |||||
| FTFL_FCCOB5 = EEPARTITION; | |||||
| __disable_irq(); | __disable_irq(); | ||||
| // do_flash_cmd() must execute from RAM. Luckily the C syntax is simple... | // do_flash_cmd() must execute from RAM. Luckily the C syntax is simple... | ||||
| (*((void (*)(volatile uint8_t *))((uint32_t)do_flash_cmd | 1)))(&FTFL_FSTAT); | (*((void (*)(volatile uint8_t *))((uint32_t)do_flash_cmd | 1)))(&FTFL_FSTAT); | ||||
| #elif defined(KINETISL) | #elif defined(KINETISL) | ||||
| #define EEPROM_SIZE 128 | |||||
| #define EEPROM_SIZE (E2END+1) | |||||
| #define FLASH_BEGIN (uint16_t *)63488 | #define FLASH_BEGIN (uint16_t *)63488 | ||||
| #define FLASH_END (uint16_t *)65536 | #define FLASH_END (uint16_t *)65536 |