From 0cc6fdfea69738c2696b3d1abfb0de77110a4919 Mon Sep 17 00:00:00 2001 From: agessaman Date: Thu, 20 Aug 2026 21:48:29 -0700 Subject: [PATCH] Add Heltec V4 R8 FEM LNA controls --- variants/heltec_v4_r8/HeltecV4R8Board.cpp | 18 ++++++++++++++++++ variants/heltec_v4_r8/HeltecV4R8Board.h | 3 +++ variants/heltec_v4_r8/LoRaFEMControl.cpp | 1 + variants/heltec_v4_r8/LoRaFEMControl.h | 6 ++++-- variants/heltec_v4_r8/platformio.ini | 6 +++--- 5 files changed, 29 insertions(+), 5 deletions(-) diff --git a/variants/heltec_v4_r8/HeltecV4R8Board.cpp b/variants/heltec_v4_r8/HeltecV4R8Board.cpp index 1fb123b2f..11aa9f64a 100644 --- a/variants/heltec_v4_r8/HeltecV4R8Board.cpp +++ b/variants/heltec_v4_r8/HeltecV4R8Board.cpp @@ -84,3 +84,21 @@ const char* HeltecV4R8Board::getManufacturerName() const { return "Heltec V4 R8 OLED"; #endif } + +bool HeltecV4R8Board::setLoRaFemLnaEnabled(bool enable) { + if (!loRaFEMControl.isLnaCanControl()) { + return false; + } + + loRaFEMControl.setLNAEnable(enable); + loRaFEMControl.setRxModeEnable(); + return true; +} + +bool HeltecV4R8Board::canControlLoRaFemLna() const { + return loRaFEMControl.isLnaCanControl(); +} + +bool HeltecV4R8Board::isLoRaFemLnaEnabled() const { + return loRaFEMControl.isLNAEnabled(); +} diff --git a/variants/heltec_v4_r8/HeltecV4R8Board.h b/variants/heltec_v4_r8/HeltecV4R8Board.h index 20811abb1..d8617b5b1 100644 --- a/variants/heltec_v4_r8/HeltecV4R8Board.h +++ b/variants/heltec_v4_r8/HeltecV4R8Board.h @@ -25,6 +25,9 @@ public: void onAfterTransmit(void) override; void enterDeepSleep(uint32_t secs, int pin_wake_btn = -1); void powerOff() override; + bool setLoRaFemLnaEnabled(bool enable) override; + bool canControlLoRaFemLna() const override; + bool isLoRaFemLnaEnabled() const override; uint16_t getBattMilliVolts() override; bool setAdcMultiplier(float multiplier) override { if (multiplier == 0.0f) { diff --git a/variants/heltec_v4_r8/LoRaFEMControl.cpp b/variants/heltec_v4_r8/LoRaFEMControl.cpp index bb530de3c..2d0feba64 100644 --- a/variants/heltec_v4_r8/LoRaFEMControl.cpp +++ b/variants/heltec_v4_r8/LoRaFEMControl.cpp @@ -21,6 +21,7 @@ void LoRaFEMControl::init(void) { digitalWrite(P_LORA_KCT8103L_PA_CSD, HIGH); pinMode(P_LORA_KCT8103L_PA_CTX, OUTPUT); digitalWrite(P_LORA_KCT8103L_PA_CTX, lna_enabled ? LOW : HIGH); + setLnaCanControl(true); } void LoRaFEMControl::setSleepModeEnable(void) { diff --git a/variants/heltec_v4_r8/LoRaFEMControl.h b/variants/heltec_v4_r8/LoRaFEMControl.h index 961cfd070..b55e15533 100644 --- a/variants/heltec_v4_r8/LoRaFEMControl.h +++ b/variants/heltec_v4_r8/LoRaFEMControl.h @@ -15,10 +15,12 @@ public: void setRxModeEnable(void); void setRxModeEnableWhenMCUSleep(void); void setLNAEnable(bool enabled); - bool isLnaCanControl(void) { return true; } - void setLnaCanControl(bool can_control) { } + bool isLnaCanControl(void) const { return lna_can_control; } + void setLnaCanControl(bool can_control) { lna_can_control = can_control; } + bool isLNAEnabled(void) const { return lna_enabled; } LoRaFEMType getFEMType(void) const { return KCT8103L_PA; } private: bool lna_enabled = false; + bool lna_can_control = false; }; diff --git a/variants/heltec_v4_r8/platformio.ini b/variants/heltec_v4_r8/platformio.ini index 6f8d5a7f7..70e5f7029 100644 --- a/variants/heltec_v4_r8/platformio.ini +++ b/variants/heltec_v4_r8/platformio.ini @@ -17,9 +17,9 @@ build_flags = -D P_LORA_SCLK=9 -D P_LORA_MISO=11 -D P_LORA_MOSI=10 - -D P_LORA_PA_POWER=7 - -D P_LORA_KCT8103L_PA_CSD=2 - -D P_LORA_KCT8103L_PA_CTX=5 + -D P_LORA_PA_POWER=7 ; VFEM_Ctrl - LDO power enable + -D P_LORA_KCT8103L_PA_CSD=2 ; FEM_EN / CSD (HIGH=on) + -D P_LORA_KCT8103L_PA_CTX=5 ; PA_CTX (LOW=RX LNA, HIGH=RX bypass) -D P_LORA_TX_LED=46 -D PIN_USER_BTN=0 -D PIN_VEXT_EN=40