mirror of
https://github.com/thelsing/knx.git
synced 2025-08-17 13:47:28 +02:00
worked on flash implementation
This commit is contained in:
parent
aff7a4d661
commit
266287e2d1
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -57,7 +57,7 @@ class Platform
|
|||||||
void NonVolatileMemoryType(NvMemoryType type);
|
void NonVolatileMemoryType(NvMemoryType type);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Flash memory
|
// Flash memory
|
||||||
|
|
||||||
// size of one EraseBlock in pages
|
// size of one EraseBlock in pages
|
||||||
virtual size_t flashEraseBlockSize();
|
virtual size_t flashEraseBlockSize();
|
||||||
@ -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);
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user