@@ -6,65 +6,52 @@ void HeltecTrackerV2Board::begin() {
66 pinMode (PIN_ADC_CTRL, OUTPUT);
77 digitalWrite (PIN_ADC_CTRL, LOW); // Initially inactive
88
9- // ---- GC1109 RF FRONT END CONFIGURATION ----
10- // The Heltec Tracker V2 uses a GC1109 FEM chip with integrated PA and LNA
11- // RF path: SX1262 -> GC1109 PA -> Pi attenuator -> Antenna
12- // Measured net TX gain (non-linear due to PA compression):
13- // +11dB at 0-15dBm input (e.g., 10dBm in -> 21dBm out)
14- // +10dB at 16-17dBm input
15- // +9dB at 18-19dBm input
16- // +7dB at 21dBm input (e.g., 21dBm in -> 28dBm out max)
17- // Control logic (from GC1109 datasheet):
18- // Shutdown: CSD=0, CTX=X, CPS=X
19- // Receive LNA: CSD=1, CTX=0, CPS=X (17dB gain, 2dB NF)
20- // Transmit bypass: CSD=1, CTX=1, CPS=0 (~1dB loss, no PA)
21- // Transmit PA: CSD=1, CTX=1, CPS=1 (full PA enabled)
22- // Pin mapping:
23- // CTX (pin 6) -> SX1262 DIO2: TX/RX path select (automatic via SX126X_DIO2_AS_RF_SWITCH)
24- // CSD (pin 4) -> GPIO4: Chip enable (HIGH=on, LOW=shutdown)
25- // CPS (pin 5) -> GPIO46: PA mode select (HIGH=full PA, LOW=bypass)
26- // VCC0/VCC1 -> Vfem via LDO, controlled by GPIO7
27-
28- // VFEM_Ctrl (GPIO7): Power enable for GC1109 LDO
29- rtc_gpio_hold_dis ((gpio_num_t )P_LORA_PA_POWER);
30- pinMode (P_LORA_PA_POWER, OUTPUT);
31- digitalWrite (P_LORA_PA_POWER, HIGH);
32-
33- // CSD (GPIO4): Chip enable - must be HIGH to enable GC1109
34- rtc_gpio_hold_dis ((gpio_num_t )P_LORA_PA_EN);
35- pinMode (P_LORA_PA_EN, OUTPUT);
36- digitalWrite (P_LORA_PA_EN, HIGH);
37-
38- // CPS (GPIO46): PA mode - LOW for RX (don't care), HIGH during TX for full PA
39- // Note: GPIO46 is NOT an RTC GPIO, so no rtc_gpio_hold_dis needed
40- pinMode (P_LORA_PA_TX_EN, OUTPUT);
41- digitalWrite (P_LORA_PA_TX_EN, LOW); // Start in RX-ready state
42- // -------------------------------------------
43-
44- periph_power.begin ();
45-
9+ // Check if waking from deep sleep
4610 esp_reset_reason_t reason = esp_reset_reason ();
4711 if (reason == ESP_RST_DEEPSLEEP) {
4812 long wakeup_source = esp_sleep_get_ext1_wakeup_status ();
4913 if (wakeup_source & (1 << P_LORA_DIO_1)) { // received a LoRa packet (while in deep sleep)
5014 startup_reason = BD_STARTUP_RX_PACKET;
5115 }
5216
17+ // Release RTC holds - pins retain their state, no need to reconfigure
5318 rtc_gpio_hold_dis ((gpio_num_t )P_LORA_NSS);
19+ rtc_gpio_hold_dis ((gpio_num_t )P_LORA_PA_POWER);
20+ rtc_gpio_hold_dis ((gpio_num_t )P_LORA_PA_EN);
5421 rtc_gpio_deinit ((gpio_num_t )P_LORA_DIO_1);
22+ } else {
23+ // Cold boot: Configure GC1109 FEM pins
24+ // Control logic (from GC1109 datasheet):
25+ // Receive LNA: CSD=1, CTX=0, CPS=X (17dB gain, 2dB NF)
26+ // Transmit PA: CSD=1, CTX=1, CPS=1 (full PA enabled)
27+ // Pin mapping: CTX->DIO2 (auto), CSD->GPIO4, CPS->GPIO46, VFEM->GPIO7
28+
29+ // VFEM_Ctrl (GPIO7): Power enable for GC1109 LDO
30+ pinMode (P_LORA_PA_POWER, OUTPUT);
31+ digitalWrite (P_LORA_PA_POWER, HIGH);
32+
33+ // CSD (GPIO4): Chip enable - must be HIGH for GC1109 to work
34+ pinMode (P_LORA_PA_EN, OUTPUT);
35+ digitalWrite (P_LORA_PA_EN, HIGH);
5536 }
37+
38+ periph_power.begin ();
39+
40+ // Note: GPIO46 (CPS) is a strapping pin - do NOT configure it here.
41+ // TX handlers are fully responsible for GPIO46 (see onBeforeTransmit/onAfterTransmit)
5642 }
5743
5844 void HeltecTrackerV2Board::onBeforeTransmit (void ) {
59- digitalWrite (P_LORA_TX_LED, HIGH); // Turn TX LED on
60- digitalWrite (P_LORA_PA_TX_EN, HIGH); // CPS=1: Enable full PA mode (+30dBm)
61- // CTX (TX/RX path) handled by SX1262 DIO2 -> GC1109 CTX (hardware)
45+ // GPIO46 is a strapping pin - only drive it when actively transmitting
46+ pinMode (P_LORA_PA_TX_EN, OUTPUT);
47+ digitalWrite (P_LORA_PA_TX_EN, HIGH); // CPS=1: Enable full PA mode
48+ digitalWrite (P_LORA_TX_LED, HIGH);
6249 }
6350
6451 void HeltecTrackerV2Board::onAfterTransmit (void ) {
65- digitalWrite (P_LORA_PA_TX_EN, LOW); // CPS=0: Back to RX mode (CPS=X for RX)
66- digitalWrite (P_LORA_TX_LED, LOW ); // Turn TX LED off
67- // CTX (TX/RX path) handled by SX1262 DIO2 -> GC1109 CTX (hardware)
52+ digitalWrite (P_LORA_PA_TX_EN, LOW);
53+ pinMode (P_LORA_PA_TX_EN, INPUT ); // Release strapping pin
54+ digitalWrite (P_LORA_TX_LED, LOW);
6855 }
6956
7057 void HeltecTrackerV2Board::enterDeepSleep (uint32_t secs, int pin_wake_btn) {
0 commit comments