From 897bb4d13ffa6b4fa0e50947981c69dd999f0359 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 3 Sep 2025 22:53:24 -0500 Subject: [PATCH 1/2] [esp8266] Store GPIO initialization arrays in PROGMEM to save RAM --- esphome/components/esp8266/core.cpp | 4 ++-- esphome/components/esp8266/core.h | 5 +++-- esphome/components/esp8266/gpio.py | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/esphome/components/esp8266/core.cpp b/esphome/components/esp8266/core.cpp index 2d3959b031..07659b34c8 100644 --- a/esphome/components/esp8266/core.cpp +++ b/esphome/components/esp8266/core.cpp @@ -58,8 +58,8 @@ extern "C" void resetPins() { // NOLINT #ifdef USE_ESP8266_EARLY_PIN_INIT for (int i = 0; i < 16; i++) { - uint8_t mode = ESPHOME_ESP8266_GPIO_INITIAL_MODE[i]; - uint8_t level = ESPHOME_ESP8266_GPIO_INITIAL_LEVEL[i]; + uint8_t mode = pgm_read_byte(&ESPHOME_ESP8266_GPIO_INITIAL_MODE[i]); + uint8_t level = pgm_read_byte(&ESPHOME_ESP8266_GPIO_INITIAL_LEVEL[i]); if (mode != 255) pinMode(i, mode); // NOLINT if (level != 255) diff --git a/esphome/components/esp8266/core.h b/esphome/components/esp8266/core.h index ac33305669..6daf0fd110 100644 --- a/esphome/components/esp8266/core.h +++ b/esphome/components/esp8266/core.h @@ -3,9 +3,10 @@ #ifdef USE_ESP8266 #include +#include -extern const uint8_t ESPHOME_ESP8266_GPIO_INITIAL_MODE[16]; -extern const uint8_t ESPHOME_ESP8266_GPIO_INITIAL_LEVEL[16]; +extern const uint8_t ESPHOME_ESP8266_GPIO_INITIAL_MODE[16] PROGMEM; +extern const uint8_t ESPHOME_ESP8266_GPIO_INITIAL_LEVEL[16] PROGMEM; namespace esphome { namespace esp8266 {} // namespace esp8266 diff --git a/esphome/components/esp8266/gpio.py b/esphome/components/esp8266/gpio.py index 2bc2291117..e7492fc505 100644 --- a/esphome/components/esp8266/gpio.py +++ b/esphome/components/esp8266/gpio.py @@ -199,11 +199,11 @@ async def add_pin_initial_states_array(): cg.add_global( cg.RawExpression( - f"const uint8_t ESPHOME_ESP8266_GPIO_INITIAL_MODE[16] = {{{initial_modes_s}}}" + f"const uint8_t ESPHOME_ESP8266_GPIO_INITIAL_MODE[16] PROGMEM = {{{initial_modes_s}}}" ) ) cg.add_global( cg.RawExpression( - f"const uint8_t ESPHOME_ESP8266_GPIO_INITIAL_LEVEL[16] = {{{initial_levels_s}}}" + f"const uint8_t ESPHOME_ESP8266_GPIO_INITIAL_LEVEL[16] PROGMEM = {{{initial_levels_s}}}" ) ) From 87f40cf24a866096396da2b967072b0e86a1ded3 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 3 Sep 2025 22:56:15 -0500 Subject: [PATCH 2/2] cleanup --- esphome/components/esp8266/core.cpp | 4 ++-- esphome/components/esp8266/core.h | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/esphome/components/esp8266/core.cpp b/esphome/components/esp8266/core.cpp index 07659b34c8..200ca567c2 100644 --- a/esphome/components/esp8266/core.cpp +++ b/esphome/components/esp8266/core.cpp @@ -58,8 +58,8 @@ extern "C" void resetPins() { // NOLINT #ifdef USE_ESP8266_EARLY_PIN_INIT for (int i = 0; i < 16; i++) { - uint8_t mode = pgm_read_byte(&ESPHOME_ESP8266_GPIO_INITIAL_MODE[i]); - uint8_t level = pgm_read_byte(&ESPHOME_ESP8266_GPIO_INITIAL_LEVEL[i]); + uint8_t mode = progmem_read_byte(&ESPHOME_ESP8266_GPIO_INITIAL_MODE[i]); + uint8_t level = progmem_read_byte(&ESPHOME_ESP8266_GPIO_INITIAL_LEVEL[i]); if (mode != 255) pinMode(i, mode); // NOLINT if (level != 255) diff --git a/esphome/components/esp8266/core.h b/esphome/components/esp8266/core.h index 6daf0fd110..8c9ffd40a4 100644 --- a/esphome/components/esp8266/core.h +++ b/esphome/components/esp8266/core.h @@ -3,7 +3,6 @@ #ifdef USE_ESP8266 #include -#include extern const uint8_t ESPHOME_ESP8266_GPIO_INITIAL_MODE[16] PROGMEM; extern const uint8_t ESPHOME_ESP8266_GPIO_INITIAL_LEVEL[16] PROGMEM;