Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 9 additions & 17 deletions variants/heltec_v4/HeltecV4Board.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,7 @@ void HeltecV4Board::begin() {
pinMode(PIN_ADC_CTRL, OUTPUT);
digitalWrite(PIN_ADC_CTRL, LOW); // Initially inactive

pinMode(P_LORA_PA_POWER, OUTPUT);
digitalWrite(P_LORA_PA_POWER,HIGH);

rtc_gpio_hold_dis((gpio_num_t)P_LORA_PA_EN);
pinMode(P_LORA_PA_EN, OUTPUT);
digitalWrite(P_LORA_PA_EN,HIGH);
pinMode(P_LORA_PA_TX_EN, OUTPUT);
digitalWrite(P_LORA_PA_TX_EN,LOW);

loRaFEMControl.init();

periph_power.begin();

Expand All @@ -33,12 +25,12 @@ void HeltecV4Board::begin() {

void HeltecV4Board::onBeforeTransmit(void) {
digitalWrite(P_LORA_TX_LED, HIGH); // turn TX LED on
digitalWrite(P_LORA_PA_TX_EN,HIGH);
loRaFEMControl.setTxModeEnable();
}

void HeltecV4Board::onAfterTransmit(void) {
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED off
digitalWrite(P_LORA_PA_TX_EN,LOW);
loRaFEMControl.setRxModeEnable();
}

void HeltecV4Board::enterDeepSleep(uint32_t secs, int pin_wake_btn) {
Expand All @@ -50,7 +42,7 @@ void HeltecV4Board::begin() {

rtc_gpio_hold_en((gpio_num_t)P_LORA_NSS);

rtc_gpio_hold_en((gpio_num_t)P_LORA_PA_EN); //It also needs to be enabled in receive mode
loRaFEMControl.setRxModeEnableWhenMCUSleep();//It also needs to be enabled in receive mode

if (pin_wake_btn < 0) {
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet
Expand Down Expand Up @@ -86,9 +78,9 @@ void HeltecV4Board::begin() {
}

const char* HeltecV4Board::getManufacturerName() const {
#ifdef HELTEC_LORA_V4_TFT
return "Heltec V4 TFT";
#else
return "Heltec V4 OLED";
#endif
#ifdef HELTEC_LORA_V4_TFT
return loRaFEMControl.getFEMType() == KCT8103L_PA ? "Heltec V4.3 TFT" : "Heltec V4 TFT";
#else
return loRaFEMControl.getFEMType() == KCT8103L_PA ? "Heltec V4.3 OLED" : "Heltec V4 OLED";
#endif
}
4 changes: 2 additions & 2 deletions variants/heltec_v4/HeltecV4Board.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@
#include <helpers/RefCountedDigitalPin.h>
#include <helpers/ESP32Board.h>
#include <driver/rtc_io.h>

#include "LoRaFEMControl.h"
class HeltecV4Board : public ESP32Board {

public:
RefCountedDigitalPin periph_power;

LoRaFEMControl loRaFEMControl;
HeltecV4Board() : periph_power(PIN_VEXT_EN,PIN_VEXT_EN_ACTIVE) { }

void begin();
Expand Down
104 changes: 104 additions & 0 deletions variants/heltec_v4/LoRaFEMControl.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
#include "LoRaFEMControl.h"
#include <driver/rtc_io.h>
#include <esp_sleep.h>
#include <Arduino.h>

void LoRaFEMControl::init(void)
{
setLnaCanControl(false);// Default is uncontrollable
rtc_gpio_hold_dis((gpio_num_t)P_LORA_PA_POWER);
rtc_gpio_hold_dis((gpio_num_t)P_LORA_GC1109_PA_EN);
rtc_gpio_hold_dis((gpio_num_t)P_LORA_GC1109_PA_TX_EN);
rtc_gpio_hold_dis((gpio_num_t)P_LORA_KCT8103L_PA_CSD);
rtc_gpio_hold_dis((gpio_num_t)P_LORA_KCT8103L_PA_CTX);

pinMode(P_LORA_PA_POWER,OUTPUT);
digitalWrite(P_LORA_PA_POWER,HIGH);
delay(1);
pinMode(P_LORA_KCT8103L_PA_CSD,INPUT); // detect which FEM is used
delay(1);
if(digitalRead(P_LORA_KCT8103L_PA_CSD)==HIGH) {
// FEM is KCT8103L
fem_type= KCT8103L_PA;
pinMode(P_LORA_KCT8103L_PA_CSD, OUTPUT);
digitalWrite(P_LORA_KCT8103L_PA_CSD, HIGH);
pinMode(P_LORA_KCT8103L_PA_CTX, OUTPUT);
digitalWrite(P_LORA_KCT8103L_PA_CTX, HIGH);
setLnaCanControl(true);
} else if(digitalRead(P_LORA_KCT8103L_PA_CSD)==LOW) {
// FEM is GC1109
fem_type= GC1109_PA;
pinMode(P_LORA_GC1109_PA_EN, OUTPUT);
digitalWrite(P_LORA_GC1109_PA_EN, HIGH);
pinMode(P_LORA_GC1109_PA_TX_EN, OUTPUT);
digitalWrite(P_LORA_GC1109_PA_TX_EN, LOW);
} else {
fem_type= OTHER_FEM_TYPES;
}
}

void LoRaFEMControl::setSleepModeEnable(void)
{
if(fem_type==GC1109_PA) {
/*
* Do not switch the power on and off frequently.
* After turning off P_LORA_PA_EN, the power consumption has dropped to the uA level.
*/
digitalWrite(P_LORA_GC1109_PA_EN, LOW);
digitalWrite(P_LORA_GC1109_PA_TX_EN, LOW);
} else if(fem_type==KCT8103L_PA) {
// shutdown the PA
digitalWrite(P_LORA_KCT8103L_PA_CSD, LOW);
}
}

void LoRaFEMControl::setTxModeEnable(void)
{
if(fem_type==GC1109_PA) {
digitalWrite(P_LORA_GC1109_PA_EN, HIGH); // CSD=1: Chip enabled
digitalWrite(P_LORA_GC1109_PA_TX_EN, HIGH); // CPS: 1=full PA, 0=bypass (for RX, CPS is don't care)
} else if(fem_type==KCT8103L_PA) {
digitalWrite(P_LORA_KCT8103L_PA_CSD, HIGH);
digitalWrite(P_LORA_KCT8103L_PA_CTX, HIGH);
}
}

void LoRaFEMControl::setRxModeEnable(void)
{
if(fem_type==GC1109_PA) {
digitalWrite(P_LORA_GC1109_PA_EN, HIGH); // CSD=1: Chip enabled
digitalWrite(P_LORA_GC1109_PA_TX_EN, LOW);
} else if(fem_type==KCT8103L_PA) {
digitalWrite(P_LORA_KCT8103L_PA_CSD, HIGH);
if(lna_enabled) {
digitalWrite(P_LORA_KCT8103L_PA_CTX, LOW);
} else {
digitalWrite(P_LORA_KCT8103L_PA_CTX, HIGH);
}
}
}

void LoRaFEMControl::setRxModeEnableWhenMCUSleep(void)
{
digitalWrite(P_LORA_PA_POWER, HIGH);
rtc_gpio_hold_en((gpio_num_t)P_LORA_PA_POWER);
if(fem_type==GC1109_PA) {
digitalWrite(P_LORA_GC1109_PA_EN, HIGH);
rtc_gpio_hold_en((gpio_num_t)P_LORA_GC1109_PA_EN);
gpio_pulldown_en((gpio_num_t)P_LORA_GC1109_PA_TX_EN);
} else if(fem_type==KCT8103L_PA) {
digitalWrite(P_LORA_KCT8103L_PA_CSD, HIGH);
rtc_gpio_hold_en((gpio_num_t)P_LORA_KCT8103L_PA_CSD);
if(lna_enabled) {
digitalWrite(P_LORA_KCT8103L_PA_CTX, LOW);
} else {
digitalWrite(P_LORA_KCT8103L_PA_CTX, HIGH);
}
rtc_gpio_hold_en((gpio_num_t)P_LORA_KCT8103L_PA_CTX);
}
}

void LoRaFEMControl::setLNAEnable(bool enabled)
{
lna_enabled = enabled;
}
29 changes: 29 additions & 0 deletions variants/heltec_v4/LoRaFEMControl.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#pragma once
#include <stdint.h>

typedef enum {
GC1109_PA,
KCT8103L_PA,
OTHER_FEM_TYPES
} LoRaFEMType;

class LoRaFEMControl
{
public:
LoRaFEMControl(){ }
virtual ~LoRaFEMControl(){ }
void init(void);
void setSleepModeEnable(void);
void setTxModeEnable(void);
void setRxModeEnable(void);
void setRxModeEnableWhenMCUSleep(void);
void setLNAEnable(bool enabled);
bool isLnaCanControl(void) { return lna_can_control; }
void setLnaCanControl(bool can_control) { lna_can_control = can_control; }
LoRaFEMType getFEMType(void) const { return fem_type; }
private:
LoRaFEMType fem_type=OTHER_FEM_TYPES;
bool lna_enabled=false;
bool lna_can_control=false;
};

8 changes: 5 additions & 3 deletions variants/heltec_v4/platformio.ini
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,11 @@ build_flags =
-D P_LORA_SCLK=9
-D P_LORA_MISO=11
-D P_LORA_MOSI=10
-D P_LORA_PA_POWER=7 ; VFEM_Ctrl - Power on GC1109
-D P_LORA_PA_EN=2 ; PA CSD - Enable GC1109
-D P_LORA_PA_TX_EN=46 ; PA CPS - GC1109 TX PA full(High) / bypass(Low)
-D P_LORA_PA_POWER=7 ; // VFEM_Ctrl -LDO power enable
-D P_LORA_GC1109_PA_EN=2 ; // CSD - GC1109 chip enable (HIGH=on)
-D P_LORA_GC1109_PA_TX_EN=46 ;// CPS - GC1109 PA mode (HIGH=full PA, LOW=bypass)
-D P_LORA_KCT8103L_PA_CSD=2
-D P_LORA_KCT8103L_PA_CTX=5
-D PIN_USER_BTN=0
-D PIN_VEXT_EN=36
-D PIN_VEXT_EN_ACTIVE=LOW
Expand Down