From ee67ea6e0ac43b76a1baacdd525c7115d5fb2a40 Mon Sep 17 00:00:00 2001 From: ahalekelly <7078138+ahalekelly@users.noreply.github.com> Date: Wed, 11 Nov 2026 21:50:52 -0800 Subject: [PATCH] Prevent SX1262 AGC lockup on all boards --- src/helpers/radiolib/CustomSX1262.h | 16 +++++++++------- src/helpers/radiolib/CustomSX1262Wrapper.h | 6 +++++- src/helpers/radiolib/SX126xReset.h | 6 ------ variants/ebyte_eora_s3/target.cpp | 2 ++ variants/heltec_rc32/platformio.ini | 1 - variants/heltec_tracker_v2/platformio.ini | 1 - variants/heltec_v4/platformio.ini | 1 - variants/heltec_v4_r8/platformio.ini | 1 - variants/rak3401/platformio.ini | 1 - 9 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/helpers/radiolib/CustomSX1262.h b/src/helpers/radiolib/CustomSX1262.h index b4ee6c97aa2..0ffe7e99395 100644 --- a/src/helpers/radiolib/CustomSX1262.h +++ b/src/helpers/radiolib/CustomSX1262.h @@ -87,19 +87,21 @@ class CustomSX1262 : public SX1262 { setRfSwitchPins(SX126X_RXEN, SX126X_TXEN); #endif - // for improved RX with Heltec v4 - #ifdef SX126X_REGISTER_PATCH - uint8_t r_data = 0; - readRegister(0x8B5, &r_data, 1); - r_data |= 0x01; - writeRegister(0x8B5, &r_data, 1); - #endif + applyAgcLockupFix(); MESH_DEBUG_PRINTLN("SX1262 status=0x%02X device_errors=0x%04X", getStatus(), getDeviceErrors()); return true; // success } + // Prevent AGC lockup under strong off-channel interference. + void applyAgcLockupFix() { + uint8_t r_data = 0; + readRegister(0x8B5, &r_data, 1); + r_data |= 0x01; + writeRegister(0x8B5, &r_data, 1); + } + int16_t startReceive() override { // include the PREAMBLE_DETECTED irq bit in reported flags return SX1262::startReceive(RADIOLIB_SX126X_RX_TIMEOUT_INF, RADIOLIB_IRQ_RX_DEFAULT_FLAGS | (1UL << RADIOLIB_IRQ_PREAMBLE_DETECTED), RADIOLIB_IRQ_RX_DEFAULT_MASK, 0); diff --git a/src/helpers/radiolib/CustomSX1262Wrapper.h b/src/helpers/radiolib/CustomSX1262Wrapper.h index cf393200818..70d0178ac60 100644 --- a/src/helpers/radiolib/CustomSX1262Wrapper.h +++ b/src/helpers/radiolib/CustomSX1262Wrapper.h @@ -54,5 +54,9 @@ class CustomSX1262Wrapper : public RadioLibWrapper { return ((CustomSX1262 *)_radio)->getRxBoostedGainMode(); } - void doResetAGC() override { sx126xResetAGC((SX126x *)_radio, getRxBoostedGainMode()); } + void doResetAGC() override { + auto radio = (CustomSX1262 *)_radio; + sx126xResetAGC(radio, getRxBoostedGainMode()); + radio->applyAgcLockupFix(); + } }; diff --git a/src/helpers/radiolib/SX126xReset.h b/src/helpers/radiolib/SX126xReset.h index bce84191cc0..93d4da56b87 100644 --- a/src/helpers/radiolib/SX126xReset.h +++ b/src/helpers/radiolib/SX126xReset.h @@ -27,10 +27,4 @@ inline void sx126xResetAGC(SX126x* radio, bool rx_boost_gain) { #endif // always reapply: the gain may have been changed at runtime even when no build default is set radio->setRxBoostedGainMode(rx_boost_gain); -#ifdef SX126X_REGISTER_PATCH - uint8_t r_data = 0; - radio->readRegister(0x8B5, &r_data, 1); - r_data |= 0x01; - radio->writeRegister(0x8B5, &r_data, 1); -#endif } diff --git a/variants/ebyte_eora_s3/target.cpp b/variants/ebyte_eora_s3/target.cpp index 91d851ff3e2..dd27cf01e91 100644 --- a/variants/ebyte_eora_s3/target.cpp +++ b/variants/ebyte_eora_s3/target.cpp @@ -61,6 +61,8 @@ bool radio_init() { radio.setRxBoostedGainMode(SX126X_RX_BOOSTED_GAIN); #endif + radio.applyAgcLockupFix(); + return true; // success } diff --git a/variants/heltec_rc32/platformio.ini b/variants/heltec_rc32/platformio.ini index 2f07c021b18..a63f54ffa6a 100644 --- a/variants/heltec_rc32/platformio.ini +++ b/variants/heltec_rc32/platformio.ini @@ -55,7 +55,6 @@ build_flags = -D SX126X_DIO3_TCXO_VOLTAGE=1.8 -D SX126X_CURRENT_LIMIT=140 -D SX126X_RX_BOOSTED_GAIN=1 - -D SX126X_REGISTER_PATCH=1 ; Patch register 0x8B5 for improved RX build_src_filter = ${esp32_base.build_src_filter} +<../variants/heltec_rc32> + diff --git a/variants/heltec_tracker_v2/platformio.ini b/variants/heltec_tracker_v2/platformio.ini index 5fd9edabe7a..2d6efa6dc4f 100644 --- a/variants/heltec_tracker_v2/platformio.ini +++ b/variants/heltec_tracker_v2/platformio.ini @@ -27,7 +27,6 @@ build_flags = -D SX126X_DIO3_TCXO_VOLTAGE=1.8 -D SX126X_CURRENT_LIMIT=140 -D SX126X_RX_BOOSTED_GAIN=1 - -D SX126X_REGISTER_PATCH=1 -D PIN_BOARD_SDA=6 -D PIN_BOARD_SCL=17 -D PIN_USER_BTN=0 diff --git a/variants/heltec_v4/platformio.ini b/variants/heltec_v4/platformio.ini index 69ac9ad89c4..d6a4fec353d 100644 --- a/variants/heltec_v4/platformio.ini +++ b/variants/heltec_v4/platformio.ini @@ -28,7 +28,6 @@ build_flags = -D PIN_VEXT_EN_ACTIVE=HIGH -D LORA_TX_POWER=10 ;If it is configured as 10 here, the final output will be 22 dbm. -D MAX_LORA_TX_POWER=22 ; Max SX1262 output - -D SX126X_REGISTER_PATCH=1 ; Patch register 0x8B5 for improved RX -D SX126X_DIO2_AS_RF_SWITCH=true ; GC1109 CTX is controlled by SX1262 DIO2 -D SX126X_DIO3_TCXO_VOLTAGE=1.8 -D SX126X_CURRENT_LIMIT=140 diff --git a/variants/heltec_v4_r8/platformio.ini b/variants/heltec_v4_r8/platformio.ini index e22ca8f5418..f565676eb12 100644 --- a/variants/heltec_v4_r8/platformio.ini +++ b/variants/heltec_v4_r8/platformio.ini @@ -28,7 +28,6 @@ build_flags = -D PIN_VBAT_READ=1 -D LORA_TX_POWER=10 -D MAX_LORA_TX_POWER=22 - -D SX126X_REGISTER_PATCH=1 -D SX126X_DIO2_AS_RF_SWITCH=true -D SX126X_DIO3_TCXO_VOLTAGE=1.8 -D SX126X_CURRENT_LIMIT=140 diff --git a/variants/rak3401/platformio.ini b/variants/rak3401/platformio.ini index d157e4b1d3f..41f488034ed 100644 --- a/variants/rak3401/platformio.ini +++ b/variants/rak3401/platformio.ini @@ -12,7 +12,6 @@ build_flags = ${nrf52_base.build_flags} -D LORA_TX_POWER=22 -D SX126X_CURRENT_LIMIT=140 -D SX126X_RX_BOOSTED_GAIN=1 - -D SX126X_REGISTER_PATCH=1 ; Patch register 0x8B5 for improved RX with SKY66122 FEM build_src_filter = ${nrf52_base.build_src_filter} +<../variants/rak3401> +