19#ifdef USE_EEPROM_EMULATION
31 __HAL_FLASH_DATA_CACHE_DISABLE();
32 __HAL_FLASH_DATA_CACHE_RESET();
33 __HAL_FLASH_DATA_CACHE_ENABLE();
49 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
50 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPERR);
51 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_WRPERR);
52 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGAERR);
53 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGPERR);
54 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGSERR);
70 if(readRes == 1 || (readRes == 0 && buf != dat) ){
72 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
73 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPERR);
74 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_WRPERR);
75 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGAERR);
76 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGPERR);
77 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGSERR);
110 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
111 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPERR);
112 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_WRPERR);
113 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGAERR);
114 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGPERR);
115 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGSERR);
125#elif defined(I2C_PORT_EEPROM)
138 uint16_t dataLength =
sizeof(dat);
140 uint32_t adrAbs =
adr;
141 adrAbs *=
sizeof(dat)/I2C_EEPROM_DATA_SIZE;
142 uint32_t curAdr = adrAbs;
143 assert(adrAbs < I2C_EEPROM_SIZE);
148 while(curAdr < adrAbs+dataLength){
153 uint16_t i2cAdr = devAdr;
154 uint16_t writeAdr = curAdr;
156 writeAdr = curAdr & 0xffff;
159 uint16_t wLen = std::min<uint16_t>(dataLength,I2C_EEPROM_PAGEWRITE_SIZE - (adrAbs % I2C_EEPROM_PAGEWRITE_SIZE));
174 uint32_t adrAbs = (
adr *
sizeof(*buf)/I2C_EEPROM_DATA_SIZE);
175 assert(adrAbs < I2C_EEPROM_SIZE);
179 uint16_t i2cAdr = devAdr;
180 uint16_t datAdr = adrAbs & 0xffff;
194 res = empty ? false : res;
222 std::array<uint8_t,I2C_EEPROM_PAGEWRITE_SIZE> eraseBuf;
223 eraseBuf.fill(I2C_EEPROM_ERASED);
224 for(uint32_t i=I2C_EEPROM_OFS;i<I2C_EEPROM_SIZE;i+=I2C_EEPROM_PAGEWRITE_SIZE){
225 uint16_t datAdr = i & 0xffff;
226 uint16_t devAdr = I2C_EEPROM_ADR;
230 bool res =
i2cport_int.writeMem(&
i2cdeveeprom, devAdr, datAdr, I2C_EEPROM_ADR_SIZE, eraseBuf.data(), std::min<int>(I2C_EEPROM_PAGEWRITE_SIZE,I2C_EEPROM_SIZE-i), I2C_EEPROM_TIMEOUT,
false);
268void Flash_Dump(std::vector<std::tuple<uint16_t,uint16_t>> *result,
bool includeAll){
269 uint16_t amount = NB_EXPORTABLE_ADR;
278 for(uint32_t i = 0;i<amount ; i++){
280 uint16_t
adr = list[i];
283 result->push_back(std::tuple<uint16_t,uint16_t>{
adr,v});
295#if defined(FLASH_OTP_BASE) && defined(FLASH_OTP_END) && defined(OTPMEMORY)
301 uint32_t
adr = (FLASH_OTP_BASE+adroffset*
sizeof(uint64_t));
302 if(
adr > FLASH_OTP_END){
305 uint64_t curval = *(uint64_t*)
adr;
306 if(curval != 0xffffffffffffffff){
309 if(HAL_FLASH_Unlock()!=HAL_OK)
return false;
311 bool success = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,
adr, (uint32_t)(dat)) == HAL_OK;
312 success = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,
adr+4, (uint32_t)(dat >> 32)) == HAL_OK && success;
318__weak
bool OTP_Read(uint16_t adroffset,uint64_t* dat){
319 uint32_t
adr = (FLASH_OTP_BASE+adroffset*
sizeof(uint64_t));
320 if(
adr > FLASH_OTP_END){
323 uint64_t curval = *(uint64_t*)
adr;
327#elif defined(I2C_EEPROM_OTP_ADR) && defined(I2C_PORT_EEPROM)
331 for(uint8_t i = 0; i < 4; i++){
332 bool res =
I2C_EEPROM_Write16(I2C_EEPROM_OTP_ADR, 4*adroffset + (i), (dat >> (i*16)) & 0xffff);
342__weak
bool OTP_Read(uint16_t adroffset,uint64_t* dat){
344 for(uint8_t i = 0; i < 4; i++){
346 bool res =
I2C_EEPROM_Read16(I2C_EEPROM_OTP_ADR, 4*adroffset + (i), &tdat,
false);
347 val |= (uint64_t)tdat << (i*16);
356__weak
bool OTP_Write(uint16_t adroffset,uint64_t dat){
361__weak
bool OTP_Read(uint16_t adroffset,uint64_t* dat){
367#ifndef FLASH_FACTORY_DEFAULTS_OVERRIDE
const uint16_t VirtAddVarTab[NB_OF_VAR]
const uint16_t exportableFlashAddresses[NB_EXPORTABLE_ADR]
bool Flash_Read(uint16_t adr, uint16_t *buf, bool checkempty)
static void Flash_InvalidateDataCache()
bool Flash_ReadWriteDefault(uint16_t adr, uint16_t *buf, uint16_t def)
bool Flash_Write(uint16_t adr, uint16_t dat)
bool I2C_EEPROM_Read16(uint16_t devAdr, uint16_t adr, uint16_t *buf, bool checkempty)
__weak bool OTP_Read(uint16_t adroffset, uint64_t *dat)
void Flash_Write_Defaults()
const std::array< const std::pair< uint16_t, uint16_t >, 0 > empty_flash_defaults
void Flash_Dump(std::vector< std::tuple< uint16_t, uint16_t > > *result, bool includeAll)
uint8_t i2cBufferEeprom[sizeof(uint16_t)]
cpp_freertos::MutexStandard flashMutex
__weak bool OTP_Write(uint16_t adroffset, uint64_t dat)
bool I2C_EEPROM_Write16(uint16_t devAdr, uint16_t adr, uint16_t dat)
const std::span< const std::pair< uint16_t, uint16_t > > flash_factory_defaults
uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t *Data)
Returns the last stored variable data, if found, which correspond to the passed virtual address.
uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data)
Writes/upadtes variable data in EEPROM.
HAL_StatusTypeDef EE_Format()
Erases PAGE and PAGE1 and writes VALID_PAGE header to PAGE.
uint16_t EE_Init(void)
Restore the pages to a known good state in case of page's status corruption after a power loss.
static void * memcpy(void *dst, const void *src, size_t n)