Add saved regulator modes and battery-gated crash recovery
This commit is contained in:
1 parent
515bb57cdf
commit
c4a1d485ff
70 files changed
+5335
-2472
No files matched your search
@@ -0,0 +1,58 @@
|
||||
#include "RegulatorPlatform.h"
|
||||
|
||||
#if defined(ESP32)
|
||||
#include <esp_system.h>
|
||||
#include <esp_attr.h>
|
||||
#include <soc/soc_caps.h>
|
||||
#if SOC_RTC_SLOW_MEM_SUPPORTED || SOC_RTC_FAST_MEM_SUPPORTED
|
||||
#define MESH_REGULATOR_RTC 1
|
||||
static RTC_NOINIT_ATTR volatile mesh::power::RecoveryRecord regulator_record;
|
||||
#else
|
||||
static volatile mesh::power::RecoveryRecord regulator_record;
|
||||
#endif
|
||||
namespace mesh { namespace power {
|
||||
volatile RecoveryRecord& platformRecoveryRecord() { return regulator_record; }
|
||||
bool platformRecoverySupported() {
|
||||
#ifdef MESH_REGULATOR_RTC
|
||||
return true;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
ResetKind platformResetKind() {
|
||||
switch (esp_reset_reason()) {
|
||||
case ESP_RST_PANIC:
|
||||
case ESP_RST_INT_WDT:
|
||||
case ESP_RST_TASK_WDT:
|
||||
case ESP_RST_WDT: return ResetKind::Crash;
|
||||
case ESP_RST_DEEPSLEEP: return ResetKind::Wake;
|
||||
case ESP_RST_SW: return ResetKind::Intentional;
|
||||
case ESP_RST_POWERON:
|
||||
case ESP_RST_EXT: return ResetKind::Cold;
|
||||
// A supply failure is not evidence that the DC/DC regulator is faulty.
|
||||
default: return ResetKind::Unknown;
|
||||
}
|
||||
}
|
||||
}}
|
||||
#elif defined(RP2040_PLATFORM)
|
||||
#include <hardware/watchdog.h>
|
||||
// Arduino-Pico's linker explicitly keeps this outside BSS and above the
|
||||
// boot-ROM's scratch area. No watchdog scratch registers are commandeered.
|
||||
static volatile mesh::power::RecoveryRecord regulator_record
|
||||
__attribute__((section(".uninitialized_data.regulator_recovery"), used));
|
||||
namespace mesh { namespace power {
|
||||
volatile RecoveryRecord& platformRecoveryRecord() { return regulator_record; }
|
||||
bool platformRecoverySupported() { return true; }
|
||||
ResetKind platformResetKind() {
|
||||
if (watchdog_enable_caused_reboot()) return ResetKind::Crash;
|
||||
return watchdog_caused_reboot() ? ResetKind::Intentional : ResetKind::Cold;
|
||||
}
|
||||
}}
|
||||
#elif !defined(NRF52_PLATFORM)
|
||||
namespace mesh { namespace power {
|
||||
static volatile RecoveryRecord regulator_record;
|
||||
volatile RecoveryRecord& platformRecoveryRecord() { return regulator_record; }
|
||||
bool platformRecoverySupported() { return false; }
|
||||
ResetKind platformResetKind() { return ResetKind::Unknown; }
|
||||
}}
|
||||
#endif
|
||||
Reference in new issue
Block a user