mirror of
https://github.com/thelsing/knx.git
synced 2024-12-18 19:08:18 +01:00
32bit eeprom size (#230)
* add commitNonVolatileMemory overload to batch write chars n times to flash * changed uint8_t getEepromBuffer(uint16_t size) to uint8_t getEepromBuffer(uint32_t size) to allow eeprom > 65k * reworked PR #230
This commit is contained in:
parent
9894a8c8b8
commit
dce92403e5
3
.vscode/extensions.json
vendored
3
.vscode/extensions.json
vendored
@ -3,5 +3,8 @@
|
|||||||
// for the documentation about the extensions.json format
|
// for the documentation about the extensions.json format
|
||||||
"recommendations": [
|
"recommendations": [
|
||||||
"platformio.platformio-ide"
|
"platformio.platformio-ide"
|
||||||
|
],
|
||||||
|
"unwantedRecommendations": [
|
||||||
|
"ms-vscode.cpptools-extension-pack"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -495,7 +495,7 @@ void CC1310Platform::init()
|
|||||||
setupNVS();
|
setupNVS();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t* CC1310Platform::getEepromBuffer(uint16_t size)
|
uint8_t* CC1310Platform::getEepromBuffer(uint32_t size)
|
||||||
{
|
{
|
||||||
if(size > KNX_FLASH_SIZE)
|
if(size > KNX_FLASH_SIZE)
|
||||||
{
|
{
|
||||||
|
@ -20,7 +20,7 @@ class CC1310Platform : public Platform
|
|||||||
void restart() final;
|
void restart() final;
|
||||||
void fatalError() final;
|
void fatalError() final;
|
||||||
|
|
||||||
uint8_t* getEepromBuffer(uint16_t size) final;
|
uint8_t* getEepromBuffer(uint32_t size) final;
|
||||||
void commitToEeprom() final;
|
void commitToEeprom() final;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -108,7 +108,7 @@ bool Esp32Platform::sendBytesUniCast(uint32_t addr, uint16_t port, uint8_t* buff
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t * Esp32Platform::getEepromBuffer(uint16_t size)
|
uint8_t * Esp32Platform::getEepromBuffer(uint32_t size)
|
||||||
{
|
{
|
||||||
uint8_t * eepromptr = EEPROM.getDataPtr();
|
uint8_t * eepromptr = EEPROM.getDataPtr();
|
||||||
if(eepromptr == nullptr) {
|
if(eepromptr == nullptr) {
|
||||||
|
@ -32,7 +32,7 @@ public:
|
|||||||
bool sendBytesUniCast(uint32_t addr, uint16_t port, uint8_t* buffer, uint16_t len) override;
|
bool sendBytesUniCast(uint32_t addr, uint16_t port, uint8_t* buffer, uint16_t len) override;
|
||||||
|
|
||||||
//memory
|
//memory
|
||||||
uint8_t* getEepromBuffer(uint16_t size);
|
uint8_t* getEepromBuffer(uint32_t size);
|
||||||
void commitToEeprom();
|
void commitToEeprom();
|
||||||
private:
|
private:
|
||||||
WiFiUDP _udp;
|
WiFiUDP _udp;
|
||||||
|
@ -108,7 +108,7 @@ bool EspPlatform::sendBytesUniCast(uint32_t addr, uint16_t port, uint8_t* buffer
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t * EspPlatform::getEepromBuffer(uint16_t size)
|
uint8_t * EspPlatform::getEepromBuffer(uint32_t size)
|
||||||
{
|
{
|
||||||
uint8_t * eepromptr = EEPROM.getDataPtr();
|
uint8_t * eepromptr = EEPROM.getDataPtr();
|
||||||
if(eepromptr == nullptr) {
|
if(eepromptr == nullptr) {
|
||||||
|
@ -32,7 +32,7 @@ class EspPlatform : public ArduinoPlatform
|
|||||||
bool sendBytesUniCast(uint32_t addr, uint16_t port, uint8_t* buffer, uint16_t len) override;
|
bool sendBytesUniCast(uint32_t addr, uint16_t port, uint8_t* buffer, uint16_t len) override;
|
||||||
|
|
||||||
//memory
|
//memory
|
||||||
uint8_t* getEepromBuffer(uint16_t size);
|
uint8_t* getEepromBuffer(uint32_t size);
|
||||||
void commitToEeprom();
|
void commitToEeprom();
|
||||||
private:
|
private:
|
||||||
WiFiUDP _udp;
|
WiFiUDP _udp;
|
||||||
|
@ -128,7 +128,7 @@ void Platform::flashErase(uint16_t eraseBlockNum)
|
|||||||
void Platform::flashWritePage(uint16_t pageNumber, uint8_t* data)
|
void Platform::flashWritePage(uint16_t pageNumber, uint8_t* data)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
uint8_t * Platform::getEepromBuffer(uint16_t size)
|
uint8_t * Platform::getEepromBuffer(uint32_t size)
|
||||||
{
|
{
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@ -201,6 +201,37 @@ uint32_t Platform::writeNonVolatileMemory(uint32_t relativeAddress, uint8_t* buf
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// writes value repeat times into flash starting at relativeAddress
|
||||||
|
// returns next free relativeAddress
|
||||||
|
uint32_t Platform::writeNonVolatileMemory(uint32_t relativeAddress, uint8_t value, size_t repeat)
|
||||||
|
{
|
||||||
|
if(_memoryType == Flash)
|
||||||
|
{
|
||||||
|
while (repeat > 0)
|
||||||
|
{
|
||||||
|
loadEraseblockContaining(relativeAddress);
|
||||||
|
uint32_t start = _bufferedEraseblockNumber * (flashEraseBlockSize() * flashPageSize());
|
||||||
|
uint32_t end = start + (flashEraseBlockSize() * flashPageSize());
|
||||||
|
|
||||||
|
uint32_t offset = relativeAddress - start;
|
||||||
|
uint32_t length = end - relativeAddress;
|
||||||
|
if(length > repeat)
|
||||||
|
length = repeat;
|
||||||
|
memset(_eraseblockBuffer + offset, value, length);
|
||||||
|
_bufferedEraseblockDirty = true;
|
||||||
|
|
||||||
|
relativeAddress += length;
|
||||||
|
repeat -= length;
|
||||||
|
}
|
||||||
|
return relativeAddress;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memset(getEepromBuffer(KNX_FLASH_SIZE)+relativeAddress, value, repeat);
|
||||||
|
return relativeAddress+repeat;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Platform::loadEraseblockContaining(uint32_t relativeAddress)
|
void Platform::loadEraseblockContaining(uint32_t relativeAddress)
|
||||||
{
|
{
|
||||||
int32_t blockNum = getEraseBlockNumberOf(relativeAddress);
|
int32_t blockNum = getEraseBlockNumberOf(relativeAddress);
|
||||||
|
@ -61,7 +61,7 @@ class Platform
|
|||||||
//
|
//
|
||||||
// --- changes to the UserMemory are written directly into the address space starting at getEepromBuffer
|
// --- changes to the UserMemory are written directly into the address space starting at getEepromBuffer
|
||||||
// --- commitToEeprom must save this to a non-volatile area if neccessary
|
// --- commitToEeprom must save this to a non-volatile area if neccessary
|
||||||
virtual uint8_t* getEepromBuffer(uint16_t size);
|
virtual uint8_t* getEepromBuffer(uint32_t size);
|
||||||
virtual void commitToEeprom();
|
virtual void commitToEeprom();
|
||||||
// -------------------------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -70,6 +70,7 @@ class Platform
|
|||||||
virtual void commitNonVolatileMemory();
|
virtual void commitNonVolatileMemory();
|
||||||
// address is relative to start of nonvolatile memory
|
// address is relative to start of nonvolatile memory
|
||||||
virtual uint32_t writeNonVolatileMemory(uint32_t relativeAddress, uint8_t* buffer, size_t size);
|
virtual uint32_t writeNonVolatileMemory(uint32_t relativeAddress, uint8_t* buffer, size_t size);
|
||||||
|
virtual uint32_t writeNonVolatileMemory(uint32_t relativeAddress, uint8_t value, size_t repeat);
|
||||||
|
|
||||||
NvMemoryType NonVolatileMemoryType();
|
NvMemoryType NonVolatileMemoryType();
|
||||||
void NonVolatileMemoryType(NvMemoryType type);
|
void NonVolatileMemoryType(NvMemoryType type);
|
||||||
|
@ -265,7 +265,7 @@ int LinuxPlatform::readBytesMultiCast(uint8_t* buffer, uint16_t maxLen)
|
|||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t* LinuxPlatform::getEepromBuffer(uint16_t size)
|
uint8_t* LinuxPlatform::getEepromBuffer(uint32_t size)
|
||||||
{
|
{
|
||||||
if (_fd < 0)
|
if (_fd < 0)
|
||||||
doMemoryMapping();
|
doMemoryMapping();
|
||||||
|
@ -55,7 +55,7 @@ public:
|
|||||||
int readWriteSpi (uint8_t *data, size_t len) override;
|
int readWriteSpi (uint8_t *data, size_t len) override;
|
||||||
|
|
||||||
//memory
|
//memory
|
||||||
uint8_t* getEepromBuffer(uint16_t size) override;
|
uint8_t* getEepromBuffer(uint32_t size) override;
|
||||||
void commitToEeprom() override;
|
void commitToEeprom() override;
|
||||||
void cmdlineArgs(int argc, char** argv);
|
void cmdlineArgs(int argc, char** argv);
|
||||||
|
|
||||||
|
@ -109,7 +109,7 @@ void RP2040ArduinoPlatform::restart()
|
|||||||
|
|
||||||
#ifdef USE_RP2040_LARGE_EEPROM_EMULATION
|
#ifdef USE_RP2040_LARGE_EEPROM_EMULATION
|
||||||
|
|
||||||
uint8_t * RP2040ArduinoPlatform::getEepromBuffer(uint16_t size)
|
uint8_t * RP2040ArduinoPlatform::getEepromBuffer(uint32_t size)
|
||||||
{
|
{
|
||||||
if(size%4096)
|
if(size%4096)
|
||||||
{
|
{
|
||||||
@ -144,7 +144,7 @@ void RP2040ArduinoPlatform::commitToEeprom()
|
|||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
uint8_t * RP2040ArduinoPlatform::getEepromBuffer(uint16_t size)
|
uint8_t * RP2040ArduinoPlatform::getEepromBuffer(uint32_t size)
|
||||||
{
|
{
|
||||||
if(size > 4096)
|
if(size > 4096)
|
||||||
{
|
{
|
||||||
|
@ -30,7 +30,7 @@ public:
|
|||||||
void restart();
|
void restart();
|
||||||
|
|
||||||
#ifdef USE_RP2040_EEPROM_EMULATION
|
#ifdef USE_RP2040_EEPROM_EMULATION
|
||||||
uint8_t* getEepromBuffer(uint16_t size);
|
uint8_t* getEepromBuffer(uint32_t size);
|
||||||
void commitToEeprom();
|
void commitToEeprom();
|
||||||
|
|
||||||
#ifdef USE_RP2040_LARGE_EEPROM_EMULATION
|
#ifdef USE_RP2040_LARGE_EEPROM_EMULATION
|
||||||
|
@ -61,7 +61,7 @@ void SamdPlatform::restart()
|
|||||||
|
|
||||||
#ifdef USE_SAMD_EEPROM_EMULATION
|
#ifdef USE_SAMD_EEPROM_EMULATION
|
||||||
#pragma warning "Using EEPROM Simulation"
|
#pragma warning "Using EEPROM Simulation"
|
||||||
uint8_t* SamdPlatform::getEepromBuffer(uint16_t size)
|
uint8_t* SamdPlatform::getEepromBuffer(uint32_t size)
|
||||||
{
|
{
|
||||||
//EEPROM.begin(size);
|
//EEPROM.begin(size);
|
||||||
if(size > EEPROM_EMULATION_SIZE)
|
if(size > EEPROM_EMULATION_SIZE)
|
||||||
|
@ -17,7 +17,7 @@ public:
|
|||||||
|
|
||||||
void restart();
|
void restart();
|
||||||
#ifdef USE_SAMD_EEPROM_EMULATION
|
#ifdef USE_SAMD_EEPROM_EMULATION
|
||||||
uint8_t* getEepromBuffer(uint16_t size);
|
uint8_t* getEepromBuffer(uint32_t size);
|
||||||
void commitToEeprom();
|
void commitToEeprom();
|
||||||
#else
|
#else
|
||||||
// size of one EraseBlock in pages
|
// size of one EraseBlock in pages
|
||||||
|
@ -34,7 +34,7 @@ void Stm32Platform::restart()
|
|||||||
NVIC_SystemReset();
|
NVIC_SystemReset();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t * Stm32Platform::getEepromBuffer(uint16_t size)
|
uint8_t * Stm32Platform::getEepromBuffer(uint32_t size)
|
||||||
{
|
{
|
||||||
// check if the buffer already exists
|
// check if the buffer already exists
|
||||||
if (_eepromPtr == nullptr) // we need to initialize the buffer first
|
if (_eepromPtr == nullptr) // we need to initialize the buffer first
|
||||||
|
@ -15,7 +15,7 @@ public:
|
|||||||
void restart();
|
void restart();
|
||||||
|
|
||||||
//memory
|
//memory
|
||||||
uint8_t* getEepromBuffer(uint16_t size);
|
uint8_t* getEepromBuffer(uint32_t size);
|
||||||
void commitToEeprom();
|
void commitToEeprom();
|
||||||
private:
|
private:
|
||||||
uint8_t *_eepromPtr = nullptr;
|
uint8_t *_eepromPtr = nullptr;
|
||||||
|
Loading…
Reference in New Issue
Block a user