|
@ -32,7 +32,7 @@ |
|
|
#include "Servo.h" |
|
|
#include "Servo.h" |
|
|
#define PAUSE_SERVO_OUTPUT() libServo::pause_all_servos() |
|
|
#define PAUSE_SERVO_OUTPUT() libServo::pause_all_servos() |
|
|
#define RESUME_SERVO_OUTPUT() libServo::resume_all_servos() |
|
|
#define RESUME_SERVO_OUTPUT() libServo::resume_all_servos() |
|
|
#else |
|
|
#else |
|
|
#define PAUSE_SERVO_OUTPUT() |
|
|
#define PAUSE_SERVO_OUTPUT() |
|
|
#define RESUME_SERVO_OUTPUT() |
|
|
#define RESUME_SERVO_OUTPUT() |
|
|
#endif |
|
|
#endif |
|
@ -59,8 +59,8 @@ |
|
|
#define DEBUG_OUT ENABLED(EEPROM_CHITCHAT) |
|
|
#define DEBUG_OUT ENABLED(EEPROM_CHITCHAT) |
|
|
#include "src/core/debug_out.h" |
|
|
#include "src/core/debug_out.h" |
|
|
|
|
|
|
|
|
#ifndef EEPROM_SIZE |
|
|
#ifndef MARLIN_EEPROM_SIZE |
|
|
#define EEPROM_SIZE 0x1000 // 4kB
|
|
|
#define MARLIN_EEPROM_SIZE 0x1000 // 4KB
|
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
#ifndef FLASH_SECTOR |
|
|
#ifndef FLASH_SECTOR |
|
@ -70,11 +70,11 @@ |
|
|
#define FLASH_UNIT_SIZE 0x20000 // 128kB
|
|
|
#define FLASH_UNIT_SIZE 0x20000 // 128kB
|
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
#define FLASH_ADDRESS_START (FLASH_END - ((FLASH_SECTOR_TOTAL - FLASH_SECTOR) * FLASH_UNIT_SIZE) + 1) |
|
|
#define FLASH_ADDRESS_START (FLASH_END - ((FLASH_SECTOR_TOTAL - (FLASH_SECTOR)) * (FLASH_UNIT_SIZE)) + 1) |
|
|
#define FLASH_ADDRESS_END (FLASH_ADDRESS_START + FLASH_UNIT_SIZE - 1) |
|
|
#define FLASH_ADDRESS_END (FLASH_ADDRESS_START + FLASH_UNIT_SIZE - 1) |
|
|
|
|
|
|
|
|
#define EEPROM_SLOTS (FLASH_UNIT_SIZE/EEPROM_SIZE) |
|
|
#define EEPROM_SLOTS ((FLASH_UNIT_SIZE) / (MARLIN_EEPROM_SIZE)) |
|
|
#define SLOT_ADDRESS(slot) (FLASH_ADDRESS_START + (slot * EEPROM_SIZE)) |
|
|
#define SLOT_ADDRESS(slot) (FLASH_ADDRESS_START + (slot * (MARLIN_EEPROM_SIZE))) |
|
|
|
|
|
|
|
|
#define UNLOCK_FLASH() if (!flash_unlocked) { \ |
|
|
#define UNLOCK_FLASH() if (!flash_unlocked) { \ |
|
|
HAL_FLASH_Unlock(); \ |
|
|
HAL_FLASH_Unlock(); \ |
|
@ -87,12 +87,12 @@ |
|
|
#define EMPTY_UINT32 ((uint32_t)-1) |
|
|
#define EMPTY_UINT32 ((uint32_t)-1) |
|
|
#define EMPTY_UINT8 ((uint8_t)-1) |
|
|
#define EMPTY_UINT8 ((uint8_t)-1) |
|
|
|
|
|
|
|
|
static uint8_t ram_eeprom[EEPROM_SIZE] __attribute__((aligned(4))) = {0}; |
|
|
static uint8_t ram_eeprom[MARLIN_EEPROM_SIZE] __attribute__((aligned(4))) = {0}; |
|
|
static int current_slot = -1; |
|
|
static int current_slot = -1; |
|
|
|
|
|
|
|
|
static_assert(0 == EEPROM_SIZE % 4, "EEPROM_SIZE must be a multiple of 4"); // Ensure copying as uint32_t is safe
|
|
|
static_assert(0 == MARLIN_EEPROM_SIZE % 4, "MARLIN_EEPROM_SIZE must be a multiple of 4"); // Ensure copying as uint32_t is safe
|
|
|
static_assert(0 == FLASH_UNIT_SIZE % EEPROM_SIZE, "EEPROM_SIZE must divide evenly into your FLASH_UNIT_SIZE"); |
|
|
static_assert(0 == FLASH_UNIT_SIZE % MARLIN_EEPROM_SIZE, "MARLIN_EEPROM_SIZE must divide evenly into your FLASH_UNIT_SIZE"); |
|
|
static_assert(FLASH_UNIT_SIZE >= EEPROM_SIZE, "FLASH_UNIT_SIZE must be greater than or equal to your EEPROM_SIZE"); |
|
|
static_assert(FLASH_UNIT_SIZE >= MARLIN_EEPROM_SIZE, "FLASH_UNIT_SIZE must be greater than or equal to your MARLIN_EEPROM_SIZE"); |
|
|
static_assert(IS_FLASH_SECTOR(FLASH_SECTOR), "FLASH_SECTOR is invalid"); |
|
|
static_assert(IS_FLASH_SECTOR(FLASH_SECTOR), "FLASH_SECTOR is invalid"); |
|
|
static_assert(IS_POWER_OF_2(FLASH_UNIT_SIZE), "FLASH_UNIT_SIZE should be a power of 2, please check your chip's spec sheet"); |
|
|
static_assert(IS_POWER_OF_2(FLASH_UNIT_SIZE), "FLASH_UNIT_SIZE should be a power of 2, please check your chip's spec sheet"); |
|
|
|
|
|
|
|
@ -100,6 +100,11 @@ |
|
|
|
|
|
|
|
|
static bool eeprom_data_written = false; |
|
|
static bool eeprom_data_written = false; |
|
|
|
|
|
|
|
|
|
|
|
#ifndef MARLIN_EEPROM_SIZE |
|
|
|
|
|
#define MARLIN_EEPROM_SIZE size_t(E2END + 1) |
|
|
|
|
|
#endif |
|
|
|
|
|
size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } |
|
|
|
|
|
|
|
|
bool PersistentStore::access_start() { |
|
|
bool PersistentStore::access_start() { |
|
|
|
|
|
|
|
|
#if ENABLED(FLASH_EEPROM_LEVELING) |
|
|
#if ENABLED(FLASH_EEPROM_LEVELING) |
|
@ -113,20 +118,20 @@ bool PersistentStore::access_start() { |
|
|
while (address <= FLASH_ADDRESS_END) { |
|
|
while (address <= FLASH_ADDRESS_END) { |
|
|
uint32_t address_value = (*(__IO uint32_t*)address); |
|
|
uint32_t address_value = (*(__IO uint32_t*)address); |
|
|
if (address_value != EMPTY_UINT32) { |
|
|
if (address_value != EMPTY_UINT32) { |
|
|
current_slot = (address - FLASH_ADDRESS_START) / EEPROM_SIZE; |
|
|
current_slot = (address - (FLASH_ADDRESS_START)) / (MARLIN_EEPROM_SIZE); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
address += sizeof(uint32_t); |
|
|
address += sizeof(uint32_t); |
|
|
} |
|
|
} |
|
|
if (current_slot == -1) { |
|
|
if (current_slot == -1) { |
|
|
// We didn't find anything, so we'll just intialize to empty
|
|
|
// We didn't find anything, so we'll just intialize to empty
|
|
|
for (int i = 0; i < EEPROM_SIZE; i++) ram_eeprom[i] = EMPTY_UINT8; |
|
|
for (int i = 0; i < MARLIN_EEPROM_SIZE; i++) ram_eeprom[i] = EMPTY_UINT8; |
|
|
current_slot = EEPROM_SLOTS; |
|
|
current_slot = EEPROM_SLOTS; |
|
|
} |
|
|
} |
|
|
else { |
|
|
else { |
|
|
// load current settings
|
|
|
// load current settings
|
|
|
uint8_t *eeprom_data = (uint8_t *)SLOT_ADDRESS(current_slot); |
|
|
uint8_t *eeprom_data = (uint8_t *)SLOT_ADDRESS(current_slot); |
|
|
for (int i = 0; i < EEPROM_SIZE; i++) ram_eeprom[i] = eeprom_data[i]; |
|
|
for (int i = 0; i < MARLIN_EEPROM_SIZE; i++) ram_eeprom[i] = eeprom_data[i]; |
|
|
DEBUG_ECHOLNPAIR("EEPROM loaded from slot ", current_slot, "."); |
|
|
DEBUG_ECHOLNPAIR("EEPROM loaded from slot ", current_slot, "."); |
|
|
} |
|
|
} |
|
|
eeprom_data_written = false; |
|
|
eeprom_data_written = false; |
|
@ -146,7 +151,7 @@ bool PersistentStore::access_finish() { |
|
|
// MCU may come up with flash error bits which prevent some flash operations.
|
|
|
// MCU may come up with flash error bits which prevent some flash operations.
|
|
|
// Clear flags prior to flash operations to prevent errors.
|
|
|
// Clear flags prior to flash operations to prevent errors.
|
|
|
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); |
|
|
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
#if ENABLED(FLASH_EEPROM_LEVELING) |
|
|
#if ENABLED(FLASH_EEPROM_LEVELING) |
|
|
|
|
|
|
|
@ -185,7 +190,7 @@ bool PersistentStore::access_finish() { |
|
|
|
|
|
|
|
|
uint32_t offset = 0; |
|
|
uint32_t offset = 0; |
|
|
uint32_t address = SLOT_ADDRESS(current_slot); |
|
|
uint32_t address = SLOT_ADDRESS(current_slot); |
|
|
uint32_t address_end = address + EEPROM_SIZE; |
|
|
uint32_t address_end = address + MARLIN_EEPROM_SIZE; |
|
|
uint32_t data = 0; |
|
|
uint32_t data = 0; |
|
|
|
|
|
|
|
|
bool success = true; |
|
|
bool success = true; |
|
@ -267,9 +272,5 @@ bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t |
|
|
return false; |
|
|
return false; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
size_t PersistentStore::capacity() { |
|
|
|
|
|
return TERN(FLASH_EEPROM_LEVELING, EEPROM_SIZE, E2END + 1); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#endif // FLASH_EEPROM_EMULATION
|
|
|
#endif // FLASH_EEPROM_EMULATION
|
|
|
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
|
|
|
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
|
|
|