|
|
|
@ -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); |
|
|
|
} |
|
|
|
|