19#ifdef USE_EEPROM_EMULATION
36 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
37 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPERR);
38 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_WRPERR);
39 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGAERR);
40 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGPERR);
41 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGSERR);
56 if(readRes == 1 || (readRes == 0 && buf != dat) ){
58 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
59 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPERR);
60 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_WRPERR);
61 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGAERR);
62 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGPERR);
63 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGSERR);
94 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
95 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPERR);
96 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_WRPERR);
97 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGAERR);
98 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGPERR);
99 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGSERR);
107#elif defined(I2C_PORT_EEPROM)
120 uint16_t dataLength =
sizeof(dat);
122 uint32_t adrAbs =
adr;
123 adrAbs *=
sizeof(dat)/I2C_EEPROM_DATA_SIZE;
124 uint32_t curAdr = adrAbs;
125 assert(adrAbs < I2C_EEPROM_SIZE);
130 while(curAdr < adrAbs+dataLength){
135 uint16_t i2cAdr = devAdr;
136 uint16_t writeAdr = curAdr;
138 writeAdr = curAdr & 0xffff;
141 uint16_t wLen = std::min<uint16_t>(dataLength,I2C_EEPROM_PAGEWRITE_SIZE - (adrAbs % I2C_EEPROM_PAGEWRITE_SIZE));
156 uint32_t adrAbs = (
adr *
sizeof(*buf)/I2C_EEPROM_DATA_SIZE);
157 assert(adrAbs < I2C_EEPROM_SIZE);
161 uint16_t i2cAdr = devAdr;
162 uint16_t datAdr = adrAbs & 0xffff;
176 res = empty ? false : res;
204 std::array<uint8_t,I2C_EEPROM_PAGEWRITE_SIZE> eraseBuf;
205 eraseBuf.fill(I2C_EEPROM_ERASED);
206 for(uint32_t i=I2C_EEPROM_OFS;i<I2C_EEPROM_SIZE;i+=I2C_EEPROM_PAGEWRITE_SIZE){
207 uint16_t datAdr = i & 0xffff;
208 uint16_t devAdr = I2C_EEPROM_ADR;
212 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);
250void Flash_Dump(std::vector<std::tuple<uint16_t,uint16_t>> *result,
bool includeAll){
251 uint16_t amount = NB_EXPORTABLE_ADR;
260 for(uint32_t i = 0;i<amount ; i++){
262 uint16_t
adr = list[i];
265 result->push_back(std::tuple<uint16_t,uint16_t>{
adr,v});
277#if defined(FLASH_OTP_BASE) && defined(FLASH_OTP_END) && defined(OTPMEMORY)
283 uint32_t
adr = (FLASH_OTP_BASE+adroffset*
sizeof(uint64_t));
284 if(
adr > FLASH_OTP_END){
287 uint64_t curval = *(uint64_t*)
adr;
288 if(curval != 0xffffffffffffffff){
291 if(HAL_FLASH_Unlock()!=HAL_OK)
return false;
293 bool success = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,
adr, (uint32_t)(dat)) == HAL_OK;
294 success = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,
adr+4, (uint32_t)(dat >> 32)) == HAL_OK && success;
300__weak
bool OTP_Read(uint16_t adroffset,uint64_t* dat){
301 uint32_t
adr = (FLASH_OTP_BASE+adroffset*
sizeof(uint64_t));
302 if(
adr > FLASH_OTP_END){
305 uint64_t curval = *(uint64_t*)
adr;
309#elif defined(I2C_EEPROM_OTP_ADR) && defined(I2C_PORT_EEPROM)
313 for(uint8_t i = 0; i < 4; i++){
314 bool res =
I2C_EEPROM_Write16(I2C_EEPROM_OTP_ADR, 4*adroffset + (i), (dat >> (i*16)) & 0xffff);
324__weak
bool OTP_Read(uint16_t adroffset,uint64_t* dat){
326 for(uint8_t i = 0; i < 4; i++){
328 bool res =
I2C_EEPROM_Read16(I2C_EEPROM_OTP_ADR, 4*adroffset + (i), &tdat,
false);
329 val |= (uint64_t)tdat << (i*16);
338__weak
bool OTP_Write(uint16_t adroffset,uint64_t dat){
343__weak
bool OTP_Read(uint16_t adroffset,uint64_t* dat){
349#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)
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)