From e7277dab05ab54f218365070bd5f774dd3da70b6 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 13 Oct 2026 10:28:06 -1000 Subject: [PATCH] Read the 32 bit bandwidth table directly; aligned flash loads are safe on ESP8266 --- esphome/components/sx126x/sx126x.cpp | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/esphome/components/sx126x/sx126x.cpp b/esphome/components/sx126x/sx126x.cpp index 2db04719c78..53029ad8c0a 100644 --- a/esphome/components/sx126x/sx126x.cpp +++ b/esphome/components/sx126x/sx126x.cpp @@ -6,6 +6,7 @@ namespace esphome::sx126x { ESPHOME_LOG_TAG(TAG, "sx126x"); static const uint16_t RAMP[8] PROGMEM = {10, 20, 40, 80, 200, 800, 1700, 3400}; +// Aligned 32 bit loads from flash are safe on ESP8266, so this table is read directly static const uint32_t BW_HZ[31] PROGMEM = {4800, 5800, 7300, 9700, 11700, 14600, 19500, 23400, 29300, 39000, 46900, 58600, 78200, 93800, 117300, 156200, 187200, 234300, 312000, 373600, 467000, 7810, 10420, 15630, @@ -18,12 +19,6 @@ static const uint8_t BW_FSK[21] PROGMEM = { FSK_BW_23400, FSK_BW_29300, FSK_BW_39000, FSK_BW_46900, FSK_BW_58600, FSK_BW_78200, FSK_BW_93800, FSK_BW_117300, FSK_BW_156200, FSK_BW_187200, FSK_BW_234300, FSK_BW_312000, FSK_BW_373600, FSK_BW_467000}; -static uint32_t bw_hz(uint8_t bandwidth) { - uint32_t hz; - progmem_memcpy(&hz, &BW_HZ[bandwidth], sizeof(hz)); - return hz; -} - static constexpr uint32_t RESET_DELAY_HIGH_US = 5000; static constexpr uint32_t RESET_DELAY_LOW_US = 2000; static constexpr uint32_t SWITCHING_DELAY_US = 1; @@ -223,7 +218,7 @@ void SX126x::configure() { // configure modem if (this->modulation_ == PACKET_TYPE_LORA) { // set modulation params - float duration = 1000.0f * (1UL << this->spreading_factor_) / bw_hz(this->bandwidth_); + float duration = 1000.0f * (1UL << this->spreading_factor_) / BW_HZ[this->bandwidth_]; buf[0] = this->spreading_factor_; buf[1] = progmem_read_byte(&BW_LORA[this->bandwidth_ - SX126X_BW_7810]); buf[2] = this->coding_rate_; @@ -517,7 +512,7 @@ void SX126x::dump_config() { " Payload Length: %" PRIu32 "\n" " CRC Enable: %s\n" " Rx Start: %s", - this->version_, this->frequency_, bw_hz(this->bandwidth_), this->pa_power_, + this->version_, this->frequency_, BW_HZ[this->bandwidth_], this->pa_power_, progmem_read_uint16(&RAMP[this->pa_ramp_]), this->payload_length_, TRUEFALSE(this->crc_enable_), TRUEFALSE(this->rx_start_)); if (this->modulation_ == PACKET_TYPE_GFSK) {