From 266287e2d12994c23d2e4780f04e7344004ba179 Mon Sep 17 00:00:00 2001 From: SirSydom Date: Sun, 6 Feb 2022 21:03:53 +0100 Subject: [PATCH] worked on flash implementation --- src/knx/platform.cpp | 10 ++++++---- src/knx/platform.h | 14 ++++++++------ src/rp2040_arduino_platform.cpp | 27 ++++++++++++++++++++------- src/rp2040_arduino_platform.h | 22 +++++++++++++++------- 4 files changed, 49 insertions(+), 24 deletions(-) diff --git a/src/knx/platform.cpp b/src/knx/platform.cpp index e71c35a..ff79f31 100644 --- a/src/knx/platform.cpp +++ b/src/knx/platform.cpp @@ -135,7 +135,7 @@ void Platform::commitNonVolatileMemory() { if(_bufferedEraseblockNumber > -1 && _bufferedEraseblockDirty) { - writeBufferedEraseBlock(_bufferedEraseblockNumber); + writeBufferedEraseBlock(); // _bufferedEraseblockNumber = -1; // does that make sense? } @@ -198,9 +198,11 @@ void Platform::writeBufferedEraseBlock() if(_bufferedEraseblockNumber > -1 && _bufferedEraseblockDirty) { flashErase(_bufferedEraseblockNumber); - for(int i = 0; i< ; i++) - { // ToDo - flashWritePage(); + for(int i = 0; i < flashEraseBlockSize(); i++) + { + int32_t pageNumber = _bufferedEraseblockNumber * flashEraseBlockSize() + i; + uint8_t *data = _eraseblockBuffer + flashPageSize() * i; + flashWritePage(pageNumber, data); } _bufferedEraseblockDirty = false; } diff --git a/src/knx/platform.h b/src/knx/platform.h index 05616b6..1ac61e0 100644 --- a/src/knx/platform.h +++ b/src/knx/platform.h @@ -57,7 +57,7 @@ class Platform void NonVolatileMemoryType(NvMemoryType type); protected: - // Flash memory + // Flash memory // size of one EraseBlock in pages virtual size_t flashEraseBlockSize(); @@ -65,19 +65,21 @@ class Platform virtual size_t flashPageSize(); // start of user flash aligned to start of an erase block virtual uint8_t* userFlashStart(); - virtual size_t userFlashSizeEraseBlocks(); // in eraseBlocks - virtual void flashErase(uint16_t eraseBlockNum); //relativ to userFlashStart - virtual void flashWritePage(uint16_t pageNumber, uint8_t* data); //write a single page to flash (pageNumber relative to userFashStart + // 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); NvMemoryType _memoryType = Eeprom; - private: void loadEraseblockContaining(uint32_t relativeAddress); uint32_t bufferedEraseBlockStart(); uint32_t bufferedEraseBlockEnd(); int32_t getEraseBlockNumberOf(uint32_t relativeAddress); // writes _eraseblockBuffer to flash - void writeBufferedEraseBlock(); + virtual void writeBufferedEraseBlock(); // copies a EraseBlock into the _eraseblockBuffer void bufferEraseBlock(uint32_t eraseBlockNumber); diff --git a/src/rp2040_arduino_platform.cpp b/src/rp2040_arduino_platform.cpp index 392a9de..ce03b71 100644 --- a/src/rp2040_arduino_platform.cpp +++ b/src/rp2040_arduino_platform.cpp @@ -92,9 +92,7 @@ size_t RP2040ArduinoPlatform::flashPageSize() uint8_t* RP2040ArduinoPlatform::userFlashStart() { - // TODO - // XIP_BASE + KNX_FLASH_OFFSET - return nullptr; + return (uint8_t*)XIP_BASE + KNX_FLASH_OFFSET; } size_t RP2040ArduinoPlatform::userFlashSizeEraseBlocks() @@ -110,8 +108,7 @@ void RP2040ArduinoPlatform::flashErase(uint16_t eraseBlockNum) noInterrupts(); rp2040.idleOtherCore(); - // TODO: calculate position in flash - flash_range_erase (0x100, flashPageSize() * flashEraseBlockSize()); + flash_range_erase (KNX_FLASH_OFFSET + eraseBlockNum * flashPageSize() * flashEraseBlockSize(), flashPageSize() * flashEraseBlockSize()); rp2040.resumeOtherCore(); interrupts(); @@ -122,12 +119,28 @@ void RP2040ArduinoPlatform::flashWritePage(uint16_t pageNumber, uint8_t* data) noInterrupts(); rp2040.idleOtherCore(); - // TODO: calculate position in flash - flash_range_program(0x100, data, flashPageSize()); + flash_range_program(KNX_FLASH_OFFSET + pageNumber * flashPageSize(), data, flashPageSize()); rp2040.resumeOtherCore(); 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 diff --git a/src/rp2040_arduino_platform.h b/src/rp2040_arduino_platform.h index 1b19451..8f26e58 100644 --- a/src/rp2040_arduino_platform.h +++ b/src/rp2040_arduino_platform.h @@ -26,13 +26,21 @@ public: void commitToEeprom(); - - size_t flashEraseBlockSize(); // in bytes - size_t flashPageSize(); // in bytes - 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 + // 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); + + // writes _eraseblockBuffer to flash - overrides Plattform::writeBufferedEraseBlock() + void writeBufferedEraseBlock(); }; #endif