diff --git a/variants/heltec_v4/LoRaFEMControl.cpp b/variants/heltec_v4/LoRaFEMControl.cpp index c5953b77..d369186c 100644 --- a/variants/heltec_v4/LoRaFEMControl.cpp +++ b/variants/heltec_v4/LoRaFEMControl.cpp @@ -5,35 +5,39 @@ void LoRaFEMControl::init(void) { - setLnaCanControl(false);// Default is uncontrollable + // Power on FEM LDO — set registers before releasing RTC hold for + // atomic transition (no glitch on deep sleep wake). + pinMode(P_LORA_PA_POWER, OUTPUT); + digitalWrite(P_LORA_PA_POWER, HIGH); 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 + esp_reset_reason_t reason = esp_reset_reason(); + if (reason != ESP_RST_DEEPSLEEP) { + delay(1); // FEM startup time after cold power-on + } + + // Auto-detect FEM type via shared GPIO2 default pull level. + // GC1109 CSD: internal pull-down → reads LOW + // KCT8103L CSD: internal pull-up → reads HIGH + rtc_gpio_hold_dis((gpio_num_t)P_LORA_KCT8103L_PA_CSD); + pinMode(P_LORA_KCT8103L_PA_CSD, INPUT); delay(1); if(digitalRead(P_LORA_KCT8103L_PA_CSD)==HIGH) { - // FEM is KCT8103L + // FEM is KCT8103L (V4.3) fem_type= KCT8103L_PA; pinMode(P_LORA_KCT8103L_PA_CSD, OUTPUT); digitalWrite(P_LORA_KCT8103L_PA_CSD, HIGH); + rtc_gpio_hold_dis((gpio_num_t)P_LORA_KCT8103L_PA_CTX); pinMode(P_LORA_KCT8103L_PA_CTX, OUTPUT); - digitalWrite(P_LORA_KCT8103L_PA_CTX, HIGH); + digitalWrite(P_LORA_KCT8103L_PA_CTX, lna_enabled ? LOW : HIGH); setLnaCanControl(true); - } else if(digitalRead(P_LORA_KCT8103L_PA_CSD)==LOW) { - // FEM is GC1109 + } else { + // FEM is GC1109 (V4.2) 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; } }