From ef9bf0260d2f1c0c8454d6e850b9067362551106 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=8D=8E=E4=BE=A8?= Date: Tue, 26 Aug 2025 00:54:22 +0800 Subject: [PATCH 1/3] efuse: add Kconfig option to allow VDD_SPI_AS_GPIO write --- components/efuse/Kconfig | 16 ++++++++++++++++ .../efuse/esp32c3/include/esp_efuse_table.h | 1 + .../efuse/esp32c5/include/esp_efuse_table.h | 1 + .../efuse/esp32c6/include/esp_efuse_table.h | 1 + .../efuse/esp32c61/include/esp_efuse_table.h | 1 + .../efuse/esp32h2/include/esp_efuse_table.h | 1 + .../efuse/esp32h21/include/esp_efuse_table.h | 1 + components/efuse/src/esp_efuse_api.c | 12 ++++++++++++ 8 files changed, 34 insertions(+) diff --git a/components/efuse/Kconfig b/components/efuse/Kconfig index 2e54a2443b28..06df88704070 100644 --- a/components/efuse/Kconfig +++ b/components/efuse/Kconfig @@ -70,4 +70,20 @@ menu "eFuse Bit Manager" default 128 if EFUSE_CODE_SCHEME_COMPAT_REPEAT default 256 if !IDF_TARGET_ESP32 + config ESP_EFUSE_VDD_SPI_AS_GPIO_ALLOWED + bool "[DANGER] Allow Writing to ESP_EFUSE_VDD_SPI_AS_GPIO" + default n + depends on IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32C6 || IDF_TARGET_ESP32C5 || IDF_TARGET_ESP32C61 || IDF_TARGET_ESP32H2 || IDF_TARGET_ESP32H21 + help + Allows writing to the VDD_SPI_AS_GPIO efuse field. + + WARNING: This is an irreversible operation! Once written, it cannot be undone. + + CRITICAL: If you use Embedded Flash, it will immediately stop working and can never be recovered. + This flag changes the VDD_SPI pin to function as a GPIO, which will permanently disable power to the Embedded Flash. + + Ensure that you fully understand the implications of setting this flag. + + If unsure, say N. + endmenu diff --git a/components/efuse/esp32c3/include/esp_efuse_table.h b/components/efuse/esp32c3/include/esp_efuse_table.h index 660556d354b3..cc9cf2ed8d1a 100644 --- a/components/efuse/esp32c3/include/esp_efuse_table.h +++ b/components/efuse/esp32c3/include/esp_efuse_table.h @@ -156,6 +156,7 @@ extern const esp_efuse_desc_t* ESP_EFUSE_DIS_PAD_JTAG[]; extern const esp_efuse_desc_t* ESP_EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT[]; extern const esp_efuse_desc_t* ESP_EFUSE_USB_EXCHG_PINS[]; extern const esp_efuse_desc_t* ESP_EFUSE_VDD_SPI_AS_GPIO[]; +#define ESP_EFUSE_VDD_SPI_AS_GPIO_DESC ESP_EFUSE_VDD_SPI_AS_GPIO extern const esp_efuse_desc_t* ESP_EFUSE_WDT_DELAY_SEL[]; extern const esp_efuse_desc_t* ESP_EFUSE_SPI_BOOT_CRYPT_CNT[]; extern const esp_efuse_desc_t* ESP_EFUSE_SECURE_BOOT_KEY_REVOKE0[]; diff --git a/components/efuse/esp32c5/include/esp_efuse_table.h b/components/efuse/esp32c5/include/esp_efuse_table.h index b7369560473d..2e8280ff17e9 100644 --- a/components/efuse/esp32c5/include/esp_efuse_table.h +++ b/components/efuse/esp32c5/include/esp_efuse_table.h @@ -168,6 +168,7 @@ extern const esp_efuse_desc_t* ESP_EFUSE_DIS_PAD_JTAG[]; extern const esp_efuse_desc_t* ESP_EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT[]; extern const esp_efuse_desc_t* ESP_EFUSE_USB_EXCHG_PINS[]; extern const esp_efuse_desc_t* ESP_EFUSE_VDD_SPI_AS_GPIO[]; +#define ESP_EFUSE_VDD_SPI_AS_GPIO_DESC ESP_EFUSE_VDD_SPI_AS_GPIO extern const esp_efuse_desc_t* ESP_EFUSE_WDT_DELAY_SEL[]; extern const esp_efuse_desc_t* ESP_EFUSE_BOOTLOADER_ANTI_ROLLBACK_SECURE_VERSION_LO[]; extern const esp_efuse_desc_t* ESP_EFUSE_KM_DISABLE_DEPLOY_MODE[]; diff --git a/components/efuse/esp32c6/include/esp_efuse_table.h b/components/efuse/esp32c6/include/esp_efuse_table.h index c0dec3c99b8c..f80308ea6497 100644 --- a/components/efuse/esp32c6/include/esp_efuse_table.h +++ b/components/efuse/esp32c6/include/esp_efuse_table.h @@ -156,6 +156,7 @@ extern const esp_efuse_desc_t* ESP_EFUSE_DIS_PAD_JTAG[]; extern const esp_efuse_desc_t* ESP_EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT[]; extern const esp_efuse_desc_t* ESP_EFUSE_USB_EXCHG_PINS[]; extern const esp_efuse_desc_t* ESP_EFUSE_VDD_SPI_AS_GPIO[]; +#define ESP_EFUSE_VDD_SPI_AS_GPIO_DESC ESP_EFUSE_VDD_SPI_AS_GPIO extern const esp_efuse_desc_t* ESP_EFUSE_WDT_DELAY_SEL[]; extern const esp_efuse_desc_t* ESP_EFUSE_SPI_BOOT_CRYPT_CNT[]; extern const esp_efuse_desc_t* ESP_EFUSE_SECURE_BOOT_KEY_REVOKE0[]; diff --git a/components/efuse/esp32c61/include/esp_efuse_table.h b/components/efuse/esp32c61/include/esp_efuse_table.h index 81b5a77bef48..990ed68fb27e 100644 --- a/components/efuse/esp32c61/include/esp_efuse_table.h +++ b/components/efuse/esp32c61/include/esp_efuse_table.h @@ -145,6 +145,7 @@ extern const esp_efuse_desc_t* ESP_EFUSE_DIS_PAD_JTAG[]; extern const esp_efuse_desc_t* ESP_EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT[]; extern const esp_efuse_desc_t* ESP_EFUSE_USB_EXCHG_PINS[]; extern const esp_efuse_desc_t* ESP_EFUSE_VDD_SPI_AS_GPIO[]; +#define ESP_EFUSE_VDD_SPI_AS_GPIO_DESC ESP_EFUSE_VDD_SPI_AS_GPIO extern const esp_efuse_desc_t* ESP_EFUSE_WDT_DELAY_SEL[]; extern const esp_efuse_desc_t* ESP_EFUSE_SPI_BOOT_CRYPT_CNT[]; extern const esp_efuse_desc_t* ESP_EFUSE_SECURE_BOOT_KEY_REVOKE0[]; diff --git a/components/efuse/esp32h2/include/esp_efuse_table.h b/components/efuse/esp32h2/include/esp_efuse_table.h index ee6d55a945a1..35602c3c9fc9 100644 --- a/components/efuse/esp32h2/include/esp_efuse_table.h +++ b/components/efuse/esp32h2/include/esp_efuse_table.h @@ -158,6 +158,7 @@ extern const esp_efuse_desc_t* ESP_EFUSE_DIS_PAD_JTAG[]; extern const esp_efuse_desc_t* ESP_EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT[]; extern const esp_efuse_desc_t* ESP_EFUSE_USB_EXCHG_PINS[]; extern const esp_efuse_desc_t* ESP_EFUSE_VDD_SPI_AS_GPIO[]; +#define ESP_EFUSE_VDD_SPI_AS_GPIO_DESC ESP_EFUSE_VDD_SPI_AS_GPIO extern const esp_efuse_desc_t* ESP_EFUSE_ECDSA_CURVE_MODE[]; extern const esp_efuse_desc_t* ESP_EFUSE_ECC_FORCE_CONST_TIME[]; extern const esp_efuse_desc_t* ESP_EFUSE_XTS_DPA_PSEUDO_LEVEL[]; diff --git a/components/efuse/esp32h21/include/esp_efuse_table.h b/components/efuse/esp32h21/include/esp_efuse_table.h index fcbaf9acf3fe..ed4a2521ca78 100644 --- a/components/efuse/esp32h21/include/esp_efuse_table.h +++ b/components/efuse/esp32h21/include/esp_efuse_table.h @@ -156,6 +156,7 @@ extern const esp_efuse_desc_t* ESP_EFUSE_USB_DREFH[]; extern const esp_efuse_desc_t* ESP_EFUSE_USB_DREFL[]; extern const esp_efuse_desc_t* ESP_EFUSE_USB_EXCHG_PINS[]; extern const esp_efuse_desc_t* ESP_EFUSE_VDD_SPI_AS_GPIO[]; +#define ESP_EFUSE_VDD_SPI_AS_GPIO_DESC ESP_EFUSE_VDD_SPI_AS_GPIO extern const esp_efuse_desc_t* ESP_EFUSE_ECDSA_CURVE_MODE[]; extern const esp_efuse_desc_t* ESP_EFUSE_ECC_FORCE_CONST_TIME[]; extern const esp_efuse_desc_t* ESP_EFUSE_XTS_DPA_PSEUDO_LEVEL[]; diff --git a/components/efuse/src/esp_efuse_api.c b/components/efuse/src/esp_efuse_api.c index 853a36e42982..9980a90763d9 100644 --- a/components/efuse/src/esp_efuse_api.c +++ b/components/efuse/src/esp_efuse_api.c @@ -145,6 +145,18 @@ esp_err_t esp_efuse_write_field_bit(const esp_efuse_desc_t* field[]) uint8_t existing = 0; const uint8_t one = 1; + #if defined(ESP_EFUSE_VDD_SPI_AS_GPIO_DESC) && !defined(CONFIG_ESP_EFUSE_VDD_SPI_AS_GPIO_ALLOWED) + if (field == ESP_EFUSE_VDD_SPI_AS_GPIO) { + ESP_LOGE(TAG, "Writing to VDD_SPI_AS_GPIO is not allowed."); + ESP_LOGW(TAG, "[DANGER] Enable CONFIG_ESP_EFUSE_VDD_SPI_AS_GPIO_ALLOWED in menuconfig."); + ESP_LOGW(TAG, "WARNING: This is an irreversible operation! Once written, it cannot be undone."); + ESP_LOGW(TAG, "CRITICAL: If you use Embedded Flash, it will immediately stop working and can never be recovered."); + ESP_LOGW(TAG, "This flag changes the VDD_SPI pin to function as a GPIO, which will permanently disable power to the Embedded Flash."); + ESP_LOGW(TAG, "Ensure that you fully understand the implications of setting this flag."); + return ESP_ERR_NOT_SUPPORTED; + } + #endif + if (field == NULL || field[0]->bit_count != 1) { return ESP_ERR_INVALID_ARG; } From d75356456e51cd2a5f517dd64d90f8c5dc262f82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=8D=8E=E4=BE=A8?= Date: Tue, 26 Aug 2025 21:59:15 +0800 Subject: [PATCH 2/3] revert: restore autogenerated files (esp_efuse_table.h) --- components/efuse/esp32c3/include/esp_efuse_table.h | 1 - components/efuse/esp32c5/include/esp_efuse_table.h | 1 - components/efuse/esp32c6/include/esp_efuse_table.h | 1 - components/efuse/esp32c61/include/esp_efuse_table.h | 1 - components/efuse/esp32h2/include/esp_efuse_table.h | 1 - components/efuse/esp32h21/include/esp_efuse_table.h | 1 - 6 files changed, 6 deletions(-) diff --git a/components/efuse/esp32c3/include/esp_efuse_table.h b/components/efuse/esp32c3/include/esp_efuse_table.h index cc9cf2ed8d1a..660556d354b3 100644 --- a/components/efuse/esp32c3/include/esp_efuse_table.h +++ b/components/efuse/esp32c3/include/esp_efuse_table.h @@ -156,7 +156,6 @@ extern const esp_efuse_desc_t* ESP_EFUSE_DIS_PAD_JTAG[]; extern const esp_efuse_desc_t* ESP_EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT[]; extern const esp_efuse_desc_t* ESP_EFUSE_USB_EXCHG_PINS[]; extern const esp_efuse_desc_t* ESP_EFUSE_VDD_SPI_AS_GPIO[]; -#define ESP_EFUSE_VDD_SPI_AS_GPIO_DESC ESP_EFUSE_VDD_SPI_AS_GPIO extern const esp_efuse_desc_t* ESP_EFUSE_WDT_DELAY_SEL[]; extern const esp_efuse_desc_t* ESP_EFUSE_SPI_BOOT_CRYPT_CNT[]; extern const esp_efuse_desc_t* ESP_EFUSE_SECURE_BOOT_KEY_REVOKE0[]; diff --git a/components/efuse/esp32c5/include/esp_efuse_table.h b/components/efuse/esp32c5/include/esp_efuse_table.h index 2e8280ff17e9..b7369560473d 100644 --- a/components/efuse/esp32c5/include/esp_efuse_table.h +++ b/components/efuse/esp32c5/include/esp_efuse_table.h @@ -168,7 +168,6 @@ extern const esp_efuse_desc_t* ESP_EFUSE_DIS_PAD_JTAG[]; extern const esp_efuse_desc_t* ESP_EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT[]; extern const esp_efuse_desc_t* ESP_EFUSE_USB_EXCHG_PINS[]; extern const esp_efuse_desc_t* ESP_EFUSE_VDD_SPI_AS_GPIO[]; -#define ESP_EFUSE_VDD_SPI_AS_GPIO_DESC ESP_EFUSE_VDD_SPI_AS_GPIO extern const esp_efuse_desc_t* ESP_EFUSE_WDT_DELAY_SEL[]; extern const esp_efuse_desc_t* ESP_EFUSE_BOOTLOADER_ANTI_ROLLBACK_SECURE_VERSION_LO[]; extern const esp_efuse_desc_t* ESP_EFUSE_KM_DISABLE_DEPLOY_MODE[]; diff --git a/components/efuse/esp32c6/include/esp_efuse_table.h b/components/efuse/esp32c6/include/esp_efuse_table.h index f80308ea6497..c0dec3c99b8c 100644 --- a/components/efuse/esp32c6/include/esp_efuse_table.h +++ b/components/efuse/esp32c6/include/esp_efuse_table.h @@ -156,7 +156,6 @@ extern const esp_efuse_desc_t* ESP_EFUSE_DIS_PAD_JTAG[]; extern const esp_efuse_desc_t* ESP_EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT[]; extern const esp_efuse_desc_t* ESP_EFUSE_USB_EXCHG_PINS[]; extern const esp_efuse_desc_t* ESP_EFUSE_VDD_SPI_AS_GPIO[]; -#define ESP_EFUSE_VDD_SPI_AS_GPIO_DESC ESP_EFUSE_VDD_SPI_AS_GPIO extern const esp_efuse_desc_t* ESP_EFUSE_WDT_DELAY_SEL[]; extern const esp_efuse_desc_t* ESP_EFUSE_SPI_BOOT_CRYPT_CNT[]; extern const esp_efuse_desc_t* ESP_EFUSE_SECURE_BOOT_KEY_REVOKE0[]; diff --git a/components/efuse/esp32c61/include/esp_efuse_table.h b/components/efuse/esp32c61/include/esp_efuse_table.h index 990ed68fb27e..81b5a77bef48 100644 --- a/components/efuse/esp32c61/include/esp_efuse_table.h +++ b/components/efuse/esp32c61/include/esp_efuse_table.h @@ -145,7 +145,6 @@ extern const esp_efuse_desc_t* ESP_EFUSE_DIS_PAD_JTAG[]; extern const esp_efuse_desc_t* ESP_EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT[]; extern const esp_efuse_desc_t* ESP_EFUSE_USB_EXCHG_PINS[]; extern const esp_efuse_desc_t* ESP_EFUSE_VDD_SPI_AS_GPIO[]; -#define ESP_EFUSE_VDD_SPI_AS_GPIO_DESC ESP_EFUSE_VDD_SPI_AS_GPIO extern const esp_efuse_desc_t* ESP_EFUSE_WDT_DELAY_SEL[]; extern const esp_efuse_desc_t* ESP_EFUSE_SPI_BOOT_CRYPT_CNT[]; extern const esp_efuse_desc_t* ESP_EFUSE_SECURE_BOOT_KEY_REVOKE0[]; diff --git a/components/efuse/esp32h2/include/esp_efuse_table.h b/components/efuse/esp32h2/include/esp_efuse_table.h index 35602c3c9fc9..ee6d55a945a1 100644 --- a/components/efuse/esp32h2/include/esp_efuse_table.h +++ b/components/efuse/esp32h2/include/esp_efuse_table.h @@ -158,7 +158,6 @@ extern const esp_efuse_desc_t* ESP_EFUSE_DIS_PAD_JTAG[]; extern const esp_efuse_desc_t* ESP_EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT[]; extern const esp_efuse_desc_t* ESP_EFUSE_USB_EXCHG_PINS[]; extern const esp_efuse_desc_t* ESP_EFUSE_VDD_SPI_AS_GPIO[]; -#define ESP_EFUSE_VDD_SPI_AS_GPIO_DESC ESP_EFUSE_VDD_SPI_AS_GPIO extern const esp_efuse_desc_t* ESP_EFUSE_ECDSA_CURVE_MODE[]; extern const esp_efuse_desc_t* ESP_EFUSE_ECC_FORCE_CONST_TIME[]; extern const esp_efuse_desc_t* ESP_EFUSE_XTS_DPA_PSEUDO_LEVEL[]; diff --git a/components/efuse/esp32h21/include/esp_efuse_table.h b/components/efuse/esp32h21/include/esp_efuse_table.h index ed4a2521ca78..fcbaf9acf3fe 100644 --- a/components/efuse/esp32h21/include/esp_efuse_table.h +++ b/components/efuse/esp32h21/include/esp_efuse_table.h @@ -156,7 +156,6 @@ extern const esp_efuse_desc_t* ESP_EFUSE_USB_DREFH[]; extern const esp_efuse_desc_t* ESP_EFUSE_USB_DREFL[]; extern const esp_efuse_desc_t* ESP_EFUSE_USB_EXCHG_PINS[]; extern const esp_efuse_desc_t* ESP_EFUSE_VDD_SPI_AS_GPIO[]; -#define ESP_EFUSE_VDD_SPI_AS_GPIO_DESC ESP_EFUSE_VDD_SPI_AS_GPIO extern const esp_efuse_desc_t* ESP_EFUSE_ECDSA_CURVE_MODE[]; extern const esp_efuse_desc_t* ESP_EFUSE_ECC_FORCE_CONST_TIME[]; extern const esp_efuse_desc_t* ESP_EFUSE_XTS_DPA_PSEUDO_LEVEL[]; From aa7ff0066d9bc10651395c9b64a3bcfa7fa51137 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=8D=8E=E4=BE=A8?= Date: Tue, 26 Aug 2025 22:04:04 +0800 Subject: [PATCH 3/3] efuse: add choice for VDD_SPI_AS_GPIO with explicit allow/not_allow options --- components/efuse/Kconfig | 11 ++++++++--- components/efuse/src/esp_efuse_api.c | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/components/efuse/Kconfig b/components/efuse/Kconfig index 06df88704070..c92fd9541031 100644 --- a/components/efuse/Kconfig +++ b/components/efuse/Kconfig @@ -70,9 +70,9 @@ menu "eFuse Bit Manager" default 128 if EFUSE_CODE_SCHEME_COMPAT_REPEAT default 256 if !IDF_TARGET_ESP32 - config ESP_EFUSE_VDD_SPI_AS_GPIO_ALLOWED + choice ESP_EFUSE_VDD_SPI_AS_GPIO_DANGEROUS_WRITE bool "[DANGER] Allow Writing to ESP_EFUSE_VDD_SPI_AS_GPIO" - default n + default ESP_EFUSE_VDD_SPI_AS_GPIO_DANGEROUS_WRITE_NOT_ALLOWED depends on IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32C6 || IDF_TARGET_ESP32C5 || IDF_TARGET_ESP32C61 || IDF_TARGET_ESP32H2 || IDF_TARGET_ESP32H21 help Allows writing to the VDD_SPI_AS_GPIO efuse field. @@ -84,6 +84,11 @@ menu "eFuse Bit Manager" Ensure that you fully understand the implications of setting this flag. - If unsure, say N. + If unsure, choice 'Not allowed'. + config ESP_EFUSE_VDD_SPI_AS_GPIO_DANGEROUS_WRITE_NOT_ALLOWED + bool "Not allowed" + config ESP_EFUSE_VDD_SPI_AS_GPIO_DANGEROUS_WRITE_ALLOWED + bool "Allowed" + endchoice endmenu diff --git a/components/efuse/src/esp_efuse_api.c b/components/efuse/src/esp_efuse_api.c index 9980a90763d9..922dbad71cf0 100644 --- a/components/efuse/src/esp_efuse_api.c +++ b/components/efuse/src/esp_efuse_api.c @@ -145,7 +145,7 @@ esp_err_t esp_efuse_write_field_bit(const esp_efuse_desc_t* field[]) uint8_t existing = 0; const uint8_t one = 1; - #if defined(ESP_EFUSE_VDD_SPI_AS_GPIO_DESC) && !defined(CONFIG_ESP_EFUSE_VDD_SPI_AS_GPIO_ALLOWED) + #if defined(ESP_EFUSE_VDD_SPI_AS_GPIO_DANGEROUS_WRITE_NOT_ALLOWED) if (field == ESP_EFUSE_VDD_SPI_AS_GPIO) { ESP_LOGE(TAG, "Writing to VDD_SPI_AS_GPIO is not allowed."); ESP_LOGW(TAG, "[DANGER] Enable CONFIG_ESP_EFUSE_VDD_SPI_AS_GPIO_ALLOWED in menuconfig.");