Skip to content

Commit 267dffd

Browse files
authoredMay 28, 2024
EEPROM: Don't erase if we don't have to. Adding eeprom_driver_format abstraction. (qmk#18332)
1 parent 6921c8a commit 267dffd

10 files changed

+63
-4
lines changed
 

‎drivers/eeprom/eeprom_custom.c-template

+11
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,17 @@ void eeprom_driver_init(void) {
2323
/* Any initialisation code */
2424
}
2525

26+
void eeprom_driver_format(bool erase) {
27+
/* If erase=false, then only do the absolute minimum initialisation necessary
28+
to make sure that the eeprom driver is usable. It doesn't need to guarantee
29+
that the content of the eeprom is reset to any particular value. For many
30+
eeprom drivers this may be a no-op.
31+
32+
If erase=true, then in addition to making sure the eeprom driver is in a
33+
usable state, also make sure that it is erased.
34+
*/
35+
}
36+
2637
void eeprom_driver_erase(void) {
2738
/* Wipe out the EEPROM, setting values to zero */
2839
}

‎drivers/eeprom/eeprom_driver.c

+6
Original file line numberDiff line numberDiff line change
@@ -77,3 +77,9 @@ void eeprom_update_dword(uint32_t *addr, uint32_t value) {
7777
eeprom_write_dword(addr, value);
7878
}
7979
}
80+
81+
void eeprom_driver_format(bool erase) __attribute__((weak));
82+
void eeprom_driver_format(bool erase) {
83+
(void)erase; /* The default implementation assumes that the eeprom must be erased in order to be usable. */
84+
eeprom_driver_erase();
85+
}

‎drivers/eeprom/eeprom_driver.h

+2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616

1717
#pragma once
1818

19+
#include <stdbool.h>
1920
#include "eeprom.h"
2021

2122
void eeprom_driver_init(void);
23+
void eeprom_driver_format(bool erase);
2224
void eeprom_driver_erase(void);

‎drivers/eeprom/eeprom_i2c.c

+8
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#include "wait.h"
3737
#include "i2c_master.h"
3838
#include "eeprom.h"
39+
#include "eeprom_driver.h"
3940
#include "eeprom_i2c.h"
4041

4142
// #define DEBUG_EEPROM_OUTPUT
@@ -62,6 +63,13 @@ void eeprom_driver_init(void) {
6263
#endif
6364
}
6465

66+
void eeprom_driver_format(bool erase) {
67+
/* i2c eeproms do not need to be formatted before use */
68+
if (erase) {
69+
eeprom_driver_erase();
70+
}
71+
}
72+
6573
void eeprom_driver_erase(void) {
6674
#if defined(CONSOLE_ENABLE) && defined(DEBUG_EEPROM_OUTPUT)
6775
uint32_t start = timer_read32();

‎drivers/eeprom/eeprom_spi.c

+8
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#include "timer.h"
3636
#include "spi_master.h"
3737
#include "eeprom.h"
38+
#include "eeprom_driver.h"
3839
#include "eeprom_spi.h"
3940

4041
#define CMD_WREN 6
@@ -92,6 +93,13 @@ void eeprom_driver_init(void) {
9293
spi_init();
9394
}
9495

96+
void eeprom_driver_format(bool erase) {
97+
/* spi eeproms do not need to be formatted before use */
98+
if (erase) {
99+
eeprom_driver_erase();
100+
}
101+
}
102+
95103
void eeprom_driver_erase(void) {
96104
#if defined(CONSOLE_ENABLE) && defined(DEBUG_EEPROM_OUTPUT)
97105
uint32_t start = timer_read32();

‎drivers/eeprom/eeprom_transient.c

+7-2
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,13 @@ size_t clamp_length(intptr_t offset, size_t len) {
3030
return len;
3131
}
3232

33-
void eeprom_driver_init(void) {
34-
eeprom_driver_erase();
33+
void eeprom_driver_init(void) {}
34+
35+
void eeprom_driver_format(bool erase) {
36+
/* 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 */
37+
if (erase) {
38+
eeprom_driver_erase();
39+
}
3540
}
3641

3742
void eeprom_driver_erase(void) {

‎drivers/eeprom/eeprom_wear_leveling.c

+6
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ void eeprom_driver_init(void) {
1010
wear_leveling_init();
1111
}
1212

13+
void eeprom_driver_format(bool erase) {
14+
/* wear leveling requires the write log data structures to be erased before use. */
15+
(void)erase;
16+
eeprom_driver_erase();
17+
}
18+
1319
void eeprom_driver_erase(void) {
1420
wear_leveling_erase();
1521
}

‎platforms/chibios/drivers/eeprom/eeprom_legacy_emulated_flash.c

+7
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "debug.h"
2525
#include "eeprom_legacy_emulated_flash.h"
2626
#include "legacy_flash_ops.h"
27+
#include "eeprom_driver.h"
2728

2829
/*
2930
* We emulate eeprom by writing a snapshot compacted view of eeprom contents,
@@ -564,6 +565,12 @@ void eeprom_driver_init(void) {
564565
EEPROM_Init();
565566
}
566567

568+
void eeprom_driver_format(bool erase) {
569+
/* emulated eepron requires the write log data structures to be erased before use. */
570+
(void)erase;
571+
eeprom_driver_erase();
572+
}
573+
567574
void eeprom_driver_erase(void) {
568575
EEPROM_Erase();
569576
}

‎platforms/chibios/drivers/eeprom/eeprom_stm32_L0_L1.c

+6
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,12 @@ static inline void STM32_L0_L1_EEPROM_Lock(void) {
5252

5353
void eeprom_driver_init(void) {}
5454

55+
void eeprom_driver_format(bool erase) {
56+
if (erase) {
57+
eeprom_driver_erase();
58+
}
59+
}
60+
5561
void eeprom_driver_erase(void) {
5662
STM32_L0_L1_EEPROM_Unlock();
5763

‎quantum/eeconfig.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ __attribute__((weak)) void eeconfig_init_kb(void) {
4646
*/
4747
void eeconfig_init_quantum(void) {
4848
#if defined(EEPROM_DRIVER)
49-
eeprom_driver_erase();
49+
eeprom_driver_format(false);
5050
#endif
5151

5252
eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER);
@@ -108,7 +108,7 @@ void eeconfig_enable(void) {
108108
*/
109109
void eeconfig_disable(void) {
110110
#if defined(EEPROM_DRIVER)
111-
eeprom_driver_erase();
111+
eeprom_driver_format(false);
112112
#endif
113113
eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER_OFF);
114114
}

0 commit comments

Comments
 (0)