mirror of
				https://github.com/thelsing/knx.git
				synced 2025-10-26 10:26:25 +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
 | 
			
		||||
    "recommendations": [
 | 
			
		||||
        "platformio.platformio-ide"
 | 
			
		||||
    ],
 | 
			
		||||
    "unwantedRecommendations": [
 | 
			
		||||
        "ms-vscode.cpptools-extension-pack"
 | 
			
		||||
    ]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -495,7 +495,7 @@ void CC1310Platform::init()
 | 
			
		||||
    setupNVS();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t* CC1310Platform::getEepromBuffer(uint16_t size)
 | 
			
		||||
uint8_t* CC1310Platform::getEepromBuffer(uint32_t size)
 | 
			
		||||
{
 | 
			
		||||
    if(size > KNX_FLASH_SIZE)
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
@ -20,7 +20,7 @@ class CC1310Platform : public Platform
 | 
			
		||||
    void restart() final;
 | 
			
		||||
    void fatalError() final;
 | 
			
		||||
 | 
			
		||||
    uint8_t* getEepromBuffer(uint16_t size) final;
 | 
			
		||||
    uint8_t* getEepromBuffer(uint32_t size) final;
 | 
			
		||||
    void commitToEeprom() final;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -108,7 +108,7 @@ bool Esp32Platform::sendBytesUniCast(uint32_t addr, uint16_t port, uint8_t* buff
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t * Esp32Platform::getEepromBuffer(uint16_t size)
 | 
			
		||||
uint8_t * Esp32Platform::getEepromBuffer(uint32_t size)
 | 
			
		||||
{
 | 
			
		||||
    uint8_t * eepromptr = EEPROM.getDataPtr();
 | 
			
		||||
    if(eepromptr == nullptr) {
 | 
			
		||||
 | 
			
		||||
@ -32,7 +32,7 @@ public:
 | 
			
		||||
    bool sendBytesUniCast(uint32_t addr, uint16_t port, uint8_t* buffer, uint16_t len) override;
 | 
			
		||||
 | 
			
		||||
    //memory
 | 
			
		||||
    uint8_t* getEepromBuffer(uint16_t size);
 | 
			
		||||
    uint8_t* getEepromBuffer(uint32_t size);
 | 
			
		||||
    void commitToEeprom();
 | 
			
		||||
private:
 | 
			
		||||
    WiFiUDP _udp;
 | 
			
		||||
 | 
			
		||||
@ -108,7 +108,7 @@ bool EspPlatform::sendBytesUniCast(uint32_t addr, uint16_t port, uint8_t* buffer
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t * EspPlatform::getEepromBuffer(uint16_t size)
 | 
			
		||||
uint8_t * EspPlatform::getEepromBuffer(uint32_t size)
 | 
			
		||||
{
 | 
			
		||||
    uint8_t * eepromptr = EEPROM.getDataPtr();
 | 
			
		||||
    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;
 | 
			
		||||
    
 | 
			
		||||
    //memory
 | 
			
		||||
    uint8_t* getEepromBuffer(uint16_t size);
 | 
			
		||||
    uint8_t* getEepromBuffer(uint32_t size);
 | 
			
		||||
    void commitToEeprom();
 | 
			
		||||
private:
 | 
			
		||||
    WiFiUDP _udp;
 | 
			
		||||
 | 
			
		||||
@ -128,7 +128,7 @@ void Platform::flashErase(uint16_t eraseBlockNum)
 | 
			
		||||
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;
 | 
			
		||||
}
 | 
			
		||||
@ -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)
 | 
			
		||||
{
 | 
			
		||||
    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
 | 
			
		||||
    // --- 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();
 | 
			
		||||
    // -------------------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
@ -70,6 +70,7 @@ class Platform
 | 
			
		||||
    virtual void commitNonVolatileMemory();
 | 
			
		||||
    // 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 value, size_t repeat);
 | 
			
		||||
 | 
			
		||||
    NvMemoryType NonVolatileMemoryType();
 | 
			
		||||
    void NonVolatileMemoryType(NvMemoryType type);
 | 
			
		||||
 | 
			
		||||
@ -265,7 +265,7 @@ int LinuxPlatform::readBytesMultiCast(uint8_t* buffer, uint16_t maxLen)
 | 
			
		||||
    return len;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t* LinuxPlatform::getEepromBuffer(uint16_t size)
 | 
			
		||||
uint8_t* LinuxPlatform::getEepromBuffer(uint32_t size)
 | 
			
		||||
{
 | 
			
		||||
    if (_fd < 0)
 | 
			
		||||
        doMemoryMapping();
 | 
			
		||||
 | 
			
		||||
@ -55,7 +55,7 @@ public:
 | 
			
		||||
    int readWriteSpi (uint8_t *data, size_t len) override;
 | 
			
		||||
 | 
			
		||||
    //memory
 | 
			
		||||
    uint8_t* getEepromBuffer(uint16_t size) override;
 | 
			
		||||
    uint8_t* getEepromBuffer(uint32_t size) override;
 | 
			
		||||
    void commitToEeprom() override;
 | 
			
		||||
    void cmdlineArgs(int argc, char** argv);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -109,7 +109,7 @@ void RP2040ArduinoPlatform::restart()
 | 
			
		||||
 | 
			
		||||
#ifdef USE_RP2040_LARGE_EEPROM_EMULATION
 | 
			
		||||
 | 
			
		||||
uint8_t * RP2040ArduinoPlatform::getEepromBuffer(uint16_t size)
 | 
			
		||||
uint8_t * RP2040ArduinoPlatform::getEepromBuffer(uint32_t size)
 | 
			
		||||
{
 | 
			
		||||
    if(size%4096)
 | 
			
		||||
    {
 | 
			
		||||
@ -144,7 +144,7 @@ void RP2040ArduinoPlatform::commitToEeprom()
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
uint8_t * RP2040ArduinoPlatform::getEepromBuffer(uint16_t size)
 | 
			
		||||
uint8_t * RP2040ArduinoPlatform::getEepromBuffer(uint32_t size)
 | 
			
		||||
{
 | 
			
		||||
    if(size > 4096)
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
@ -30,7 +30,7 @@ public:
 | 
			
		||||
    void restart();
 | 
			
		||||
 | 
			
		||||
    #ifdef USE_RP2040_EEPROM_EMULATION
 | 
			
		||||
    uint8_t* getEepromBuffer(uint16_t size);
 | 
			
		||||
    uint8_t* getEepromBuffer(uint32_t size);
 | 
			
		||||
    void commitToEeprom();
 | 
			
		||||
 | 
			
		||||
    #ifdef USE_RP2040_LARGE_EEPROM_EMULATION
 | 
			
		||||
 | 
			
		||||
@ -61,7 +61,7 @@ void SamdPlatform::restart()
 | 
			
		||||
 | 
			
		||||
#ifdef USE_SAMD_EEPROM_EMULATION
 | 
			
		||||
#pragma warning "Using EEPROM Simulation"
 | 
			
		||||
uint8_t* SamdPlatform::getEepromBuffer(uint16_t size)
 | 
			
		||||
uint8_t* SamdPlatform::getEepromBuffer(uint32_t size)
 | 
			
		||||
{
 | 
			
		||||
    //EEPROM.begin(size);
 | 
			
		||||
    if(size > EEPROM_EMULATION_SIZE)
 | 
			
		||||
 | 
			
		||||
@ -17,7 +17,7 @@ public:
 | 
			
		||||
 | 
			
		||||
    void restart();
 | 
			
		||||
#ifdef USE_SAMD_EEPROM_EMULATION
 | 
			
		||||
    uint8_t* getEepromBuffer(uint16_t size);
 | 
			
		||||
    uint8_t* getEepromBuffer(uint32_t size);
 | 
			
		||||
    void commitToEeprom();
 | 
			
		||||
#else
 | 
			
		||||
    // size of one EraseBlock in pages
 | 
			
		||||
 | 
			
		||||
@ -34,7 +34,7 @@ void Stm32Platform::restart()
 | 
			
		||||
    NVIC_SystemReset();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t * Stm32Platform::getEepromBuffer(uint16_t size)
 | 
			
		||||
uint8_t * Stm32Platform::getEepromBuffer(uint32_t size)
 | 
			
		||||
{
 | 
			
		||||
    // check if the buffer already exists
 | 
			
		||||
    if (_eepromPtr == nullptr) // we need to initialize the buffer first
 | 
			
		||||
 | 
			
		||||
@ -15,7 +15,7 @@ public:
 | 
			
		||||
    void restart();
 | 
			
		||||
    
 | 
			
		||||
    //memory
 | 
			
		||||
    uint8_t* getEepromBuffer(uint16_t size);
 | 
			
		||||
    uint8_t* getEepromBuffer(uint32_t size);
 | 
			
		||||
    void commitToEeprom();
 | 
			
		||||
private:
 | 
			
		||||
    uint8_t *_eepromPtr = nullptr;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user