commit: 267dffda154d119ed5f155665e90fc5e03d138a5
parent 6921c8a7ddbf5596d629f6272b4043bb3cbcf661
Author: Purdea Andrei <andrei@purdea.ro>
Date: Tue, 28 May 2024 14:49:55 +0300
EEPROM: Don't erase if we don't have to. Adding eeprom_driver_format abstraction. (#18332)
Diffstat:
10 files changed, 63 insertions(+), 4 deletions(-)
diff --git a/drivers/eeprom/eeprom_custom.c-template b/drivers/eeprom/eeprom_custom.c-template
@@ -23,6 +23,17 @@ void eeprom_driver_init(void) {
/* Any initialisation code */
}
+void eeprom_driver_format(bool erase) {
+ /* If erase=false, then only do the absolute minimum initialisation necessary
+ to make sure that the eeprom driver is usable. It doesn't need to guarantee
+ that the content of the eeprom is reset to any particular value. For many
+ eeprom drivers this may be a no-op.
+
+ If erase=true, then in addition to making sure the eeprom driver is in a
+ usable state, also make sure that it is erased.
+ */
+}
+
void eeprom_driver_erase(void) {
/* Wipe out the EEPROM, setting values to zero */
}
diff --git a/drivers/eeprom/eeprom_driver.c b/drivers/eeprom/eeprom_driver.c
@@ -77,3 +77,9 @@ void eeprom_update_dword(uint32_t *addr, uint32_t value) {
eeprom_write_dword(addr, value);
}
}
+
+void eeprom_driver_format(bool erase) __attribute__((weak));
+void eeprom_driver_format(bool erase) {
+ (void)erase; /* The default implementation assumes that the eeprom must be erased in order to be usable. */
+ eeprom_driver_erase();
+}
diff --git a/drivers/eeprom/eeprom_driver.h b/drivers/eeprom/eeprom_driver.h
@@ -16,7 +16,9 @@
#pragma once
+#include <stdbool.h>
#include "eeprom.h"
void eeprom_driver_init(void);
+void eeprom_driver_format(bool erase);
void eeprom_driver_erase(void);
diff --git a/drivers/eeprom/eeprom_i2c.c b/drivers/eeprom/eeprom_i2c.c
@@ -36,6 +36,7 @@
#include "wait.h"
#include "i2c_master.h"
#include "eeprom.h"
+#include "eeprom_driver.h"
#include "eeprom_i2c.h"
// #define DEBUG_EEPROM_OUTPUT
@@ -62,6 +63,13 @@ void eeprom_driver_init(void) {
#endif
}
+void eeprom_driver_format(bool erase) {
+ /* i2c eeproms do not need to be formatted before use */
+ if (erase) {
+ eeprom_driver_erase();
+ }
+}
+
void eeprom_driver_erase(void) {
#if defined(CONSOLE_ENABLE) && defined(DEBUG_EEPROM_OUTPUT)
uint32_t start = timer_read32();
diff --git a/drivers/eeprom/eeprom_spi.c b/drivers/eeprom/eeprom_spi.c
@@ -35,6 +35,7 @@
#include "timer.h"
#include "spi_master.h"
#include "eeprom.h"
+#include "eeprom_driver.h"
#include "eeprom_spi.h"
#define CMD_WREN 6
@@ -92,6 +93,13 @@ void eeprom_driver_init(void) {
spi_init();
}
+void eeprom_driver_format(bool erase) {
+ /* spi eeproms do not need to be formatted before use */
+ if (erase) {
+ eeprom_driver_erase();
+ }
+}
+
void eeprom_driver_erase(void) {
#if defined(CONSOLE_ENABLE) && defined(DEBUG_EEPROM_OUTPUT)
uint32_t start = timer_read32();
diff --git a/drivers/eeprom/eeprom_transient.c b/drivers/eeprom/eeprom_transient.c
@@ -30,8 +30,13 @@ size_t clamp_length(intptr_t offset, size_t len) {
return len;
}
-void eeprom_driver_init(void) {
- eeprom_driver_erase();
+void eeprom_driver_init(void) {}
+
+void eeprom_driver_format(bool erase) {
+ /* The transient eeprom driver doesn't necessarily need to be formatted before use, and it always starts up filled with zeros, due to placement in the .bss section */
+ if (erase) {
+ eeprom_driver_erase();
+ }
}
void eeprom_driver_erase(void) {
diff --git a/drivers/eeprom/eeprom_wear_leveling.c b/drivers/eeprom/eeprom_wear_leveling.c
@@ -10,6 +10,12 @@ void eeprom_driver_init(void) {
wear_leveling_init();
}
+void eeprom_driver_format(bool erase) {
+ /* wear leveling requires the write log data structures to be erased before use. */
+ (void)erase;
+ eeprom_driver_erase();
+}
+
void eeprom_driver_erase(void) {
wear_leveling_erase();
}
diff --git a/platforms/chibios/drivers/eeprom/eeprom_legacy_emulated_flash.c b/platforms/chibios/drivers/eeprom/eeprom_legacy_emulated_flash.c
@@ -24,6 +24,7 @@
#include "debug.h"
#include "eeprom_legacy_emulated_flash.h"
#include "legacy_flash_ops.h"
+#include "eeprom_driver.h"
/*
* We emulate eeprom by writing a snapshot compacted view of eeprom contents,
@@ -564,6 +565,12 @@ void eeprom_driver_init(void) {
EEPROM_Init();
}
+void eeprom_driver_format(bool erase) {
+ /* emulated eepron requires the write log data structures to be erased before use. */
+ (void)erase;
+ eeprom_driver_erase();
+}
+
void eeprom_driver_erase(void) {
EEPROM_Erase();
}
diff --git a/platforms/chibios/drivers/eeprom/eeprom_stm32_L0_L1.c b/platforms/chibios/drivers/eeprom/eeprom_stm32_L0_L1.c
@@ -52,6 +52,12 @@ static inline void STM32_L0_L1_EEPROM_Lock(void) {
void eeprom_driver_init(void) {}
+void eeprom_driver_format(bool erase) {
+ if (erase) {
+ eeprom_driver_erase();
+ }
+}
+
void eeprom_driver_erase(void) {
STM32_L0_L1_EEPROM_Unlock();
diff --git a/quantum/eeconfig.c b/quantum/eeconfig.c
@@ -46,7 +46,7 @@ __attribute__((weak)) void eeconfig_init_kb(void) {
*/
void eeconfig_init_quantum(void) {
#if defined(EEPROM_DRIVER)
- eeprom_driver_erase();
+ eeprom_driver_format(false);
#endif
eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER);
@@ -108,7 +108,7 @@ void eeconfig_enable(void) {
*/
void eeconfig_disable(void) {
#if defined(EEPROM_DRIVER)
- eeprom_driver_erase();
+ eeprom_driver_format(false);
#endif
eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER_OFF);
}