From 6c3d67b2342d023f44ec668004c6998bb66cbd9c Mon Sep 17 00:00:00 2001 From: "C.S.M" Date: Fri, 7 Mar 2025 14:55:11 +0800 Subject: [PATCH] fix(spi_flash): Add suspend check on esp32c6 and esp32h2 for some reason --- components/spi_flash/Kconfig | 11 +++++++++++ components/spi_flash/esp_flash_api.c | 16 ++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/components/spi_flash/Kconfig b/components/spi_flash/Kconfig index edf2076826..7ea89c70fe 100644 --- a/components/spi_flash/Kconfig +++ b/components/spi_flash/Kconfig @@ -120,6 +120,17 @@ menu "Main Flash configuration" For new users, DO NOT enable this config. + config SPI_FLASH_FORCE_ENABLE_C6_H2_SUSPEND + bool "Enable chip suspend feature on c6 or h2 anyway (DO NOT ENABLE FOR NEW USERS OR APPLICATIONS)" + default n + help + Flash suspend has defect on ESP32C6 until v0.2 and ESP32H2 until v1.2. If you already use suspend + feature for massive protection, you can enable this for bypassing check after knowing the risk. + But if you are new users, or developing new applications, or producing a new batch, + please DO NOT enable this config option. + + For more information, please refer to errata or connect to Espressif business support team. + config SPI_FLASH_SOFTWARE_RESUME bool "Resume flash program/erase form suspend state by software control" default n diff --git a/components/spi_flash/esp_flash_api.c b/components/spi_flash/esp_flash_api.c index d5c3105f53..bb7084f7fe 100644 --- a/components/spi_flash/esp_flash_api.c +++ b/components/spi_flash/esp_flash_api.c @@ -22,6 +22,8 @@ #include "esp_private/esp_clk.h" #include "esp_spi_flash_counters.h" #include "esp_check.h" +#include "hal/efuse_hal.h" +#include "soc/chip_revision.h" #if CONFIG_IDF_TARGET_ESP32S2 #include "esp_crypto_lock.h" // for locking flash encryption peripheral @@ -1439,6 +1441,20 @@ restore_cache: //init suspend mode cmd, uses internal. esp_err_t esp_flash_suspend_cmd_init(esp_flash_t* chip) { +#if !CONFIG_SPI_FLASH_FORCE_ENABLE_C6_H2_SUSPEND +#if CONFIG_IDF_TARGET_ESP32H2 + if (!ESP_CHIP_REV_ABOVE(efuse_hal_chip_revision(), 102)) { + ESP_LOGE(TAG, "ESP32H2 chips lower than v1.2 are not recommended to suspend the Flash"); + return ESP_ERR_NOT_SUPPORTED; + } +#endif +#if CONFIG_IDF_TARGET_ESP32C6 + if (!ESP_CHIP_REV_ABOVE(efuse_hal_chip_revision(), 2)) { + ESP_LOGE(TAG, "ESP32C6 chips lower than v0.2 are not recommended to suspend the Flash"); + return ESP_ERR_NOT_SUPPORTED; + } +#endif +#endif ESP_EARLY_LOGW(TAG, "Flash suspend feature is enabled"); if (chip->chip_drv->get_chip_caps == NULL) { // chip caps get failed, pass the flash capability check.