From f02c95163807d5ce90427015b6d37b9bb6b5ed36 Mon Sep 17 00:00:00 2001 From: Gunnar Skjold Date: Thu, 27 Feb 2025 14:27:39 +0100 Subject: [PATCH] Fix: #926 - Historical data lost when upgrading ESP8266 between 2.4.x versions --- .../include/AmsFirmwareUpdater.h | 3 ++ .../src/AmsFirmwareUpdater.cpp | 50 +++++++++++-------- lib/SvelteUi/src/AmsWebServer.cpp | 7 ++- platformio.ini | 2 +- 4 files changed, 37 insertions(+), 25 deletions(-) diff --git a/lib/AmsFirmwareUpdater/include/AmsFirmwareUpdater.h b/lib/AmsFirmwareUpdater/include/AmsFirmwareUpdater.h index 6c8849e9..5b4c8e90 100644 --- a/lib/AmsFirmwareUpdater/include/AmsFirmwareUpdater.h +++ b/lib/AmsFirmwareUpdater/include/AmsFirmwareUpdater.h @@ -17,6 +17,9 @@ #define AMS_PARTITION_MIN_SPIFFS_SIZE 0x20000 #elif defined(ESP8266) #include + + #define AMS_FLASH_SKETCH_SIZE 0xFEFF0 + #define AMS_FLASH_OTA_START AMS_FLASH_OTA_SIZE #endif #if defined(AMS_REMOTE_DEBUG) diff --git a/lib/AmsFirmwareUpdater/src/AmsFirmwareUpdater.cpp b/lib/AmsFirmwareUpdater/src/AmsFirmwareUpdater.cpp index e4e6393a..2e979bf6 100644 --- a/lib/AmsFirmwareUpdater/src/AmsFirmwareUpdater.cpp +++ b/lib/AmsFirmwareUpdater/src/AmsFirmwareUpdater.cpp @@ -1128,7 +1128,7 @@ bool AmsFirmwareUpdater::moveLittleFsFromApp1ToNew() { } #elif defined(ESP8266) uintptr_t AmsFirmwareUpdater::getFirmwareUpdateStart() { - return FS_start - 0x40200000; + return (AMS_FLASH_SKETCH_SIZE + FLASH_SECTOR_SIZE - 1) & (~(FLASH_SECTOR_SIZE - 1)); } bool AmsFirmwareUpdater::isFlashReadyForNextUpdateVersion(uint32_t size) { @@ -1137,6 +1137,14 @@ bool AmsFirmwareUpdater::isFlashReadyForNextUpdateVersion(uint32_t size) { #endif debugger->printf_P(PSTR("Checking if we can upgrade\n")); + if(FS_PHYS_ADDR < (getFirmwareUpdateStart() + AMS_FLASH_SKETCH_SIZE)) { + #if defined(AMS_REMOTE_DEBUG) + if (debugger->isActive(RemoteDebug::ERROR)) + #endif + debugger->printf_P(PSTR("No room for OTA update\n")); + return false; + } + if(!ESP.checkFlashConfig(false)) { #if defined(AMS_REMOTE_DEBUG) if (debugger->isActive(RemoteDebug::ERROR)) @@ -1145,24 +1153,12 @@ bool AmsFirmwareUpdater::isFlashReadyForNextUpdateVersion(uint32_t size) { return false; } - //size of current sketch rounded to a sector - size_t currentSketchSize = (ESP.getSketchSize() + FLASH_SECTOR_SIZE - 1) & (~(FLASH_SECTOR_SIZE - 1)); - - //size of the update rounded to a sector - size_t roundedSize = (size + FLASH_SECTOR_SIZE - 1) & (~(FLASH_SECTOR_SIZE - 1)); - - //address of the end of the space available for sketch and update - uintptr_t updateEndAddress = FS_start - 0x40200000; - - uintptr_t updateStartAddress = (updateEndAddress > roundedSize) ? (updateEndAddress - roundedSize) : 0; - - //make sure that the size of both sketches is less than the total space (updateEndAddress) - if(updateStartAddress < currentSketchSize) { + if(size > AMS_FLASH_SKETCH_SIZE) { #if defined(AMS_REMOTE_DEBUG) if (debugger->isActive(RemoteDebug::ERROR)) #endif debugger->printf_P(PSTR("New firmware does not fit flash\n")); - return false; + return false; } #if defined(AMS_REMOTE_DEBUG) if (debugger->isActive(RemoteDebug::INFO)) @@ -1180,14 +1176,28 @@ bool AmsFirmwareUpdater::writeBufferToFlash() { uint32_t offset = updateStatus.block_position * UPDATE_BUF_SIZE; uintptr_t currentAddress = getFirmwareUpdateStart() + offset; uint32_t sector = currentAddress/FLASH_SECTOR_SIZE; - if(!ESP.flashEraseSector(sector)) { + + if (currentAddress % FLASH_SECTOR_SIZE == 0) { #if defined(AMS_REMOTE_DEBUG) - if (debugger->isActive(RemoteDebug::ERROR)) + if (debugger->isActive(RemoteDebug::DEBUG)) #endif - debugger->printf_P(PSTR("flashEraseSector(%lu) failed\n"), sector); - updateStatus.errorCode = AMS_UPDATE_ERR_ERASE; - return false; + debugger->printf_P(PSTR("flashEraseSector(%lu)\n"), sector); + yield(); + if(!ESP.flashEraseSector(sector)) { + #if defined(AMS_REMOTE_DEBUG) + if (debugger->isActive(RemoteDebug::ERROR)) + #endif + debugger->printf_P(PSTR("flashEraseSector(%lu) failed\n"), sector); + updateStatus.errorCode = AMS_UPDATE_ERR_ERASE; + return false; + } } + + #if defined(AMS_REMOTE_DEBUG) + if (debugger->isActive(RemoteDebug::DEBUG)) + #endif + debugger->printf_P(PSTR("flashWrite(%lu)\n"), sector); + yield(); if(!ESP.flashWrite(currentAddress, buf, UPDATE_BUF_SIZE)) { #if defined(AMS_REMOTE_DEBUG) if (debugger->isActive(RemoteDebug::ERROR)) diff --git a/lib/SvelteUi/src/AmsWebServer.cpp b/lib/SvelteUi/src/AmsWebServer.cpp index 7e83bd6f..fbd9a3e1 100644 --- a/lib/SvelteUi/src/AmsWebServer.cpp +++ b/lib/SvelteUi/src/AmsWebServer.cpp @@ -89,9 +89,9 @@ void AmsWebServer::setup(AmsConfiguration* config, GpioConfig* gpioConfig, AmsDa context = ""; } else { #if defined(AMS_REMOTE_DEBUG) -if (debugger->isActive(RemoteDebug::INFO)) -#endif -debugger->printf_P(PSTR("Using context path: '%s'\n"), context.c_str()); + if (debugger->isActive(RemoteDebug::INFO)) + #endif + debugger->printf_P(PSTR("Using context path: '%s'\n"), context.c_str()); } } @@ -814,7 +814,6 @@ void AmsWebServer::indexHtml() { } void AmsWebServer::indexCss() { - if(!checkSecurity(2)) return; diff --git a/platformio.ini b/platformio.ini index 7424bb2f..fb0497a4 100755 --- a/platformio.ini +++ b/platformio.ini @@ -22,7 +22,7 @@ build_flags = lib_deps = WiFi, Ethernet, ESPmDNS, WiFiClientSecure, HTTPClient, FS, WebServer, ESP32 Async UDP, ESP32SSDP, mulmer89/ESPRandom@1.5.0, ${common.lib_deps}, CloudConnector, SvelteUi [env:esp8266] -platform = espressif8266@4.2.0 +platform = espressif8266@4.2.1 framework = arduino board = esp12e board_build.ldscript = eagle.flash.4m2m.ld