From 19948372c751d75fba9e929cd28aa9ba11110922 Mon Sep 17 00:00:00 2001 From: kopecdav Date: Mon, 5 May 2025 11:26:49 +0200 Subject: [PATCH] feat(core): extend power manager backup ram data with battery critical flag [no changelog] --- .../embed/sys/backup_ram/inc/sys/backup_ram.h | 1 + .../sys/power_manager/stm32u5/power_control.c | 22 ++++++++----------- .../power_manager/stm32u5/power_monitoring.c | 9 +++++++- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/core/embed/sys/backup_ram/inc/sys/backup_ram.h b/core/embed/sys/backup_ram/inc/sys/backup_ram.h index d77f07ae27..e0a33762bc 100644 --- a/core/embed/sys/backup_ram/inc/sys/backup_ram.h +++ b/core/embed/sys/backup_ram/inc/sys/backup_ram.h @@ -45,6 +45,7 @@ typedef enum { */ typedef struct { float soc; // Captured state of charge <0, 1> + bool bat_critical; // Captures RTC time at which SOC was captured uint32_t last_capture_timestamp; // Captures power manager state at bootloader exit so it could be correctly diff --git a/core/embed/sys/power_manager/stm32u5/power_control.c b/core/embed/sys/power_manager/stm32u5/power_control.c index 64ac32850f..35f0f1062a 100644 --- a/core/embed/sys/power_manager/stm32u5/power_control.c +++ b/core/embed/sys/power_manager/stm32u5/power_control.c @@ -30,6 +30,7 @@ #ifdef USE_OPTIGA #include +#include #include #endif @@ -76,17 +77,15 @@ pm_status_t pm_control_hibernate() { } // Wait for the device to power off - systick_delay_ms(50); + //systick_delay_ms(50); return PM_ERROR; - } -void pm_control_suspend(){ - -// Clear all wakeup flags. From this point, any wakeup event that -// sets a wakeup flag causes this function to return. -pm_wakeup_flags_reset(); +void pm_control_suspend() { + // Clear all wakeup flags. From this point, any wakeup event that + // sets a wakeup flag causes this function to return. + pm_wakeup_flags_reset(); // Deinitialize all drivers that are not required in low-power mode // (e.g., USB, display, touch, haptic, etc.). @@ -122,9 +121,8 @@ pm_wakeup_flags_reset(); pm_wakeup_flags_t wakeup_flags = 0; while (true) { - pm_wakeup_flags_get(&wakeup_flags); - if(wakeup_flags != 0) { + if (wakeup_flags != 0) { // If any wakeup flag is set, exit the loop. break; } @@ -148,9 +146,8 @@ pm_wakeup_flags_reset(); } while (!pm_background_tasks_suspended() && (wakeup_flags == 0)); if (true) { - pm_wakeup_flags_get(&wakeup_flags); - if(wakeup_flags != 0) { + if (wakeup_flags != 0) { // If any wakeup flag is set, exit the loop. break; } @@ -214,7 +211,6 @@ pm_wakeup_flags_reset(); } - static void pm_background_tasks_suspend(void) { // stwlc38 // npm1300 @@ -225,4 +221,4 @@ static void pm_background_tasks_suspend(void) { static bool pm_background_tasks_suspended(void) { return true; } -static void pm_background_tasks_resume(void) {} \ No newline at end of file +static void pm_background_tasks_resume(void) {} diff --git a/core/embed/sys/power_manager/stm32u5/power_monitoring.c b/core/embed/sys/power_manager/stm32u5/power_monitoring.c index 0b17d5950e..affc153b78 100644 --- a/core/embed/sys/power_manager/stm32u5/power_monitoring.c +++ b/core/embed/sys/power_manager/stm32u5/power_monitoring.c @@ -117,6 +117,8 @@ void pm_monitor_power_sources(void) { // Process state machine with updated battery and power source information pm_process_state_machine(); + pm_store_data_to_backup_ram(); + // Request fresh measurements npm1300_measure(pm_pmic_data_ready, NULL); drv->pmic_measurement_ready = false; @@ -252,7 +254,12 @@ void pm_store_power_manager_data(pm_driver_t* drv) { backup_ram_power_manager_data_t pm_data = {0}; // Store the current state of the power manager - pm_data.soc = drv->fuel_gauge.soc; + if (drv->battery_critical) { + pm_data.soc = 0; + } else { + pm_data.soc = drv->fuel_gauge.soc; + } + pm_data.bat_critical = drv->battery_critical; pm_data.last_capture_timestamp = systick_ms(); // Store the data in backup RAM