Browse Source

Fix sleep

Wessel Nieboer 5 tháng trước cách đây
mục cha
commit
14f066bed0
1 tập tin đã thay đổi với 23 bổ sung19 xóa
  1. 23 19
      variants/heltec_v4/LoRaFEMControl.cpp

+ 23 - 19
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;
     }
 }
 
@@ -71,9 +75,9 @@ void LoRaFEMControl::setRxModeEnable(void)
     } else if(fem_type==KCT8103L_PA) {
         digitalWrite(P_LORA_KCT8103L_PA_CSD, HIGH);
         if(lna_enabled) {
-            digitalWrite(P_LORA_KCT8103L_PA_CTX, LOW);
+            digitalWrite(P_LORA_KCT8103L_PA_CTX, LOW);   // LNA on
         } else {
-            digitalWrite(P_LORA_KCT8103L_PA_CTX, HIGH);
+            digitalWrite(P_LORA_KCT8103L_PA_CTX, HIGH);  // LNA bypass
         }
     }
 }
@@ -90,9 +94,9 @@ void LoRaFEMControl::setRxModeEnableWhenMCUSleep(void)
         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);
+            digitalWrite(P_LORA_KCT8103L_PA_CTX, LOW);   // LNA on
         } else {
-            digitalWrite(P_LORA_KCT8103L_PA_CTX, HIGH);
+            digitalWrite(P_LORA_KCT8103L_PA_CTX, HIGH);  // LNA bypass
         }
         rtc_gpio_hold_en((gpio_num_t)P_LORA_KCT8103L_PA_CTX);
     }