T-Beam V10 (AXP192 PMU) enhanced power functions

This commit is contained in:
Verkehrsrot 2019-09-09 21:45:19 +02:00
parent edc510adf2
commit 50c6ba2837
4 changed files with 75 additions and 19 deletions

View File

@ -10,12 +10,14 @@
#define UNMASK_IRQ 0x040
#define BME_IRQ 0x080
#define MATRIX_DISPLAY_IRQ 0x100
#define PMU_IRQ 0x200
#include "globals.h"
#include "cyclic.h"
#include "senddata.h"
#include "timekeeper.h"
#include "bmesensor.h"
#include "power.h"
void irqHandler(void *pvParameters);
void mask_user_IRQ();
@ -33,5 +35,9 @@ void IRAM_ATTR MatrixDisplayIRQ();
void IRAM_ATTR ButtonIRQ();
#endif
#ifdef HAS_PMU
void IRAM_ATTR PMUIRQ();
#endif
#endif

View File

@ -11,11 +11,14 @@
#ifdef HAS_PMU
#include <axp20x.h>
extern AXP20X_Class pmu; // Make axp instance globally availabe
void pover_event_IRQ(void);
#endif
void AXP192_init(void);
uint16_t read_voltage(void);
void calibrate_voltage(void);
uint8_t getBattLevel (void);
uint8_t getBattLevel(void);
#endif

View File

@ -63,6 +63,12 @@ void irqHandler(void *pvParameters) {
}
#endif
// do we have a power event?
#if (HAS_PMU)
if (InterruptStatus & PMU_IRQ)
pover_event_IRQ();
#endif
// is time to send the payload?
if (InterruptStatus & SENDCYCLE_IRQ)
sendData();
@ -106,6 +112,18 @@ void IRAM_ATTR ButtonIRQ() {
}
#endif
#ifdef HAS_PMU
void IRAM_ATTR PMUIRQ() {
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
xTaskNotifyFromISR(irqHandlerTask, PMU_IRQ, eSetBits,
&xHigherPriorityTaskWoken);
if (xHigherPriorityTaskWoken)
portYIELD_FROM_ISR();
}
#endif
void mask_user_IRQ() { xTaskNotify(irqHandlerTask, MASK_IRQ, eSetBits); }
void unmask_user_IRQ() { xTaskNotify(irqHandlerTask, UNMASK_IRQ, eSetBits); }

View File

@ -9,6 +9,43 @@ static const char TAG[] = __FILE__;
AXP20X_Class pmu;
void pover_event_IRQ(void) {
// block i2c bus access
if (I2C_MUTEX_LOCK()) {
pmu.readIRQ();
// put your power event handler code here
if (pmu.isVbusOverVoltageIRQ())
ESP_LOGI(TAG, "USB voltage too high.");
if (pmu.isVbusPlugInIRQ())
ESP_LOGI(TAG, "USB plugged.");
if (pmu.isVbusRemoveIRQ())
ESP_LOGI(TAG, "USB unplugged.");
if (pmu.isBattPlugInIRQ())
ESP_LOGI(TAG, "Battery is connected.");
if (pmu.isBattRemoveIRQ())
ESP_LOGI(TAG, "Battery was removed.");
if (pmu.isChargingIRQ())
ESP_LOGI(TAG, "Battery is charging.");
if (pmu.isChargingDoneIRQ())
ESP_LOGI(TAG, "Battery charging done.");
if (pmu.isBattTempLowIRQ())
ESP_LOGI(TAG, "Battery high temperature.");
if (pmu.isBattTempHighIRQ())
ESP_LOGI(TAG, "Battery low temperature.");
if (pmu.isPEKShortPressIRQ())
ESP_LOGI(TAG, "Power Button short pressed.");
if (pmu.isPEKLongtPressIRQ())
ESP_LOGI(TAG, "Power Button long pressed.");
pmu.clearIRQ();
I2C_MUTEX_UNLOCK(); // release i2c bus access
} else
ESP_LOGI(TAG, "Unknown PMU event.");
}
void AXP192_init(void) {
// block i2c bus access
@ -27,25 +64,17 @@ void AXP192_init(void) {
pmu.setChgLEDMode(AXP20X_LED_LOW_LEVEL);
pmu.adc1Enable(AXP202_BATT_CUR_ADC1, 1);
/*
// I2C access of AXP202X library currently is not mutexable
// so we need to disable AXP interrupts
// I2C access of AXP202X library currently is not mutexable
// so we need to disable AXP interrupts
#ifdef PMU_INT
pinMode(PMU_INT, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(PMU_INT),
[] {
ESP_LOGI(TAG, "Power source changed");
// put your code here
},
FALLING);
pmu.enableIRQ(AXP202_VBUS_REMOVED_IRQ | AXP202_VBUS_CONNECT_IRQ |
AXP202_BATT_REMOVED_IRQ | AXP202_BATT_CONNECT_IRQ,
1);
pmu.clearIRQ();
#endif // PMU_INT
*/
#ifdef PMU_INT
pinMode(PMU_INT, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(PMU_INT), PMUIRQ, FALLING);
pmu.enableIRQ(AXP202_VBUS_REMOVED_IRQ | AXP202_VBUS_CONNECT_IRQ |
AXP202_BATT_REMOVED_IRQ | AXP202_BATT_CONNECT_IRQ,
1);
pmu.clearIRQ();
#endif // PMU_INT
ESP_LOGI(TAG, "AXP192 PMU initialized.");