From 0263b6632c2f0954e3f529070084e3d949173611 Mon Sep 17 00:00:00 2001 From: hank Date: Mon, 5 May 2025 23:03:14 -0700 Subject: [PATCH 1/5] Adding support for TBeam 1.1 --- .vscode/settings.json | 5 + src/helpers/TBeamBoard.h | 17 +-- variants/lilygo_tbeam/target.cpp | 185 +++++++++++++++++++++++++++++++ 3 files changed, 200 insertions(+), 7 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..4a67f19a --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "*.tpp": "cpp" + } +} \ No newline at end of file diff --git a/src/helpers/TBeamBoard.h b/src/helpers/TBeamBoard.h index fc52e712..8eba6933 100644 --- a/src/helpers/TBeamBoard.h +++ b/src/helpers/TBeamBoard.h @@ -7,6 +7,9 @@ // Defined using AXP2102 #define XPOWERS_CHIP_AXP2101 +#define PIN_BOARD_SDA1 42 //SDA for PMU and PFC8563 (RTC) +#define PIN_BOARD_SCL1 41 //SCL for PMU and PFC8563 (RTC) +#define PIN_PMU_IRQ 40 //IRQ pin for PMU // LoRa radio module pins for TBeam #define P_LORA_DIO_0 26 @@ -28,15 +31,13 @@ #include class TBeamBoard : public ESP32Board { - XPowersAXP2101 power; - + XPowersLibInterface *PMU = NULL; public: + bool power_init(); + void printPMU(); + void begin() { ESP32Board::begin(); - - power.setALDO2Voltage(3300); - power.enableALDO2(); - pinMode(38, INPUT_PULLUP); esp_reset_reason_t reason = esp_reset_reason(); @@ -49,6 +50,7 @@ public: rtc_gpio_hold_dis((gpio_num_t)P_LORA_NSS); rtc_gpio_deinit((gpio_num_t)P_LORA_DIO_1); } + power_init(); } void enterDeepSleep(uint32_t secs, int pin_wake_btn = -1) { @@ -75,7 +77,8 @@ public: } uint16_t getBattMilliVolts() override { - return power.getBattVoltage(); + if(PMU) return PMU->getBattVoltage(); + else return 0; } const char* getManufacturerName() const override { diff --git a/variants/lilygo_tbeam/target.cpp b/variants/lilygo_tbeam/target.cpp index 24e4a342..71c12894 100644 --- a/variants/lilygo_tbeam/target.cpp +++ b/variants/lilygo_tbeam/target.cpp @@ -3,6 +3,31 @@ TBeamBoard board; +// Using PMU AXP2102 +#define PMU_WIRE_PORT Wire + +bool pmuIntFlag = false; + +void TBeamBoard::printPMU() +{ + Serial.print("isCharging:"); Serial.println(PMU->isCharging() ? "YES" : "NO"); + Serial.print("isDischarge:"); Serial.println(PMU->isDischarge() ? "YES" : "NO"); + Serial.print("isVbusIn:"); Serial.println(PMU->isVbusIn() ? "YES" : "NO"); + Serial.print("getBattVoltage:"); Serial.print(PMU->getBattVoltage()); Serial.println("mV"); + Serial.print("getVbusVoltage:"); Serial.print(PMU->getVbusVoltage()); Serial.println("mV"); + Serial.print("getSystemVoltage:"); Serial.print(PMU->getSystemVoltage()); Serial.println("mV"); + + // The battery percentage may be inaccurate at first use, the PMU will automatically + // learn the battery curve and will automatically calibrate the battery percentage + // after a charge and discharge cycle + if (PMU->isBatteryConnect()) { + Serial.print("getBatteryPercent:"); Serial.print(PMU->getBatteryPercent()); Serial.println("%"); + } + + Serial.println(); +} + + #if defined(P_LORA_SCLK) static SPIClass spi; RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_0, P_LORA_RESET, P_LORA_DIO_1, spi); @@ -15,10 +40,168 @@ WRAPPER_CLASS radio_driver(radio, board); ESP32RTCClock fallback_clock; AutoDiscoverRTCClock rtc_clock(fallback_clock); +static void setPMUIntFlag(){ + pmuIntFlag = true; +} + #ifndef LORA_CR #define LORA_CR 5 #endif +bool TBeamBoard::power_init() +{ + if (!PMU) + { + PMU = new XPowersAXP2101(PMU_WIRE_PORT); + if (!PMU->init()) + { + Serial.println("Warning: Failed to find AXP2101 power management"); + delete PMU; + PMU = NULL; + } + else + { + Serial.println("AXP2101 PMU init succeeded, using AXP2101 PMU"); + } + } + if (!PMU) + { + PMU = new XPowersAXP192(PMU_WIRE_PORT); + if (!PMU->init()) + { + Serial.println("Warning: Failed to find AXP192 power management"); + delete PMU; + PMU = NULL; + } + else + { + Serial.println("AXP192 PMU init succeeded, using AXP192 PMU"); + } + } + + if (!PMU) + { + return false; + } + + Serial.printf("PMU ID:0x%x\n", PMU->getChipID()); + printPMU(); + if (PMU->getChipModel() == XPOWERS_AXP192) + { + + // lora radio power channel + PMU->setPowerChannelVoltage(XPOWERS_LDO2, 3300); + PMU->enablePowerOutput(XPOWERS_LDO2); + + // oled module power channel, + // disable it will cause abnormal communication between boot and AXP power supply, + // do not turn it off + PMU->setPowerChannelVoltage(XPOWERS_DCDC1, 3300); + // enable oled power + PMU->enablePowerOutput(XPOWERS_DCDC1); + + // gnss module power channel + PMU->setPowerChannelVoltage(XPOWERS_LDO3, 3300); + // power->enablePowerOutput(XPOWERS_LDO3); + + // protected oled power source + PMU->setProtectedChannel(XPOWERS_DCDC1); + // protected esp32 power source + PMU->setProtectedChannel(XPOWERS_DCDC3); + + // disable not use channel + PMU->disablePowerOutput(XPOWERS_DCDC2); + + // disable all axp chip interrupt + PMU->disableIRQ(XPOWERS_AXP192_ALL_IRQ); + + // + /* Set the constant current charging current of AXP192 + opt: + XPOWERS_AXP192_CHG_CUR_100MA, + XPOWERS_AXP192_CHG_CUR_190MA, + XPOWERS_AXP192_CHG_CUR_280MA, + XPOWERS_AXP192_CHG_CUR_360MA, + XPOWERS_AXP192_CHG_CUR_450MA, + XPOWERS_AXP192_CHG_CUR_550MA, + XPOWERS_AXP192_CHG_CUR_630MA, + XPOWERS_AXP192_CHG_CUR_700MA, + XPOWERS_AXP192_CHG_CUR_780MA, + XPOWERS_AXP192_CHG_CUR_880MA, + XPOWERS_AXP192_CHG_CUR_960MA, + XPOWERS_AXP192_CHG_CUR_1000MA, + XPOWERS_AXP192_CHG_CUR_1080MA, + XPOWERS_AXP192_CHG_CUR_1160MA, + XPOWERS_AXP192_CHG_CUR_1240MA, + XPOWERS_AXP192_CHG_CUR_1320MA, + */ + PMU->setChargerConstantCurr(XPOWERS_AXP192_CHG_CUR_550MA); + } + else if (PMU->getChipModel() == XPOWERS_AXP2101) + { + // gnss module power channel + PMU->setPowerChannelVoltage(XPOWERS_ALDO4, 3300); + PMU->enablePowerOutput(XPOWERS_ALDO4); + + // lora radio power channel + PMU->setPowerChannelVoltage(XPOWERS_ALDO3, 3300); + PMU->enablePowerOutput(XPOWERS_ALDO3); + + // m.2 interface + PMU->setPowerChannelVoltage(XPOWERS_DCDC3, 3300); + PMU->enablePowerOutput(XPOWERS_DCDC3); + + // power->setPowerChannelVoltage(XPOWERS_DCDC4, 3300); + // power->enablePowerOutput(XPOWERS_DCDC4); + + // not use channel + PMU->disablePowerOutput(XPOWERS_DCDC2); // not elicited + PMU->disablePowerOutput(XPOWERS_DCDC5); // not elicited + PMU->disablePowerOutput(XPOWERS_DLDO1); // Invalid power channel, it does not exist + PMU->disablePowerOutput(XPOWERS_DLDO2); // Invalid power channel, it does not exist + PMU->disablePowerOutput(XPOWERS_VBACKUP); + + // disable all axp chip interrupt + PMU->disableIRQ(XPOWERS_AXP2101_ALL_IRQ); + + /* Set the constant current charging current of AXP2101 + opt: + XPOWERS_AXP2101_CHG_CUR_100MA, + XPOWERS_AXP2101_CHG_CUR_125MA, + XPOWERS_AXP2101_CHG_CUR_150MA, + XPOWERS_AXP2101_CHG_CUR_175MA, + XPOWERS_AXP2101_CHG_CUR_200MA, + XPOWERS_AXP2101_CHG_CUR_300MA, + XPOWERS_AXP2101_CHG_CUR_400MA, + XPOWERS_AXP2101_CHG_CUR_500MA, + XPOWERS_AXP2101_CHG_CUR_600MA, + XPOWERS_AXP2101_CHG_CUR_700MA, + XPOWERS_AXP2101_CHG_CUR_800MA, + XPOWERS_AXP2101_CHG_CUR_900MA, + XPOWERS_AXP2101_CHG_CUR_1000MA, + */ + PMU->setChargerConstantCurr(XPOWERS_AXP2101_CHG_CUR_500MA); + + // Set up PMU interrupts + Serial.println("Setting up PMU interrupts"); + pinMode(PIN_PMU_IRQ, INPUT_PULLUP); + attachInterrupt(PIN_PMU_IRQ, setPMUIntFlag, FALLING); + + // Reset and re-enable PMU interrupts + Serial.println("Re-enable interrupts"); + PMU->disableIRQ(XPOWERS_AXP2101_ALL_IRQ); + PMU->clearIrqStatus(); + PMU->enableIRQ( + XPOWERS_AXP2101_BAT_INSERT_IRQ | XPOWERS_AXP2101_BAT_REMOVE_IRQ | // Battery interrupts + XPOWERS_AXP2101_VBUS_INSERT_IRQ | XPOWERS_AXP2101_VBUS_REMOVE_IRQ | // VBUS interrupts + XPOWERS_AXP2101_PKEY_SHORT_IRQ | XPOWERS_AXP2101_PKEY_LONG_IRQ | // Power Key interrupts + XPOWERS_AXP2101_BAT_CHG_DONE_IRQ | XPOWERS_AXP2101_BAT_CHG_START_IRQ // Charging interrupts + ); + } + + return true; +} + bool radio_init() { fallback_clock.begin(); rtc_clock.begin(Wire); @@ -33,7 +216,9 @@ bool radio_init() { return false; // fail } + radio.setCRC(1); + return true; // success } From 5e7c9a229f44b5d73b45d33740535984e3173f87 Mon Sep 17 00:00:00 2001 From: hank Date: Mon, 5 May 2025 23:58:21 -0700 Subject: [PATCH 2/5] Cleaning up power code for the TBeam --- variants/lilygo_tbeam/target.cpp | 68 +++++--------------------------- 1 file changed, 10 insertions(+), 58 deletions(-) diff --git a/variants/lilygo_tbeam/target.cpp b/variants/lilygo_tbeam/target.cpp index 71c12894..d5889533 100644 --- a/variants/lilygo_tbeam/target.cpp +++ b/variants/lilygo_tbeam/target.cpp @@ -55,13 +55,13 @@ bool TBeamBoard::power_init() PMU = new XPowersAXP2101(PMU_WIRE_PORT); if (!PMU->init()) { - Serial.println("Warning: Failed to find AXP2101 power management"); + // Serial.println("Warning: Failed to find AXP2101 power management"); delete PMU; PMU = NULL; } else { - Serial.println("AXP2101 PMU init succeeded, using AXP2101 PMU"); + // Serial.println("AXP2101 PMU init succeeded, using AXP2101 PMU"); } } if (!PMU) @@ -69,72 +69,46 @@ bool TBeamBoard::power_init() PMU = new XPowersAXP192(PMU_WIRE_PORT); if (!PMU->init()) { - Serial.println("Warning: Failed to find AXP192 power management"); + // Serial.println("Warning: Failed to find AXP192 power management"); delete PMU; PMU = NULL; } else { - Serial.println("AXP192 PMU init succeeded, using AXP192 PMU"); + // Serial.println("AXP192 PMU init succeeded, using AXP192 PMU"); } } if (!PMU) { + Serial.println("PMU init failed."); return false; } - Serial.printf("PMU ID:0x%x\n", PMU->getChipID()); - printPMU(); + // Serial.printf("PMU ID:0x%x\n", PMU->getChipID()); + // printPMU(); if (PMU->getChipModel() == XPOWERS_AXP192) { - // lora radio power channel PMU->setPowerChannelVoltage(XPOWERS_LDO2, 3300); PMU->enablePowerOutput(XPOWERS_LDO2); - // oled module power channel, // disable it will cause abnormal communication between boot and AXP power supply, // do not turn it off PMU->setPowerChannelVoltage(XPOWERS_DCDC1, 3300); // enable oled power PMU->enablePowerOutput(XPOWERS_DCDC1); - // gnss module power channel PMU->setPowerChannelVoltage(XPOWERS_LDO3, 3300); // power->enablePowerOutput(XPOWERS_LDO3); - // protected oled power source PMU->setProtectedChannel(XPOWERS_DCDC1); // protected esp32 power source PMU->setProtectedChannel(XPOWERS_DCDC3); - // disable not use channel PMU->disablePowerOutput(XPOWERS_DCDC2); - // disable all axp chip interrupt PMU->disableIRQ(XPOWERS_AXP192_ALL_IRQ); - - // - /* Set the constant current charging current of AXP192 - opt: - XPOWERS_AXP192_CHG_CUR_100MA, - XPOWERS_AXP192_CHG_CUR_190MA, - XPOWERS_AXP192_CHG_CUR_280MA, - XPOWERS_AXP192_CHG_CUR_360MA, - XPOWERS_AXP192_CHG_CUR_450MA, - XPOWERS_AXP192_CHG_CUR_550MA, - XPOWERS_AXP192_CHG_CUR_630MA, - XPOWERS_AXP192_CHG_CUR_700MA, - XPOWERS_AXP192_CHG_CUR_780MA, - XPOWERS_AXP192_CHG_CUR_880MA, - XPOWERS_AXP192_CHG_CUR_960MA, - XPOWERS_AXP192_CHG_CUR_1000MA, - XPOWERS_AXP192_CHG_CUR_1080MA, - XPOWERS_AXP192_CHG_CUR_1160MA, - XPOWERS_AXP192_CHG_CUR_1240MA, - XPOWERS_AXP192_CHG_CUR_1320MA, - */ PMU->setChargerConstantCurr(XPOWERS_AXP192_CHG_CUR_550MA); } else if (PMU->getChipModel() == XPOWERS_AXP2101) @@ -142,53 +116,31 @@ bool TBeamBoard::power_init() // gnss module power channel PMU->setPowerChannelVoltage(XPOWERS_ALDO4, 3300); PMU->enablePowerOutput(XPOWERS_ALDO4); - // lora radio power channel PMU->setPowerChannelVoltage(XPOWERS_ALDO3, 3300); PMU->enablePowerOutput(XPOWERS_ALDO3); - // m.2 interface PMU->setPowerChannelVoltage(XPOWERS_DCDC3, 3300); PMU->enablePowerOutput(XPOWERS_DCDC3); - // power->setPowerChannelVoltage(XPOWERS_DCDC4, 3300); // power->enablePowerOutput(XPOWERS_DCDC4); - // not use channel PMU->disablePowerOutput(XPOWERS_DCDC2); // not elicited PMU->disablePowerOutput(XPOWERS_DCDC5); // not elicited PMU->disablePowerOutput(XPOWERS_DLDO1); // Invalid power channel, it does not exist PMU->disablePowerOutput(XPOWERS_DLDO2); // Invalid power channel, it does not exist PMU->disablePowerOutput(XPOWERS_VBACKUP); - // disable all axp chip interrupt PMU->disableIRQ(XPOWERS_AXP2101_ALL_IRQ); - - /* Set the constant current charging current of AXP2101 - opt: - XPOWERS_AXP2101_CHG_CUR_100MA, - XPOWERS_AXP2101_CHG_CUR_125MA, - XPOWERS_AXP2101_CHG_CUR_150MA, - XPOWERS_AXP2101_CHG_CUR_175MA, - XPOWERS_AXP2101_CHG_CUR_200MA, - XPOWERS_AXP2101_CHG_CUR_300MA, - XPOWERS_AXP2101_CHG_CUR_400MA, - XPOWERS_AXP2101_CHG_CUR_500MA, - XPOWERS_AXP2101_CHG_CUR_600MA, - XPOWERS_AXP2101_CHG_CUR_700MA, - XPOWERS_AXP2101_CHG_CUR_800MA, - XPOWERS_AXP2101_CHG_CUR_900MA, - XPOWERS_AXP2101_CHG_CUR_1000MA, - */ - PMU->setChargerConstantCurr(XPOWERS_AXP2101_CHG_CUR_500MA); + PMU->setChargerConstantCurr(XPOWERS_AXP2101_CHG_CUR_500MA); // Set up PMU interrupts - Serial.println("Setting up PMU interrupts"); + // Serial.println("Setting up PMU interrupts"); pinMode(PIN_PMU_IRQ, INPUT_PULLUP); attachInterrupt(PIN_PMU_IRQ, setPMUIntFlag, FALLING); // Reset and re-enable PMU interrupts - Serial.println("Re-enable interrupts"); + // Serial.println("Re-enable interrupts"); PMU->disableIRQ(XPOWERS_AXP2101_ALL_IRQ); PMU->clearIrqStatus(); PMU->enableIRQ( From 3a8dfc8fe928f1c37a7f14174ff70fe8cbf890f5 Mon Sep 17 00:00:00 2001 From: hank Date: Thu, 8 May 2025 01:10:56 -0700 Subject: [PATCH 3/5] Delete .vscode/settings.json Removing vscode file incorrectly committed --- .vscode/settings.json | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 4a67f19a..00000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "files.associations": { - "*.tpp": "cpp" - } -} \ No newline at end of file From 73d066375de6df325b98f3862587eed8e9943e93 Mon Sep 17 00:00:00 2001 From: hank Date: Mon, 12 May 2025 00:56:30 -0700 Subject: [PATCH 4/5] Fixes to the PMU calls --- src/helpers/TBeamS3SupremeBoard.h | 23 +-- .../lilygo_tbeam_supreme_SX1262/target.cpp | 146 ++++++++++-------- 2 files changed, 93 insertions(+), 76 deletions(-) diff --git a/src/helpers/TBeamS3SupremeBoard.h b/src/helpers/TBeamS3SupremeBoard.h index 2b8232d8..200756a2 100644 --- a/src/helpers/TBeamS3SupremeBoard.h +++ b/src/helpers/TBeamS3SupremeBoard.h @@ -47,15 +47,17 @@ #define I2C_RTC_ADD 0x51 //RTC I2C address on Wire1 #define I2C_PMU_ADD 0x34 //AXP2101 I2C address on Wire1 - +#define PMU_WIRE_PORT Wire1 +#define XPOWERS_CHIP_AXP2101 class TBeamS3SupremeBoard : public ESP32Board { - + XPowersAXP2101 PMU; public: +#ifdef MESH_DEBUG + void printPMU(); +#endif + bool power_init(); void begin() { - - bool power_init(); - ESP32Board::begin(); esp_reset_reason_t reason = esp_reset_reason(); @@ -68,6 +70,7 @@ public: rtc_gpio_hold_dis((gpio_num_t)P_LORA_NSS); rtc_gpio_deinit((gpio_num_t)P_LORA_DIO_1); } + power_init(); } void enterDeepSleep(uint32_t secs, int pin_wake_btn = -1) { @@ -94,12 +97,14 @@ public: } uint16_t getBattMilliVolts() override { - - return 0; + return PMU.getBattVoltage(); } - uint16_t getBattPercent(); - + uint16_t getBattPercent() { + //Read the PMU fuel guage for battery % + uint16_t battPercent = PMU.getBatteryPercent(); + return battPercent; + } const char* getManufacturerName() const override { return "LilyGo T-Beam S3 Supreme SX1262"; } diff --git a/variants/lilygo_tbeam_supreme_SX1262/target.cpp b/variants/lilygo_tbeam_supreme_SX1262/target.cpp index bbdd604e..fe767729 100644 --- a/variants/lilygo_tbeam_supreme_SX1262/target.cpp +++ b/variants/lilygo_tbeam_supreme_SX1262/target.cpp @@ -3,9 +3,6 @@ TBeamS3SupremeBoard board; -// Using PMU AXP2102 -XPowersAXP2101 PMU; - bool pmuIntFlag; #ifndef LORA_CR @@ -28,103 +25,125 @@ SensorManager sensors; static void setPMUIntFlag(){ pmuIntFlag = true; } +#ifdef MESH_DEBUG +void TBeamS3SupremeBoard::printPMU() +{ + Serial.print("isCharging:"); Serial.println(PMU.isCharging() ? "YES" : "NO"); + Serial.print("isDischarge:"); Serial.println(PMU.isDischarge() ? "YES" : "NO"); + Serial.print("isVbusIn:"); Serial.println(PMU.isVbusIn() ? "YES" : "NO"); + Serial.print("getBattVoltage:"); Serial.print(PMU.getBattVoltage()); Serial.println("mV"); + Serial.print("getVbusVoltage:"); Serial.print(PMU.getVbusVoltage()); Serial.println("mV"); + Serial.print("getSystemVoltage:"); Serial.print(PMU.getSystemVoltage()); Serial.println("mV"); -bool power_init() { - //Start up Wire1 with PMU address - //Serial.println("Starting Wire1 for PMU"); - //Wire1.begin(I2C_PMU_ADD); - //Wire1.begin(PIN_BOARD_SDA1,PIN_BOARD_SCL1); - - //Set LED to indicate charge state - Serial.println("Setting charge led"); - PMU.setChargingLedMode(XPOWERS_CHG_LED_CTRL_CHG); - - //Set up PMU interrupts - Serial.println("Setting up PMU interrupts"); - pinMode(PIN_PMU_IRQ,INPUT_PULLUP); - attachInterrupt(PIN_PMU_IRQ,setPMUIntFlag,FALLING); + // The battery percentage may be inaccurate at first use, the PMU will automatically + // learn the battery curve and will automatically calibrate the battery percentage + // after a charge and discharge cycle + if (PMU.isBatteryConnect()) { + Serial.print("getBatteryPercent:"); Serial.print(PMU.getBatteryPercent()); Serial.println("%"); + } - //GPS - Serial.println("Setting and enabling a-ldo4 for GPS"); - PMU.setALDO4Voltage(3300); - PMU.enableALDO4(); //disable to save power - - //Lora - Serial.println("Setting and enabling a-ldo3 for LoRa"); - PMU.setALDO3Voltage(3300); - PMU.enableALDO3(); + Serial.println(); +} +#endif - //To avoid SPI bus issues during power up, reset OLED, sensor, and SD card supplies - Serial.println("Reset a-ldo1&2 and b-ldo1"); - if(ESP_SLEEP_WAKEUP_UNDEFINED == esp_sleep_get_wakeup_cause()){ +bool TBeamS3SupremeBoard::power_init() +{ + bool result = PMU.begin(PMU_WIRE_PORT, I2C_PMU_ADD, PIN_BOARD_SDA1, PIN_BOARD_SCL1); + if (result == false) { + MESH_DEBUG_PRINTLN("power is not online..."); while (1)delay(50); + } + MESH_DEBUG_PRINTLN("Setting charge led"); + PMU.setChargingLedMode(XPOWERS_CHG_LED_CTRL_CHG); + + // Set up PMU interrupts + MESH_DEBUG_PRINTLN("Setting up PMU interrupts"); + pinMode(PIN_PMU_IRQ, INPUT_PULLUP); + attachInterrupt(PIN_PMU_IRQ, setPMUIntFlag, FALLING); + + // GPS + MESH_DEBUG_PRINTLN("Setting and enabling a-ldo4 for GPS"); + PMU.setALDO4Voltage(3300); + PMU.enableALDO4(); // disable to save power + + // Lora + MESH_DEBUG_PRINTLN("Setting and enabling a-ldo3 for LoRa"); + PMU.setALDO3Voltage(3300); + PMU.enableALDO3(); + + // To avoid SPI bus issues during power up, reset OLED, sensor, and SD card supplies + MESH_DEBUG_PRINTLN("Reset a-ldo1&2 and b-ldo1"); + if (ESP_SLEEP_WAKEUP_UNDEFINED == esp_sleep_get_wakeup_cause()) + { PMU.enableALDO1(); PMU.enableALDO2(); PMU.enableBLDO1(); delay(250); } - - //BME280 and OLED - Serial.println("Setting and enabling a-ldo1 for oled"); + + // BME280 and OLED + MESH_DEBUG_PRINTLN("Setting and enabling a-ldo1 for oled"); PMU.setALDO1Voltage(3300); PMU.enableALDO1(); - //QMC6310U - Serial.println("Setting and enabling a-ldo2 for QMC"); + // QMC6310U + MESH_DEBUG_PRINTLN("Setting and enabling a-ldo2 for QMC"); PMU.setALDO2Voltage(3300); - PMU.enableALDO2(); //disable to save power + PMU.enableALDO2(); // disable to save power - //SD card - Serial.println("Setting and enabling b-ldo2 for SD card"); + // SD card + MESH_DEBUG_PRINTLN("Setting and enabling b-ldo2 for SD card"); PMU.setBLDO1Voltage(3300); PMU.enableBLDO1(); - //Out to header pins - Serial.println("Setting and enabling b-ldo2 for output to header"); + // Out to header pins + MESH_DEBUG_PRINTLN("Setting and enabling b-ldo2 for output to header"); PMU.setBLDO2Voltage(3300); PMU.enableBLDO2(); - Serial.println("Setting and enabling dcdc4 for output to header"); - PMU.setDC4Voltage(XPOWERS_AXP2101_DCDC4_VOL2_MAX); //1.8V + MESH_DEBUG_PRINTLN("Setting and enabling dcdc4 for output to header"); + PMU.setDC4Voltage(XPOWERS_AXP2101_DCDC4_VOL2_MAX); // 1.8V PMU.enableDC4(); - Serial.println("Setting and enabling dcdc5 for output to header"); + MESH_DEBUG_PRINTLN("Setting and enabling dcdc5 for output to header"); PMU.setDC5Voltage(3300); PMU.enableDC5(); - //Other power rails - Serial.println("Setting and enabling dcdc3 for ?"); - PMU.setDC3Voltage(3300); //doesn't go anywhere in the schematic?? + // Other power rails + MESH_DEBUG_PRINTLN("Setting and enabling dcdc3 for ?"); + PMU.setDC3Voltage(3300); // doesn't go anywhere in the schematic?? PMU.enableDC3(); - //Unused power rails - Serial.println("Disabling unused supplies dcdc2, dldo1 and dldo2"); + // Unused power rails + MESH_DEBUG_PRINTLN("Disabling unused supplies dcdc2, dldo1 and dldo2"); PMU.disableDC2(); PMU.disableDLDO1(); - PMU.disableDLDO2(); + PMU.disableDLDO2(); - //Set charge current to 300mA - Serial.println("Setting battery charge current limit and voltage"); + // Set charge current to 300mA + MESH_DEBUG_PRINTLN("Setting battery charge current limit and voltage"); PMU.setChargerConstantCurr(XPOWERS_AXP2101_CHG_CUR_300MA); PMU.setChargeTargetVoltage(XPOWERS_AXP2101_CHG_VOL_4V2); - //enable battery voltage measurement - Serial.println("Enabling battery measurement"); + // enable battery voltage measurement + MESH_DEBUG_PRINTLN("Enabling battery measurement"); PMU.enableBattVoltageMeasure(); - //Reset and re-enable PMU interrupts - Serial.println("Re-enable interrupts"); + // Reset and re-enable PMU interrupts + MESH_DEBUG_PRINTLN("Re-enable interrupts"); PMU.disableIRQ(XPOWERS_AXP2101_ALL_IRQ); PMU.clearIrqStatus(); PMU.enableIRQ( - XPOWERS_AXP2101_BAT_INSERT_IRQ | XPOWERS_AXP2101_BAT_REMOVE_IRQ | //Battery interrupts - XPOWERS_AXP2101_VBUS_INSERT_IRQ | XPOWERS_AXP2101_VBUS_REMOVE_IRQ | //VBUS interrupts - XPOWERS_AXP2101_PKEY_SHORT_IRQ | XPOWERS_AXP2101_PKEY_LONG_IRQ | //Power Key interrupts - XPOWERS_AXP2101_BAT_CHG_DONE_IRQ | XPOWERS_AXP2101_BAT_CHG_START_IRQ //Charging interrupts + XPOWERS_AXP2101_BAT_INSERT_IRQ | XPOWERS_AXP2101_BAT_REMOVE_IRQ | // Battery interrupts + XPOWERS_AXP2101_VBUS_INSERT_IRQ | XPOWERS_AXP2101_VBUS_REMOVE_IRQ | // VBUS interrupts + XPOWERS_AXP2101_PKEY_SHORT_IRQ | XPOWERS_AXP2101_PKEY_LONG_IRQ | // Power Key interrupts + XPOWERS_AXP2101_BAT_CHG_DONE_IRQ | XPOWERS_AXP2101_BAT_CHG_START_IRQ // Charging interrupts ); +#ifdef MESH_DEBUG + printPMU(); +#endif - //Set the power key off press time + // Set the power key off press time PMU.setPowerKeyPressOffTime(XPOWERS_POWEROFF_4S); - return true; } @@ -154,13 +173,6 @@ bool radio_init() { return true; // success } -uint16_t getBattPercent() { - //Read the PMU fuel guage for battery % - uint16_t battPercent = PMU.getBatteryPercent(); - - return battPercent; -} - uint32_t radio_get_rng_seed() { return radio.random(0x7FFFFFFF); } From 67462cb861eb3d3791aa0389418844a9f2c4f69a Mon Sep 17 00:00:00 2001 From: hank Date: Mon, 26 May 2025 17:41:55 -0700 Subject: [PATCH 5/5] Fixing compilation issue, missing tbeam func --- variants/lilygo_tbeam/target.cpp | 42 +++++++++++++++++--------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/variants/lilygo_tbeam/target.cpp b/variants/lilygo_tbeam/target.cpp index 5259cb36..47c14297 100644 --- a/variants/lilygo_tbeam/target.cpp +++ b/variants/lilygo_tbeam/target.cpp @@ -7,27 +7,10 @@ TBeamBoard board; #define PMU_WIRE_PORT Wire bool pmuIntFlag = false; - -void TBeamBoard::printPMU() -{ - Serial.print("isCharging:"); Serial.println(PMU->isCharging() ? "YES" : "NO"); - Serial.print("isDischarge:"); Serial.println(PMU->isDischarge() ? "YES" : "NO"); - Serial.print("isVbusIn:"); Serial.println(PMU->isVbusIn() ? "YES" : "NO"); - Serial.print("getBattVoltage:"); Serial.print(PMU->getBattVoltage()); Serial.println("mV"); - Serial.print("getVbusVoltage:"); Serial.print(PMU->getVbusVoltage()); Serial.println("mV"); - Serial.print("getSystemVoltage:"); Serial.print(PMU->getSystemVoltage()); Serial.println("mV"); - - // The battery percentage may be inaccurate at first use, the PMU will automatically - // learn the battery curve and will automatically calibrate the battery percentage - // after a charge and discharge cycle - if (PMU->isBatteryConnect()) { - Serial.print("getBatteryPercent:"); Serial.print(PMU->getBatteryPercent()); Serial.println("%"); - } - - Serial.println(); +static void setPMUIntFlag(){ + pmuIntFlag = true; } - #if defined(P_LORA_SCLK) static SPIClass spi; RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_0, P_LORA_RESET, P_LORA_DIO_1, spi); @@ -197,3 +180,24 @@ mesh::LocalIdentity radio_new_identity() { RadioNoiseListener rng(radio); return mesh::LocalIdentity(&rng); // create new random identity } + +#ifdef MESH_DEBUG +void TBeamBoard::printPMU() +{ + Serial.print("isCharging:"); Serial.println(PMU->isCharging() ? "YES" : "NO"); + Serial.print("isDischarge:"); Serial.println(PMU->isDischarge() ? "YES" : "NO"); + Serial.print("isVbusIn:"); Serial.println(PMU->isVbusIn() ? "YES" : "NO"); + Serial.print("getBattVoltage:"); Serial.print(PMU->getBattVoltage()); Serial.println("mV"); + Serial.print("getVbusVoltage:"); Serial.print(PMU->getVbusVoltage()); Serial.println("mV"); + Serial.print("getSystemVoltage:"); Serial.print(PMU->getSystemVoltage()); Serial.println("mV"); + + // The battery percentage may be inaccurate at first use, the PMU will automatically + // learn the battery curve and will automatically calibrate the battery percentage + // after a charge and discharge cycle + if (PMU->isBatteryConnect()) { + Serial.print("getBatteryPercent:"); Serial.print(PMU->getBatteryPercent()); Serial.println("%"); + } + + Serial.println(); +} +#endif \ No newline at end of file