worked on flash implementation

This commit is contained in:
SirSydom 2022-02-06 13:37:25 +01:00
parent a4abacb17b
commit aff7a4d661
4 changed files with 100 additions and 8 deletions

View File

@ -133,6 +133,12 @@ size_t Platform::getNonVolatileMemorySize()
void Platform::commitNonVolatileMemory()
{
if(_bufferedEraseblockNumber > -1 && _bufferedEraseblockDirty)
{
writeBufferedEraseBlock(_bufferedEraseblockNumber);
// _bufferedEraseblockNumber = -1; // does that make sense?
}
}
uint32_t Platform::writeNonVolatileMemory(uint32_t relativeAddress, uint8_t* buffer, size_t size)
@ -172,26 +178,39 @@ void Platform::loadEraseblockContaining(uint32_t relativeAddress)
uint32_t Platform::bufferedEraseBlockStart()
{
return _bufferedEraseblockNumber * flashEraseBlockSize();
return _bufferedEraseblockNumber * (flashEraseBlockSize() * flashPageSize());
}
uint32_t Platform::bufferedEraseBlockEnd()
{
return (_bufferedEraseblockNumber + 1) * flashEraseBlockSize() -1;
return (_bufferedEraseblockNumber + 1) * (flashEraseBlockSize() * flashPageSize()) -1;
}
int32_t Platform::getEraseBlockNumberOf(uint32_t relativeAddress)
{
return -1;
return relativeAddress / (flashEraseBlockSize() * flashPageSize());
}
void Platform::writeBufferedEraseBlock()
{
if(_bufferedEraseblockNumber > -1 && _bufferedEraseblockDirty)
{
flashErase(_bufferedEraseblockNumber);
for(int i = 0; i< ; i++)
{ // ToDo
flashWritePage();
}
_bufferedEraseblockDirty = false;
}
}
void Platform::bufferEraseBlock(uint32_t eraseBlockNumber)
{
memcpy(_eraseblockBuffer, userFlashStart() + eraseBlockNumber * flashEraseBlockSize() * flashPageSize(), flashEraseBlockSize() * flashPageSize());
_bufferedEraseblockNumber = eraseBlockNumber;
_bufferedEraseblockDirty = false;
}

View File

@ -59,9 +59,12 @@ class Platform
protected:
// Flash memory
virtual size_t flashEraseBlockSize(); // in pages
virtual size_t flashPageSize(); // in bytes
virtual uint8_t* userFlashStart(); // start of user flash aligned to start of an erase block
// 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();
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
@ -73,7 +76,9 @@ class Platform
uint32_t bufferedEraseBlockStart();
uint32_t bufferedEraseBlockEnd();
int32_t getEraseBlockNumberOf(uint32_t relativeAddress);
// writes _eraseblockBuffer to flash
void writeBufferedEraseBlock();
// copies a EraseBlock into the _eraseblockBuffer
void bufferEraseBlock(uint32_t eraseBlockNumber);
// in theory we would have to use this buffer for memory reads too,

View File

@ -16,7 +16,7 @@ For more, use or own emulation (maybe with littlefs)
#include "rp2040_arduino_platform.h"
#ifdef ARDUINO_ARCH_RP2040
#include <knx/bits.h>
#include "knx/bits.h"
#include <Arduino.h>
@ -24,6 +24,7 @@ For more, use or own emulation (maybe with littlefs)
#include <EEPROM.h> // EEPROM emulation in flash, part of Earl E Philhowers Pi Pico Arduino support
#include <pico/unique_id.h> // from Pico SDK
#include <hardware/watchdog.h> // from Pico SDK
#include <hardware/flash.h> // from Pico SDK
RP2040ArduinoPlatform::RP2040ArduinoPlatform()
@ -77,6 +78,56 @@ void RP2040ArduinoPlatform::commitToEeprom()
{
EEPROM.commit();
}
size_t RP2040ArduinoPlatform::flashEraseBlockSize()
{
return 16; // 16 pages x 256byte/page = 4096byte
}
size_t RP2040ArduinoPlatform::flashPageSize()
{
return 256;
}
uint8_t* RP2040ArduinoPlatform::userFlashStart()
{
// TODO
// XIP_BASE + KNX_FLASH_OFFSET
return nullptr;
}
size_t RP2040ArduinoPlatform::userFlashSizeEraseBlocks()
{
if(KNX_FLASH_SIZE <= 0)
return 0;
else
return ( (KNX_FLASH_SIZE - 1) / (flashPageSize() * flashEraseBlockSize())) + 1;
}
void RP2040ArduinoPlatform::flashErase(uint16_t eraseBlockNum)
{
noInterrupts();
rp2040.idleOtherCore();
// TODO: calculate position in flash
flash_range_erase (0x100, flashPageSize() * flashEraseBlockSize());
rp2040.resumeOtherCore();
interrupts();
}
void RP2040ArduinoPlatform::flashWritePage(uint16_t pageNumber, uint8_t* data)
{
noInterrupts();
rp2040.idleOtherCore();
// TODO: calculate position in flash
flash_range_program(0x100, data, flashPageSize());
rp2040.resumeOtherCore();
interrupts();
}
#endif

View File

@ -4,6 +4,14 @@
#ifdef ARDUINO_ARCH_RP2040
#ifndef KNX_FLASH_OFFSET
#define KNX_FLASH_OFFSET 0x180000 // 1.5MiB
#endif
#ifndef KNX_FLASH_SIZE
#define KNX_FLASH_SIZE 1024
#endif
class RP2040ArduinoPlatform : public ArduinoPlatform
{
public:
@ -11,11 +19,20 @@ public:
RP2040ArduinoPlatform( HardwareSerial* s);
// unique serial number
uint32_t uniqueSerialNumber() override;
uint32_t uniqueSerialNumber(); //override;
void restart();
uint8_t* getEepromBuffer(uint16_t size);
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
};
#endif