diff --git a/Marlin/src/module/configuration_store.cpp b/Marlin/src/module/configuration_store.cpp
index 4ced3576ce2149f125906e830274b2266d08e739..4067a6629a33b273e407ca7d6641881b929cda11 100644
--- a/Marlin/src/module/configuration_store.cpp
+++ b/Marlin/src/module/configuration_store.cpp
@@ -249,6 +249,8 @@ typedef struct SettingsDataStruct {
MarlinSettings settings;
+uint16_t MarlinSettings::datasize() { return sizeof(SettingsData); }
+
/**
* Post-process after Retrieve or Reset
*/
@@ -331,6 +333,15 @@ void MarlinSettings::postprocess() {
int16_t MarlinSettings::meshes_begin;
#endif
+ bool MarlinSettings::size_error(const uint16_t size) {
+ if (size != datasize()) {
+ SERIAL_ERROR_START();
+ SERIAL_ERRORLNPGM("EEPROM datasize error.");
+ return true;
+ }
+ return false;
+ }
+
/**
* M500 - Store Configuration
*/
@@ -750,7 +761,7 @@ void MarlinSettings::postprocess() {
#endif
//
- // Validate CRC
+ // Validate CRC and Data Size
//
if (!eeprom_error) {
const uint16_t eeprom_size = eeprom_index - (EEPROM_OFFSET),
@@ -769,6 +780,8 @@ void MarlinSettings::postprocess() {
SERIAL_ECHOPAIR(" bytes; crc ", (uint32_t)final_crc);
SERIAL_ECHOLNPGM(")");
#endif
+
+ eeprom_error |= size_error(eeprom_size);
}
EEPROM_FINISH();
@@ -1260,19 +1273,14 @@ void MarlinSettings::postprocess() {
for (uint8_t q = MAX_EXTRUDERS * 2; q--;) EEPROM_READ(dummy);
#endif
- if (working_crc == stored_crc) {
- if (!validating) {
- postprocess();
- #if ENABLED(EEPROM_CHITCHAT)
- SERIAL_ECHO_START();
- SERIAL_ECHO(version);
- SERIAL_ECHOPAIR(" stored settings retrieved (", eeprom_index - (EEPROM_OFFSET));
- SERIAL_ECHOPAIR(" bytes; crc ", (uint32_t)working_crc);
- SERIAL_ECHOLNPGM(")");
- #endif
- }
+ eeprom_error = size_error(eeprom_index - (EEPROM_OFFSET));
+ if (eeprom_error) {
+ SERIAL_ECHO_START();
+ SERIAL_ECHOPAIR("Index: ", int(eeprom_index - (EEPROM_OFFSET)));
+ SERIAL_ECHOLNPAIR(" Size: ", datasize());
}
- else {
+ else if (working_crc != stored_crc) {
+ eeprom_error = true;
#if ENABLED(EEPROM_CHITCHAT)
SERIAL_ERROR_START();
SERIAL_ERRORPGM("EEPROM CRC mismatch - (stored) ");
@@ -1281,7 +1289,19 @@ void MarlinSettings::postprocess() {
SERIAL_ERROR(working_crc);
SERIAL_ERRORLNPGM(" (calculated)!");
#endif
- reset();
+ }
+ else if (!validating) {
+ #if ENABLED(EEPROM_CHITCHAT)
+ SERIAL_ECHO_START();
+ SERIAL_ECHO(version);
+ SERIAL_ECHOPAIR(" stored settings retrieved (", eeprom_index - (EEPROM_OFFSET));
+ SERIAL_ECHOPAIR(" bytes; crc ", (uint32_t)working_crc);
+ SERIAL_ECHOLNPGM(")");
+ #endif
+ }
+
+ if (!validating) {
+ if (eeprom_error) reset(); else postprocess();
}
#if ENABLED(AUTO_BED_LEVELING_UBL)
diff --git a/Marlin/src/module/configuration_store.h b/Marlin/src/module/configuration_store.h
index 56fd3c2badcfdfff2d236966b62c43946bfbe67a..34235533fc19712b956976d97bef0ac0e5f0c024 100644
--- a/Marlin/src/module/configuration_store.h
+++ b/Marlin/src/module/configuration_store.h
@@ -29,6 +29,8 @@ class MarlinSettings {
public:
MarlinSettings() { }
+ static uint16_t datasize();
+
static void reset();
static bool save(); // Return 'true' if data was saved
@@ -90,6 +92,7 @@ class MarlinSettings {
#endif
static bool _load();
+ static bool size_error(const uint16_t size);
#endif
};