worked on flash implementation

This commit is contained in:
SirSydom 2022-02-06 21:03:53 +01:00
parent aff7a4d661
commit 266287e2d1
4 changed files with 49 additions and 24 deletions

View File

@ -135,7 +135,7 @@ void Platform::commitNonVolatileMemory()
{ {
if(_bufferedEraseblockNumber > -1 && _bufferedEraseblockDirty) if(_bufferedEraseblockNumber > -1 && _bufferedEraseblockDirty)
{ {
writeBufferedEraseBlock(_bufferedEraseblockNumber); writeBufferedEraseBlock();
// _bufferedEraseblockNumber = -1; // does that make sense? // _bufferedEraseblockNumber = -1; // does that make sense?
} }
@ -198,9 +198,11 @@ void Platform::writeBufferedEraseBlock()
if(_bufferedEraseblockNumber > -1 && _bufferedEraseblockDirty) if(_bufferedEraseblockNumber > -1 && _bufferedEraseblockDirty)
{ {
flashErase(_bufferedEraseblockNumber); flashErase(_bufferedEraseblockNumber);
for(int i = 0; i< ; i++) for(int i = 0; i < flashEraseBlockSize(); i++)
{ // ToDo {
flashWritePage(); int32_t pageNumber = _bufferedEraseblockNumber * flashEraseBlockSize() + i;
uint8_t *data = _eraseblockBuffer + flashPageSize() * i;
flashWritePage(pageNumber, data);
} }
_bufferedEraseblockDirty = false; _bufferedEraseblockDirty = false;
} }

View File

@ -65,19 +65,21 @@ class Platform
virtual size_t flashPageSize(); virtual size_t flashPageSize();
// start of user flash aligned to start of an erase block // start of user flash aligned to start of an erase block
virtual uint8_t* userFlashStart(); virtual uint8_t* userFlashStart();
virtual size_t userFlashSizeEraseBlocks(); // in eraseBlocks // size of the user flash in EraseBlocks
virtual void flashErase(uint16_t eraseBlockNum); //relativ to userFlashStart virtual size_t userFlashSizeEraseBlocks();
virtual void flashWritePage(uint16_t pageNumber, uint8_t* data); //write a single page to flash (pageNumber relative to userFashStart //relativ to userFlashStart
virtual void flashErase(uint16_t eraseBlockNum);
//write a single page to flash (pageNumber relative to userFashStart
virtual void flashWritePage(uint16_t pageNumber, uint8_t* data);
NvMemoryType _memoryType = Eeprom; NvMemoryType _memoryType = Eeprom;
private:
void loadEraseblockContaining(uint32_t relativeAddress); void loadEraseblockContaining(uint32_t relativeAddress);
uint32_t bufferedEraseBlockStart(); uint32_t bufferedEraseBlockStart();
uint32_t bufferedEraseBlockEnd(); uint32_t bufferedEraseBlockEnd();
int32_t getEraseBlockNumberOf(uint32_t relativeAddress); int32_t getEraseBlockNumberOf(uint32_t relativeAddress);
// writes _eraseblockBuffer to flash // writes _eraseblockBuffer to flash
void writeBufferedEraseBlock(); virtual void writeBufferedEraseBlock();
// copies a EraseBlock into the _eraseblockBuffer // copies a EraseBlock into the _eraseblockBuffer
void bufferEraseBlock(uint32_t eraseBlockNumber); void bufferEraseBlock(uint32_t eraseBlockNumber);

View File

@ -92,9 +92,7 @@ size_t RP2040ArduinoPlatform::flashPageSize()
uint8_t* RP2040ArduinoPlatform::userFlashStart() uint8_t* RP2040ArduinoPlatform::userFlashStart()
{ {
// TODO return (uint8_t*)XIP_BASE + KNX_FLASH_OFFSET;
// XIP_BASE + KNX_FLASH_OFFSET
return nullptr;
} }
size_t RP2040ArduinoPlatform::userFlashSizeEraseBlocks() size_t RP2040ArduinoPlatform::userFlashSizeEraseBlocks()
@ -110,8 +108,7 @@ void RP2040ArduinoPlatform::flashErase(uint16_t eraseBlockNum)
noInterrupts(); noInterrupts();
rp2040.idleOtherCore(); rp2040.idleOtherCore();
// TODO: calculate position in flash flash_range_erase (KNX_FLASH_OFFSET + eraseBlockNum * flashPageSize() * flashEraseBlockSize(), flashPageSize() * flashEraseBlockSize());
flash_range_erase (0x100, flashPageSize() * flashEraseBlockSize());
rp2040.resumeOtherCore(); rp2040.resumeOtherCore();
interrupts(); interrupts();
@ -122,12 +119,28 @@ void RP2040ArduinoPlatform::flashWritePage(uint16_t pageNumber, uint8_t* data)
noInterrupts(); noInterrupts();
rp2040.idleOtherCore(); rp2040.idleOtherCore();
// TODO: calculate position in flash flash_range_program(KNX_FLASH_OFFSET + pageNumber * flashPageSize(), data, flashPageSize());
flash_range_program(0x100, data, flashPageSize());
rp2040.resumeOtherCore(); rp2040.resumeOtherCore();
interrupts(); interrupts();
} }
void RP2040ArduinoPlatform::writeBufferedEraseBlock()
{
if(_bufferedEraseblockNumber > -1 && _bufferedEraseblockDirty)
{
noInterrupts();
rp2040.idleOtherCore();
flash_range_erase (KNX_FLASH_OFFSET + _bufferedEraseblockNumber * flashPageSize() * flashEraseBlockSize(), flashPageSize() * flashEraseBlockSize());
flash_range_program(KNX_FLASH_OFFSET + _bufferedEraseblockNumber * flashPageSize() * flashEraseBlockSize(), _eraseblockBuffer, flashPageSize() * flashEraseBlockSize());
rp2040.resumeOtherCore();
interrupts();
_bufferedEraseblockDirty = false;
}
}
#endif #endif

View File

@ -26,13 +26,21 @@ public:
void commitToEeprom(); void commitToEeprom();
// size of one EraseBlock in pages
virtual size_t flashEraseBlockSize();
// size of one flash page in bytes
virtual size_t flashPageSize();
// start of user flash aligned to start of an erase block
virtual uint8_t* userFlashStart();
// size of the user flash in EraseBlocks
virtual size_t userFlashSizeEraseBlocks();
//relativ to userFlashStart
virtual void flashErase(uint16_t eraseBlockNum);
//write a single page to flash (pageNumber relative to userFashStart
virtual void flashWritePage(uint16_t pageNumber, uint8_t* data);
size_t flashEraseBlockSize(); // in bytes // writes _eraseblockBuffer to flash - overrides Plattform::writeBufferedEraseBlock()
size_t flashPageSize(); // in bytes void writeBufferedEraseBlock();
uint8_t* userFlashStart(); // start of user flash aligned to start of an erase block
size_t userFlashSizeEraseBlocks(); // in eraseBlocks
void flashErase(uint16_t eraseBlockNum); //relativ to userFlashStart
void flashWritePage(uint16_t pageNumber, uint8_t* data); //write a single page to flash (pageNumber relative to userFashStart
}; };
#endif #endif