bootoptions: unify esp32+esp8266 crash detection, add api to force reboot to safemode

This commit is contained in:
Torrie Fischer 2023-12-11 07:54:08 +01:00
parent b1ec20982b
commit 87ac61b061
2 changed files with 23 additions and 14 deletions

View File

@ -14,10 +14,21 @@ retained bool LAST_BOOT_WAS_FLASH;
retained bool LAST_BOOT_WAS_SERIAL; retained bool LAST_BOOT_WAS_SERIAL;
#endif #endif
#ifdef BOARD_ESP32 #ifndef __NOINIT_ATTR // Pre-defined on esp32
__NOINIT_ATTR uint8_t s_rebootCount = 0; #define __NOINIT_ATTR __attribute__ ((section (".noinit")))
#endif #endif
#define SAFE_MODE_MAGIC 6942
__NOINIT_ATTR uint8_t s_rebootCount;
__NOINIT_ATTR uint16_t s_forceSafeMode;
void
BootOptions::forceSafeMode()
{
s_forceSafeMode = SAFE_MODE_MAGIC;
}
void void
BootOptions::initPins() BootOptions::initPins()
{ {
@ -60,23 +71,20 @@ BootOptions::BootOptions()
#ifdef BOARD_ESP8266 #ifdef BOARD_ESP8266
struct rst_info resetInfo = *ESP.getResetInfoPtr(); struct rst_info resetInfo = *ESP.getResetInfoPtr();
resetReason = resetInfo.reason; resetReason = resetInfo.reason;
EEPROM.begin(sizeof(crashCount)); crashCount = s_rebootCount;
EEPROM.get(sizeof(HardwareConfig) + 32, crashCount); if (resetInfo.reason == REASON_SOFT_WDT_RST || resetInfo.reason == REASON_WDT_RST || resetInfo.reason == REASON_EXCEPTION_RST) {
EEPROM.end();
if (resetInfo.reason == REASON_WDT_RST || resetInfo.reason == REASON_EXCEPTION_RST) {
if (crashCount++ >= 3) { if (crashCount++ >= 3) {
// Boot into safe mode if the watchdog reset us three times in a row. // Boot into safe mode if the watchdog reset us three times in a row.
isSafeMode = true; isSafeMode = true;
} else {
EEPROM.begin(sizeof(crashCount));
EEPROM.put(sizeof(HardwareConfig) + 32, crashCount);
EEPROM.end();
} }
} else if (crashCount != 0) { } else {
crashCount = 0; crashCount = 0;
EEPROM.begin(sizeof(crashCount)); }
EEPROM.put(sizeof(HardwareConfig) + 32, crashCount); s_rebootCount = crashCount;
EEPROM.end();
if (resetInfo.reason > 0 && s_forceSafeMode == SAFE_MODE_MAGIC) {
isSafeMode = true;
s_forceSafeMode = 0;
} }
#endif #endif
} }

View File

@ -7,6 +7,7 @@ struct BootOptions {
BootOptions(); BootOptions();
void waitForRelease(); void waitForRelease();
void forceSafeMode();
bool isSetup = false; bool isSetup = false;
bool isSerial = false; bool isSerial = false;