|
|
@ -3,9 +3,6 @@ |
|
|
|
|
|
|
|
|
TBeamS3SupremeBoard board; |
|
|
TBeamS3SupremeBoard board; |
|
|
|
|
|
|
|
|
// Using PMU AXP2102
|
|
|
|
|
|
XPowersAXP2101 PMU; |
|
|
|
|
|
|
|
|
|
|
|
bool pmuIntFlag; |
|
|
bool pmuIntFlag; |
|
|
|
|
|
|
|
|
#ifndef LORA_CR |
|
|
#ifndef LORA_CR |
|
|
@ -28,103 +25,125 @@ SensorManager sensors; |
|
|
static void setPMUIntFlag(){ |
|
|
static void setPMUIntFlag(){ |
|
|
pmuIntFlag = true; |
|
|
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"); |
|
|
|
|
|
|
|
|
|
|
|
// 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 |
|
|
|
|
|
|
|
|
bool power_init() { |
|
|
bool TBeamS3SupremeBoard::power_init() |
|
|
//Start up Wire1 with PMU address
|
|
|
{ |
|
|
//Serial.println("Starting Wire1 for PMU");
|
|
|
bool result = PMU.begin(PMU_WIRE_PORT, I2C_PMU_ADD, PIN_BOARD_SDA1, PIN_BOARD_SCL1); |
|
|
//Wire1.begin(I2C_PMU_ADD);
|
|
|
if (result == false) { |
|
|
//Wire1.begin(PIN_BOARD_SDA1,PIN_BOARD_SCL1);
|
|
|
MESH_DEBUG_PRINTLN("power is not online..."); while (1)delay(50); |
|
|
|
|
|
} |
|
|
//Set LED to indicate charge state
|
|
|
MESH_DEBUG_PRINTLN("Setting charge led"); |
|
|
Serial.println("Setting charge led"); |
|
|
PMU.setChargingLedMode(XPOWERS_CHG_LED_CTRL_CHG); |
|
|
PMU.setChargingLedMode(XPOWERS_CHG_LED_CTRL_CHG); |
|
|
|
|
|
|
|
|
// Set up PMU interrupts
|
|
|
//Set up PMU interrupts
|
|
|
MESH_DEBUG_PRINTLN("Setting up PMU interrupts"); |
|
|
Serial.println("Setting up PMU interrupts"); |
|
|
pinMode(PIN_PMU_IRQ, INPUT_PULLUP); |
|
|
pinMode(PIN_PMU_IRQ,INPUT_PULLUP); |
|
|
attachInterrupt(PIN_PMU_IRQ, setPMUIntFlag, FALLING); |
|
|
attachInterrupt(PIN_PMU_IRQ,setPMUIntFlag,FALLING); |
|
|
|
|
|
|
|
|
// GPS
|
|
|
//GPS
|
|
|
MESH_DEBUG_PRINTLN("Setting and enabling a-ldo4 for GPS"); |
|
|
Serial.println("Setting and enabling a-ldo4 for GPS"); |
|
|
PMU.setALDO4Voltage(3300); |
|
|
PMU.setALDO4Voltage(3300); |
|
|
PMU.enableALDO4(); // disable to save power
|
|
|
PMU.enableALDO4(); //disable to save power
|
|
|
|
|
|
|
|
|
// Lora
|
|
|
//Lora
|
|
|
MESH_DEBUG_PRINTLN("Setting and enabling a-ldo3 for LoRa"); |
|
|
Serial.println("Setting and enabling a-ldo3 for LoRa"); |
|
|
PMU.setALDO3Voltage(3300); |
|
|
PMU.setALDO3Voltage(3300); |
|
|
PMU.enableALDO3(); |
|
|
PMU.enableALDO3(); |
|
|
|
|
|
|
|
|
// To avoid SPI bus issues during power up, reset OLED, sensor, and SD card supplies
|
|
|
//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"); |
|
|
Serial.println("Reset a-ldo1&2 and b-ldo1"); |
|
|
if (ESP_SLEEP_WAKEUP_UNDEFINED == esp_sleep_get_wakeup_cause()) |
|
|
if(ESP_SLEEP_WAKEUP_UNDEFINED == esp_sleep_get_wakeup_cause()){ |
|
|
{ |
|
|
PMU.enableALDO1(); |
|
|
PMU.enableALDO1(); |
|
|
PMU.enableALDO2(); |
|
|
PMU.enableALDO2(); |
|
|
PMU.enableBLDO1(); |
|
|
PMU.enableBLDO1(); |
|
|
delay(250); |
|
|
delay(250); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
//BME280 and OLED
|
|
|
// BME280 and OLED
|
|
|
Serial.println("Setting and enabling a-ldo1 for oled"); |
|
|
MESH_DEBUG_PRINTLN("Setting and enabling a-ldo1 for oled"); |
|
|
PMU.setALDO1Voltage(3300); |
|
|
PMU.setALDO1Voltage(3300); |
|
|
PMU.enableALDO1(); |
|
|
PMU.enableALDO1(); |
|
|
|
|
|
|
|
|
//QMC6310U
|
|
|
// QMC6310U
|
|
|
Serial.println("Setting and enabling a-ldo2 for QMC"); |
|
|
MESH_DEBUG_PRINTLN("Setting and enabling a-ldo2 for QMC"); |
|
|
PMU.setALDO2Voltage(3300); |
|
|
PMU.setALDO2Voltage(3300); |
|
|
PMU.enableALDO2(); //disable to save power
|
|
|
PMU.enableALDO2(); // disable to save power
|
|
|
|
|
|
|
|
|
//SD card
|
|
|
// SD card
|
|
|
Serial.println("Setting and enabling b-ldo2 for SD card"); |
|
|
MESH_DEBUG_PRINTLN("Setting and enabling b-ldo2 for SD card"); |
|
|
PMU.setBLDO1Voltage(3300); |
|
|
PMU.setBLDO1Voltage(3300); |
|
|
PMU.enableBLDO1(); |
|
|
PMU.enableBLDO1(); |
|
|
|
|
|
|
|
|
//Out to header pins
|
|
|
// Out to header pins
|
|
|
Serial.println("Setting and enabling b-ldo2 for output to header"); |
|
|
MESH_DEBUG_PRINTLN("Setting and enabling b-ldo2 for output to header"); |
|
|
PMU.setBLDO2Voltage(3300); |
|
|
PMU.setBLDO2Voltage(3300); |
|
|
PMU.enableBLDO2(); |
|
|
PMU.enableBLDO2(); |
|
|
|
|
|
|
|
|
Serial.println("Setting and enabling dcdc4 for output to header"); |
|
|
MESH_DEBUG_PRINTLN("Setting and enabling dcdc4 for output to header"); |
|
|
PMU.setDC4Voltage(XPOWERS_AXP2101_DCDC4_VOL2_MAX); //1.8V
|
|
|
PMU.setDC4Voltage(XPOWERS_AXP2101_DCDC4_VOL2_MAX); // 1.8V
|
|
|
PMU.enableDC4(); |
|
|
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.setDC5Voltage(3300); |
|
|
PMU.enableDC5(); |
|
|
PMU.enableDC5(); |
|
|
|
|
|
|
|
|
//Other power rails
|
|
|
// Other power rails
|
|
|
Serial.println("Setting and enabling dcdc3 for ?"); |
|
|
MESH_DEBUG_PRINTLN("Setting and enabling dcdc3 for ?"); |
|
|
PMU.setDC3Voltage(3300); //doesn't go anywhere in the schematic??
|
|
|
PMU.setDC3Voltage(3300); // doesn't go anywhere in the schematic??
|
|
|
PMU.enableDC3(); |
|
|
PMU.enableDC3(); |
|
|
|
|
|
|
|
|
//Unused power rails
|
|
|
// Unused power rails
|
|
|
Serial.println("Disabling unused supplies dcdc2, dldo1 and dldo2"); |
|
|
MESH_DEBUG_PRINTLN("Disabling unused supplies dcdc2, dldo1 and dldo2"); |
|
|
PMU.disableDC2(); |
|
|
PMU.disableDC2(); |
|
|
PMU.disableDLDO1(); |
|
|
PMU.disableDLDO1(); |
|
|
PMU.disableDLDO2(); |
|
|
PMU.disableDLDO2(); |
|
|
|
|
|
|
|
|
//Set charge current to 300mA
|
|
|
// Set charge current to 300mA
|
|
|
Serial.println("Setting battery charge current limit and voltage"); |
|
|
MESH_DEBUG_PRINTLN("Setting battery charge current limit and voltage"); |
|
|
PMU.setChargerConstantCurr(XPOWERS_AXP2101_CHG_CUR_300MA); |
|
|
PMU.setChargerConstantCurr(XPOWERS_AXP2101_CHG_CUR_300MA); |
|
|
PMU.setChargeTargetVoltage(XPOWERS_AXP2101_CHG_VOL_4V2); |
|
|
PMU.setChargeTargetVoltage(XPOWERS_AXP2101_CHG_VOL_4V2); |
|
|
|
|
|
|
|
|
//enable battery voltage measurement
|
|
|
// enable battery voltage measurement
|
|
|
Serial.println("Enabling battery measurement"); |
|
|
MESH_DEBUG_PRINTLN("Enabling battery measurement"); |
|
|
PMU.enableBattVoltageMeasure(); |
|
|
PMU.enableBattVoltageMeasure(); |
|
|
|
|
|
|
|
|
//Reset and re-enable PMU interrupts
|
|
|
// Reset and re-enable PMU interrupts
|
|
|
Serial.println("Re-enable interrupts"); |
|
|
MESH_DEBUG_PRINTLN("Re-enable interrupts"); |
|
|
PMU.disableIRQ(XPOWERS_AXP2101_ALL_IRQ); |
|
|
PMU.disableIRQ(XPOWERS_AXP2101_ALL_IRQ); |
|
|
PMU.clearIrqStatus(); |
|
|
PMU.clearIrqStatus(); |
|
|
PMU.enableIRQ( |
|
|
PMU.enableIRQ( |
|
|
XPOWERS_AXP2101_BAT_INSERT_IRQ | XPOWERS_AXP2101_BAT_REMOVE_IRQ | //Battery 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_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_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_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); |
|
|
PMU.setPowerKeyPressOffTime(XPOWERS_POWEROFF_4S); |
|
|
|
|
|
|
|
|
return true; |
|
|
return true; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -154,13 +173,6 @@ bool radio_init() { |
|
|
return true; // success
|
|
|
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() { |
|
|
uint32_t radio_get_rng_seed() { |
|
|
return radio.random(0x7FFFFFFF); |
|
|
return radio.random(0x7FFFFFFF); |
|
|
} |
|
|
} |
|
|
|