From 6b8e8f3e8dd6dcab1ee3f1042b4705845b2b9253 Mon Sep 17 00:00:00 2001 From: Rasmus Date: Sat, 12 Sep 2026 15:52:12 +0200 Subject: [PATCH] fix(ota): bypass 64KB flash block erase, increase WDT timeouts, and place encoder table in DRAM --- main/encoder.c | 6 +++++- main/ota_manager.c | 7 +++++++ main/rfid_manager.c | 14 ++++++++++++++ main/rfid_manager.h | 5 +++++ sdkconfig.defaults | 10 +++++++++- 5 files changed, 40 insertions(+), 2 deletions(-) diff --git a/main/encoder.c b/main/encoder.c index 4671775..b7b617f 100644 --- a/main/encoder.c +++ b/main/encoder.c @@ -11,6 +11,7 @@ #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_log.h" +#include "esp_attr.h" #include "driver/gpio.h" #include "hw_pins.h" #include "encoder.h" @@ -41,8 +42,11 @@ static volatile int8_t s_steps_per_detent = 4; /* 4 = full-step, 2 = half-step * * * All bounces (e.g. 11 <-> 01) cancel out: +1 + (-1) = 0. * Invalid diagonal skips (00 <-> 11, 01 <-> 10): 0. + * + * Placed in DRAM_ATTR so reading it during flash erase (when cache is disabled) + * does not trigger a Cache Disabled DoubleException. */ -static const int8_t s_quad_table[16] = { +static const DRAM_ATTR int8_t s_quad_table[16] = { [0] = 0, [1] = -1, // 00 -> 01 (CCW) [2] = 1, // 00 -> 10 (CW) diff --git a/main/ota_manager.c b/main/ota_manager.c index 8baf123..95b9941 100644 --- a/main/ota_manager.c +++ b/main/ota_manager.c @@ -23,6 +23,7 @@ #include "nvs.h" #include "cJSON.h" #include "wifi_manager.h" +#include "rfid_manager.h" #include "ota_manager.h" static const char *TAG = "ota"; @@ -488,6 +489,7 @@ static void ota_download_task(void *arg) set_state(OTA_STATUS_DOWNLOADING, "Starting download..."); ESP_LOGI(TAG, "Starting HTTPS OTA from: %s", s_release.download_url); + rfid_manager_pause(true); esp_http_client_config_t http_cfg = { .url = s_release.download_url, @@ -506,6 +508,7 @@ static void ota_download_task(void *arg) esp_https_ota_handle_t ota_handle = NULL; esp_err_t err = esp_https_ota_begin(&ota_cfg, &ota_handle); if (err != ESP_OK || ota_handle == NULL) { + rfid_manager_pause(false); wifi_manager_release_net_lock(); ESP_LOGE(TAG, "esp_https_ota_begin failed: %s", esp_err_to_name(err)); set_state(OTA_STATUS_FAILED, "Failed to connect to image"); @@ -521,6 +524,7 @@ static void ota_download_task(void *arg) if (memcmp(new_app_info.app_elf_sha256, running->app_elf_sha256, sizeof(new_app_info.app_elf_sha256)) == 0) { ESP_LOGW(TAG, "Incoming image has identical ELF SHA-256 as running app - aborting flash write"); esp_https_ota_abort(ota_handle); + rfid_manager_pause(false); wifi_manager_release_net_lock(); set_state(OTA_STATUS_UP_TO_DATE, "Firmware is already up to date"); s_ota_task_handle = NULL; @@ -533,6 +537,7 @@ static void ota_download_task(void *arg) if (s_cancel_requested) { ESP_LOGW(TAG, "OTA canceled by user"); esp_https_ota_abort(ota_handle); + rfid_manager_pause(false); wifi_manager_release_net_lock(); set_state(OTA_STATUS_IDLE, "Update canceled"); s_ota_task_handle = NULL; @@ -553,6 +558,8 @@ static void ota_download_task(void *arg) vTaskDelay(pdMS_TO_TICKS(10)); } + rfid_manager_pause(false); + if (err == ESP_OK) { if (esp_https_ota_is_complete_data_received(ota_handle)) { esp_err_t finish_err = esp_https_ota_finish(ota_handle); diff --git a/main/rfid_manager.c b/main/rfid_manager.c index 51036ee..fba6a98 100644 --- a/main/rfid_manager.c +++ b/main/rfid_manager.c @@ -195,4 +195,18 @@ bool rfid_manager_has_pending_card(void) void rfid_manager_consume_card(void) { s_pending_card = false; +} + +void rfid_manager_pause(bool pause) +{ + TaskHandle_t task = xTaskGetHandle(RC522_TASK_NAME); + if (task != NULL) { + if (pause) { + vTaskSuspend(task); + ESP_LOGI(TAG, "RFID polling suspended"); + } else { + vTaskResume(task); + ESP_LOGI(TAG, "RFID polling resumed"); + } + } } \ No newline at end of file diff --git a/main/rfid_manager.h b/main/rfid_manager.h index 26a5872..9de2d7d 100644 --- a/main/rfid_manager.h +++ b/main/rfid_manager.h @@ -44,6 +44,11 @@ bool rfid_manager_has_pending_card(void); */ void rfid_manager_consume_card(void); +/** + * @brief Pause or resume RFID polling task (e.g. during OTA flash write). + */ +void rfid_manager_pause(bool pause); + #ifdef __cplusplus } #endif \ No newline at end of file diff --git a/sdkconfig.defaults b/sdkconfig.defaults index 14705c6..955d120 100644 --- a/sdkconfig.defaults +++ b/sdkconfig.defaults @@ -27,8 +27,16 @@ CONFIG_JD_SZBUF=512 CONFIG_JD_FORMAT_RGB565=y CONFIG_JD_FASTDECODE_32BIT=y -# Flash Chip Driver Optimization +# Flash Chip Driver Optimization (Boya & Winbond) CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=y +CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE=y +CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y +CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20 +CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=2 + +# Watchdog Timeouts for Flash Erase & OTA Operations +CONFIG_ESP_INT_WDT_TIMEOUT_MS=1000 +CONFIG_ESP_TASK_WDT_TIMEOUT_S=15 # mbedTLS Dynamic Buffers & Memory Optimization (Vital for ESP32 without PSRAM) CONFIG_MBEDTLS_DYNAMIC_BUFFER=y