EEPROM: Don't erase if we don't have to. Adding eeprom_driver_format abstraction. (#18332)
This commit is contained in:
		
							parent
							
								
									6921c8a7dd
								
							
						
					
					
						commit
						267dffda15
					
				
					 10 changed files with 63 additions and 4 deletions
				
			
		|  | @ -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 */ | ||||
| } | ||||
|  |  | |||
|  | @ -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(); | ||||
| } | ||||
|  |  | |||
|  | @ -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); | ||||
|  |  | |||
|  | @ -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(); | ||||
|  |  | |||
|  | @ -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(); | ||||
|  |  | |||
|  | @ -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) { | ||||
|  |  | |||
|  | @ -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(); | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Purdea Andrei
						Purdea Andrei