diff --git a/arch/esp32/esp32.ini b/arch/esp32/esp32.ini
index 7e55f0934..f3eb0cbc0 100644
--- a/arch/esp32/esp32.ini
+++ b/arch/esp32/esp32.ini
@@ -1,6 +1,7 @@
; Common settings for ESP targes, mixin with extends = esp32_base
[esp32_base]
extends = arduino_base
+custom_esp32_kind = esp32
platform = platformio/espressif32@6.7.0
build_src_filter =
diff --git a/arch/esp32/esp32c3.ini b/arch/esp32/esp32c3.ini
index 619fdb28a..2ba3036d0 100644
--- a/arch/esp32/esp32c3.ini
+++ b/arch/esp32/esp32c3.ini
@@ -1,5 +1,6 @@
[esp32c3_base]
extends = esp32_base
+custom_esp32_kind = esp32c3
monitor_speed = 115200
monitor_filters = esp32_c3_exception_decoder
diff --git a/arch/esp32/esp32s2.ini b/arch/esp32/esp32s2.ini
index df66de2ed..40fdc461a 100644
--- a/arch/esp32/esp32s2.ini
+++ b/arch/esp32/esp32s2.ini
@@ -1,5 +1,6 @@
[esp32s2_base]
extends = esp32_base
+custom_esp32_kind = esp32s2
build_src_filter =
${esp32_base.build_src_filter} - - -
diff --git a/arch/esp32/esp32s3.ini b/arch/esp32/esp32s3.ini
index 6a1bdd3fd..1cd0e2033 100644
--- a/arch/esp32/esp32s3.ini
+++ b/arch/esp32/esp32s3.ini
@@ -1,5 +1,6 @@
[esp32s3_base]
extends = esp32_base
+custom_esp32_kind = esp32s3
monitor_speed = 115200
diff --git a/bin/platformio-custom.py b/bin/platformio-custom.py
index 3382ff891..3202a1e7a 100644
--- a/bin/platformio-custom.py
+++ b/bin/platformio-custom.py
@@ -62,7 +62,21 @@ if platform.name == "espressif32":
import esptool
env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp32_create_combined_bin)
- env.Append(LINKFLAGS=["--specs=nano.specs", "-u", "_printf_float"])
+
+ esp32_kind = env.GetProjectOption("custom_esp32_kind")
+ if esp32_kind == "esp32":
+ # Free up some IRAM by removing auxiliary SPI flash chip drivers.
+ # Wrapped stub symbols are defined in src/platform/esp32/iram-quirk.c.
+ env.Append(
+ LINKFLAGS=[
+ "-Wl,--wrap=esp_flash_chip_gd",
+ "-Wl,--wrap=esp_flash_chip_issi",
+ "-Wl,--wrap=esp_flash_chip_winbond",
+ ]
+ )
+ else:
+ # For newer ESP32 targets, using newlib nano works better.
+ env.Append(LINKFLAGS=["--specs=nano.specs", "-u", "_printf_float"])
Import("projenv")
diff --git a/src/platform/esp32/iram-quirk.c b/src/platform/esp32/iram-quirk.c
new file mode 100644
index 000000000..813842138
--- /dev/null
+++ b/src/platform/esp32/iram-quirk.c
@@ -0,0 +1,23 @@
+// Free up some precious space in the iram0_0_seg memory segment
+
+#include
+
+#include
+#include
+#include
+
+#define IRAM_SECTION section(".iram1.stub")
+
+IRAM_ATTR esp_err_t stub_probe(esp_flash_t *chip, uint32_t flash_id)
+{
+ return ESP_ERR_NOT_FOUND;
+}
+
+const spi_flash_chip_t stub_flash_chip __attribute__((IRAM_SECTION)) = {
+ .name = "stub",
+ .probe = stub_probe,
+};
+
+extern const spi_flash_chip_t __wrap_esp_flash_chip_gd __attribute__((IRAM_SECTION, alias("stub_flash_chip")));
+extern const spi_flash_chip_t __wrap_esp_flash_chip_issi __attribute__((IRAM_SECTION, alias("stub_flash_chip")));
+extern const spi_flash_chip_t __wrap_esp_flash_chip_winbond __attribute__((IRAM_SECTION, alias("stub_flash_chip")));