mirror of
https://github.com/thelsing/knx.git
synced 2025-08-31 13:47:01 +02:00
worked on flash implementation
This commit is contained in:
parent
a4abacb17b
commit
aff7a4d661
@ -133,6 +133,12 @@ size_t Platform::getNonVolatileMemorySize()
|
|||||||
|
|
||||||
void Platform::commitNonVolatileMemory()
|
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)
|
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()
|
uint32_t Platform::bufferedEraseBlockStart()
|
||||||
{
|
{
|
||||||
return _bufferedEraseblockNumber * flashEraseBlockSize();
|
return _bufferedEraseblockNumber * (flashEraseBlockSize() * flashPageSize());
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t Platform::bufferedEraseBlockEnd()
|
uint32_t Platform::bufferedEraseBlockEnd()
|
||||||
{
|
{
|
||||||
return (_bufferedEraseblockNumber + 1) * flashEraseBlockSize() -1;
|
return (_bufferedEraseblockNumber + 1) * (flashEraseBlockSize() * flashPageSize()) -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t Platform::getEraseBlockNumberOf(uint32_t relativeAddress)
|
int32_t Platform::getEraseBlockNumberOf(uint32_t relativeAddress)
|
||||||
{
|
{
|
||||||
return -1;
|
return relativeAddress / (flashEraseBlockSize() * flashPageSize());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Platform::writeBufferedEraseBlock()
|
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)
|
void Platform::bufferEraseBlock(uint32_t eraseBlockNumber)
|
||||||
{
|
{
|
||||||
|
memcpy(_eraseblockBuffer, userFlashStart() + eraseBlockNumber * flashEraseBlockSize() * flashPageSize(), flashEraseBlockSize() * flashPageSize());
|
||||||
|
|
||||||
|
_bufferedEraseblockNumber = eraseBlockNumber;
|
||||||
|
_bufferedEraseblockDirty = false;
|
||||||
}
|
}
|
||||||
|
@ -59,9 +59,12 @@ class Platform
|
|||||||
protected:
|
protected:
|
||||||
// Flash memory
|
// Flash memory
|
||||||
|
|
||||||
virtual size_t flashEraseBlockSize(); // in pages
|
// size of one EraseBlock in pages
|
||||||
virtual size_t flashPageSize(); // in bytes
|
virtual size_t flashEraseBlockSize();
|
||||||
virtual uint8_t* userFlashStart(); // start of user flash aligned to start of an erase block
|
// 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 size_t userFlashSizeEraseBlocks(); // in eraseBlocks
|
||||||
virtual void flashErase(uint16_t eraseBlockNum); //relativ to userFlashStart
|
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
|
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 bufferedEraseBlockStart();
|
||||||
uint32_t bufferedEraseBlockEnd();
|
uint32_t bufferedEraseBlockEnd();
|
||||||
int32_t getEraseBlockNumberOf(uint32_t relativeAddress);
|
int32_t getEraseBlockNumberOf(uint32_t relativeAddress);
|
||||||
|
// writes _eraseblockBuffer to flash
|
||||||
void writeBufferedEraseBlock();
|
void writeBufferedEraseBlock();
|
||||||
|
// copies a EraseBlock into the _eraseblockBuffer
|
||||||
void bufferEraseBlock(uint32_t eraseBlockNumber);
|
void bufferEraseBlock(uint32_t eraseBlockNumber);
|
||||||
|
|
||||||
// in theory we would have to use this buffer for memory reads too,
|
// in theory we would have to use this buffer for memory reads too,
|
||||||
|
@ -16,7 +16,7 @@ For more, use or own emulation (maybe with littlefs)
|
|||||||
#include "rp2040_arduino_platform.h"
|
#include "rp2040_arduino_platform.h"
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_RP2040
|
#ifdef ARDUINO_ARCH_RP2040
|
||||||
#include <knx/bits.h>
|
#include "knx/bits.h"
|
||||||
|
|
||||||
#include <Arduino.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 <EEPROM.h> // EEPROM emulation in flash, part of Earl E Philhowers Pi Pico Arduino support
|
||||||
#include <pico/unique_id.h> // from Pico SDK
|
#include <pico/unique_id.h> // from Pico SDK
|
||||||
#include <hardware/watchdog.h> // from Pico SDK
|
#include <hardware/watchdog.h> // from Pico SDK
|
||||||
|
#include <hardware/flash.h> // from Pico SDK
|
||||||
|
|
||||||
|
|
||||||
RP2040ArduinoPlatform::RP2040ArduinoPlatform()
|
RP2040ArduinoPlatform::RP2040ArduinoPlatform()
|
||||||
@ -77,6 +78,56 @@ void RP2040ArduinoPlatform::commitToEeprom()
|
|||||||
{
|
{
|
||||||
EEPROM.commit();
|
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
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
@ -4,6 +4,14 @@
|
|||||||
|
|
||||||
#ifdef ARDUINO_ARCH_RP2040
|
#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
|
class RP2040ArduinoPlatform : public ArduinoPlatform
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -11,11 +19,20 @@ public:
|
|||||||
RP2040ArduinoPlatform( HardwareSerial* s);
|
RP2040ArduinoPlatform( HardwareSerial* s);
|
||||||
|
|
||||||
// unique serial number
|
// unique serial number
|
||||||
uint32_t uniqueSerialNumber() override;
|
uint32_t uniqueSerialNumber(); //override;
|
||||||
|
|
||||||
void restart();
|
void restart();
|
||||||
uint8_t* getEepromBuffer(uint16_t size);
|
uint8_t* getEepromBuffer(uint16_t size);
|
||||||
void commitToEeprom();
|
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
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user