Files
OpenEPaperLink/ESP32_AP-Flasher/src/powermgt.cpp
Nic Limper 2d486d7c66 update to arduinojson 7.3.0, change ESPAsyncWebServer fork, Arduino 3.x compatibility, enabled comments within json files (#438)
* updated arduinojson to version 7.3.0, enabled comments within json files

* update ESPAsyncWebServer/AsyncTCP to the ESP32Async fork

ESP32Async/ESPAsyncWebServer and ESP32Async/AsyncTCP are much better maintained and it looks like a lot of bugs are fixed compared to the ESPHome version we used before.

* Arduino 3.x compatibility (while maintaining 2.x compatibility)
2025-03-19 21:48:06 +01:00

120 lines
3.3 KiB
C++

#include "powermgt.h"
#include <Arduino.h>
#include "settings.h"
#include "leds.h"
#ifdef HAS_EXT_FLASHER
#include "soc/rtc_cntl_reg.h"
#include "soc/soc.h"
#endif
void simpleAPPower(uint8_t* pin, uint8_t pincount, bool state) {
for (uint8_t c = 0; c < pincount; c++) {
pinMode(pin[c], INPUT);
}
for (uint8_t c = 0; c < pincount; c++) {
#ifdef POWER_HIGH_SIDE_DRIVER
digitalWrite(pin[c], !state);
#else
digitalWrite(pin[c], state);
#endif
}
for (uint8_t c = 0; c < pincount; c++) {
pinMode(pin[c], OUTPUT);
}
}
#ifdef POWER_RAMPING
// On the OpenEPaperLink board, there is no in-rush current limiting. The tags that can be connected to the board can have significant capacity, which,
// when drained if the board applies power, will cause the 3v3 rail to sag enough to reset the ESP32. This is obviously not great. To prevent this from happening,
// we ramp up/down the voltage with PWM. Ramping down really is unnecessary, as the board has a resistor to dump the charge into.
void rampTagPower(uint8_t* pin, bool up) {
#ifdef HAS_EXT_FLASHER
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);
#endif
if (up) {
#if ESP_ARDUINO_VERSION_MAJOR == 2
ledcSetup(0, 50000, 8);
ledcWrite(0, 254);
vTaskDelay(1 / portTICK_PERIOD_MS);
pinMode(pin[0], OUTPUT);
ledcAttachPin(pin[0], 0);
#else
ledcWriteChannel(0, 254);
ledcAttachChannel(pin[0], 50000, 8, 0);
#endif
pinMode(FLASHER_EXT_RESET, OUTPUT);
digitalWrite(FLASHER_EXT_RESET, LOW);
vTaskDelay(10 / portTICK_PERIOD_MS);
for (uint8_t c = 254; c != 0xFF; c--) {
ledcSet(0, c);
delayMicroseconds(700);
}
digitalWrite(pin[0], LOW);
ledcDetachPin(pin[0]);
digitalWrite(pin[0], LOW);
digitalWrite(FLASHER_EXT_RESET, INPUT_PULLUP);
} else {
ledcSetup(0, 50000, 8);
ledcSet(0, 0);
vTaskDelay(1 / portTICK_PERIOD_MS);
pinMode(pin[0], OUTPUT);
pinMode(FLASHER_EXT_RESET, INPUT_PULLDOWN);
ledcAttachPin(pin[0], 0);
vTaskDelay(10 / portTICK_PERIOD_MS);
for (uint8_t c = 0; c < 0xFF; c++) {
ledcSet(0, c);
if (c > 250) {
vTaskDelay(2 / portTICK_PERIOD_MS);
} else {
delayMicroseconds(500);
}
}
digitalWrite(pin[0], HIGH);
ledcDetachPin(pin[0]);
digitalWrite(pin[0], HIGH);
}
#ifdef HAS_EXT_FLASHER
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 1);
#endif
}
#endif
void powerControl(bool powerState, uint8_t* pin, uint8_t pincount) {
if (pincount == 0) return;
if (pin == nullptr) return;
static bool currentState = false;
if (currentState == powerState) return;
currentState = powerState;
#ifdef POWER_RAMPING
if (powerState == true) {
#ifdef POWER_HIGH_SIDE_DRIVER
rampTagPower(pin, true);
#else
rampTagPower(pin, false);
#endif
} else {
/*
pinMode(pin[0], OUTPUT);
#ifdef POWER_HIGH_SIDE_DRIVER
digitalWrite(pin[0], HIGH);
#else
digitalWrite(pin[0], LOW);
#endif
*/
#ifdef POWER_HIGH_SIDE_DRIVER
rampTagPower(pin, false);
#else
rampTagPower(pin, true);
#endif
}
#else
simpleAPPower(pin, pincount, powerState);
delay(500);
// simpleAPPower(pin, pincount, true);
#endif
}