NVProperty generic key value store using the MCU flash area.
Dependents: Turtle_RadioShuttle
Diff: NVProperty_MBEDFlash.cpp
- Revision:
- 12:5539cdc8be4b
- Parent:
- 8:b42bb4130002
- Child:
- 13:2436a800c0fa
diff -r d5dc788ec805 -r 5539cdc8be4b NVProperty_MBEDFlash.cpp --- a/NVProperty_MBEDFlash.cpp Sun Feb 10 10:43:09 2019 +0100 +++ b/NVProperty_MBEDFlash.cpp Sun Feb 10 18:39:29 2019 +0100 @@ -44,8 +44,6 @@ _flashIAP = new FlashIAP(); _flashIAP->init(); - // at present erased flash bits are assumed with 0xff value - // MBED_ASSERT(_flashIAP->get_erase_value() == NVProperty::PROPERTIES_EOF); // a min page size > 8 looks strange MBED_ASSERT(_flashIAP->get_page_size() <= sizeof(int64_t)); @@ -57,6 +55,7 @@ _rowSize = _flashIAP->get_sector_size(_flashIAP->get_flash_start()); // pageSize * 4; _startAddress = (uint8_t*)_flashIAP->get_flash_start() + ((_numPages-(_propSizekB * 1024)/_pageSize) * _pageSize); _endAddress = _startAddress + (_propSizekB * 1024); + _flashErasedValue = _flashIAP->get_erase_value(); _lastEntry = NULL; if (_debug) { @@ -125,8 +124,9 @@ uint32_t *startAddr = (uint32_t *)((startRow + i) * _rowSize); uint32_t *addr = startAddr; bool foundData = false; + uint32_t emtpyValue = _flashErasedValue << 24 | _flashErasedValue << 16 | _flashErasedValue << 8 | _flashErasedValue; for (int offset = 0; offset < _rowSize; offset += sizeof(uint32_t)) { - if (*addr++ != 0xffffffff) { + if (*addr++ != emtpyValue) { foundData = true; break; } @@ -204,7 +204,7 @@ NVProperty_MBEDFlash::_FlashIsCleared(uint8_t *address, int len) { while (len-- > 0) { - if (*address++ != NVProperty::PROPERTIES_EOF) { + if (*address++ != _flashErasedValue) { return false; } } @@ -520,7 +520,7 @@ int index = 0; _flashEntry *p = (_flashEntry *)(_startAddress + sizeof(_flash_header)); - while((uint8_t *)p < _endAddress && p->key != NVProperty::PROPERTIES_EOF) { + while((uint8_t *)p < _endAddress && p->key != _flashErasedValue) { int64_t value = 0; switch(p->t.type) { @@ -591,7 +591,7 @@ p = (_flashEntry *)(_startAddress + sizeof(_flash_header)); _flashEntry *lastP = NULL; while(true) { - if ((uint8_t*)p >= _endAddress || p->key == NVProperty::PROPERTIES_EOF) { + if ((uint8_t*)p >= _endAddress || p->key == _flashErasedValue) { if ((uint8_t*)p <= _endAddress) _lastEntry = p; if (!lastP || lastP->t.deleted) @@ -648,7 +648,7 @@ int freeSpace = 0; _flashEntry *p = (_flashEntry *)(_startAddress + sizeof(_flash_header)); - while((uint8_t *)p < _endAddress && p->key != NVProperty::PROPERTIES_EOF) { + while((uint8_t *)p < _endAddress && p->key != _flashErasedValue) { _flashEntry *k = _GetFlashEntry(p->key); if (k == p) { // current entry is the lastest one. totalLen += _GetFlashEntryLen(k); @@ -685,7 +685,7 @@ memcpy(t, _startAddress, sizeof(_flash_header)); t += sizeof(_flash_header); - while((uint8_t *)p < _endAddress && p->key != NVProperty::PROPERTIES_EOF) { + while((uint8_t *)p < _endAddress && p->key != _flashErasedValue) { _flashEntry *k = _GetFlashEntry(p->key, (uint8_t *)p); if (k == p) { // current entry is the lastest one. if (!p->t.deleted) {