Fixes #443: Add new ResetReason enum items (#444)

* Fixes #443: Add new ResetReason enum items

* Fix examples/reset_reason.rs comments

* Add forgotten 5.1.3 version to conditions

* Add forgotten 5.1.3 version to more conditions
This commit is contained in:
Jorge Muñoz 2024-07-02 16:17:48 +02:00 committed by GitHub
parent d849cac7f9
commit 74ffea5c0c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 114 additions and 0 deletions

25
examples/reset_reason.rs Normal file
View File

@ -0,0 +1,25 @@
//! This example demonstrates a how to ask for the reset reason and the wakeup reason.
use std::{thread, time};
use esp_idf_sys::{self as _}; // If using the `binstart` feature of `esp-idf-sys`, always keep this module imported
fn main() -> anyhow::Result<()> {
esp_idf_sys::link_patches();
let wakeup_reason = esp_idf_hal::reset::WakeupReason::get();
println!("Wakeup reason: {:?}", wakeup_reason);
let reset_reason = esp_idf_hal::reset::ResetReason::get();
println!("Reset reason: {:?}", reset_reason);
thread::sleep(time::Duration::from_millis(1000));
let sleep_micros = 2_000_000;
unsafe {
esp_idf_sys::esp_sleep_enable_timer_wakeup(sleep_micros);
println!("Going to deep sleep {} seconds", sleep_micros / 1_000_000);
esp_idf_sys::esp_deep_sleep_start();
// Software reset!
}
}

View File

@ -27,6 +27,53 @@ pub enum ResetReason {
TaskWatchdog,
/// Reset after exiting deep sleep mode
DeepSleep,
/// Reset by USB peripheral (introduced in IDF v5.1.4)
#[cfg(not(any(
esp_idf_version_major = "4",
all(esp_idf_version_major = "5", esp_idf_version_minor = "0"),
esp_idf_version_full = "5.1.0",
esp_idf_version_full = "5.1.1",
esp_idf_version_full = "5.1.2",
esp_idf_version_full = "5.1.3",
)))]
USBPeripheral,
/// Reset by JTAG (introduced in IDF v5.1.4)
#[cfg(not(any(
esp_idf_version_major = "4",
all(esp_idf_version_major = "5", esp_idf_version_minor = "0"),
esp_idf_version_full = "5.1.0",
esp_idf_version_full = "5.1.1",
esp_idf_version_full = "5.1.2",
esp_idf_version_full = "5.1.3",
)))]
JTAG,
/// Reset due to efuse error (introduced in IDF v5.2.2)
#[cfg(not(any(
esp_idf_version_major = "4",
all(esp_idf_version_major = "5", esp_idf_version_minor = "0"),
all(esp_idf_version_major = "5", esp_idf_version_minor = "1"),
esp_idf_version_full = "5.2.0",
esp_idf_version_full = "5.2.1",
)))]
EfuseError,
/// Reset due to power glitch detected (introduced in IDF v5.2.2)
#[cfg(not(any(
esp_idf_version_major = "4",
all(esp_idf_version_major = "5", esp_idf_version_minor = "0"),
all(esp_idf_version_major = "5", esp_idf_version_minor = "1"),
esp_idf_version_full = "5.2.0",
esp_idf_version_full = "5.2.1",
)))]
PowerGlitch,
/// Reset due to CPU lock up (introduced in IDF v5.2.2)
#[cfg(not(any(
esp_idf_version_major = "4",
all(esp_idf_version_major = "5", esp_idf_version_minor = "0"),
all(esp_idf_version_major = "5", esp_idf_version_minor = "1"),
esp_idf_version_full = "5.2.0",
esp_idf_version_full = "5.2.1",
)))]
CPULockup,
}
impl From<esp_reset_reason_t> for ResetReason {
@ -44,6 +91,48 @@ impl From<esp_reset_reason_t> for ResetReason {
esp_reset_reason_t_ESP_RST_BROWNOUT => Self::Brownout,
esp_reset_reason_t_ESP_RST_TASK_WDT => Self::TaskWatchdog,
esp_reset_reason_t_ESP_RST_DEEPSLEEP => Self::DeepSleep,
#[cfg(not(any(
esp_idf_version_major = "4",
all(esp_idf_version_major = "5", esp_idf_version_minor = "0"),
esp_idf_version_full = "5.1.0",
esp_idf_version_full = "5.1.1",
esp_idf_version_full = "5.1.2",
esp_idf_version_full = "5.1.3",
)))]
esp_reset_reason_t_ESP_RST_USB => Self::USBPeripheral,
#[cfg(not(any(
esp_idf_version_major = "4",
all(esp_idf_version_major = "5", esp_idf_version_minor = "0"),
esp_idf_version_full = "5.1.0",
esp_idf_version_full = "5.1.1",
esp_idf_version_full = "5.1.2",
esp_idf_version_full = "5.1.3",
)))]
esp_reset_reason_t_ESP_RST_JTAG => Self::JTAG,
#[cfg(not(any(
esp_idf_version_major = "4",
all(esp_idf_version_major = "5", esp_idf_version_minor = "0"),
all(esp_idf_version_major = "5", esp_idf_version_minor = "1"),
esp_idf_version_full = "5.2.0",
esp_idf_version_full = "5.2.1",
)))]
esp_reset_reason_t_ESP_RST_EFUSE => Self::EfuseError,
#[cfg(not(any(
esp_idf_version_major = "4",
all(esp_idf_version_major = "5", esp_idf_version_minor = "0"),
all(esp_idf_version_major = "5", esp_idf_version_minor = "1"),
esp_idf_version_full = "5.2.0",
esp_idf_version_full = "5.2.1",
)))]
esp_reset_reason_t_ESP_RST_PG => Self::PowerGlitch,
#[cfg(not(any(
esp_idf_version_major = "4",
all(esp_idf_version_major = "5", esp_idf_version_minor = "0"),
all(esp_idf_version_major = "5", esp_idf_version_minor = "1"),
esp_idf_version_full = "5.2.0",
esp_idf_version_full = "5.2.1",
)))]
esp_reset_reason_t_ESP_RST_CPU => Self::CPULockup,
_ => unreachable!(),
}
}