mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-07-03 05:12:34 +00:00
feat(core): extend power manager backup ram data with battery critical flag
[no changelog]
This commit is contained in:
parent
8e7d5a2a01
commit
19948372c7
@ -45,6 +45,7 @@ typedef enum {
|
|||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
float soc; // Captured state of charge <0, 1>
|
float soc; // Captured state of charge <0, 1>
|
||||||
|
bool bat_critical;
|
||||||
// Captures RTC time at which SOC was captured
|
// Captures RTC time at which SOC was captured
|
||||||
uint32_t last_capture_timestamp;
|
uint32_t last_capture_timestamp;
|
||||||
// Captures power manager state at bootloader exit so it could be correctly
|
// Captures power manager state at bootloader exit so it could be correctly
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
|
|
||||||
#ifdef USE_OPTIGA
|
#ifdef USE_OPTIGA
|
||||||
#include <sec/optiga_config.h>
|
#include <sec/optiga_config.h>
|
||||||
|
#include <sec/optiga_hal.h>
|
||||||
#include <sec/optiga_transport.h>
|
#include <sec/optiga_transport.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -76,17 +77,15 @@ pm_status_t pm_control_hibernate() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Wait for the device to power off
|
// Wait for the device to power off
|
||||||
systick_delay_ms(50);
|
//systick_delay_ms(50);
|
||||||
|
|
||||||
return PM_ERROR;
|
return PM_ERROR;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void pm_control_suspend(){
|
void pm_control_suspend() {
|
||||||
|
// Clear all wakeup flags. From this point, any wakeup event that
|
||||||
// Clear all wakeup flags. From this point, any wakeup event that
|
// sets a wakeup flag causes this function to return.
|
||||||
// sets a wakeup flag causes this function to return.
|
pm_wakeup_flags_reset();
|
||||||
pm_wakeup_flags_reset();
|
|
||||||
|
|
||||||
// Deinitialize all drivers that are not required in low-power mode
|
// Deinitialize all drivers that are not required in low-power mode
|
||||||
// (e.g., USB, display, touch, haptic, etc.).
|
// (e.g., USB, display, touch, haptic, etc.).
|
||||||
@ -122,9 +121,8 @@ pm_wakeup_flags_reset();
|
|||||||
pm_wakeup_flags_t wakeup_flags = 0;
|
pm_wakeup_flags_t wakeup_flags = 0;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
|
|
||||||
pm_wakeup_flags_get(&wakeup_flags);
|
pm_wakeup_flags_get(&wakeup_flags);
|
||||||
if(wakeup_flags != 0) {
|
if (wakeup_flags != 0) {
|
||||||
// If any wakeup flag is set, exit the loop.
|
// If any wakeup flag is set, exit the loop.
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -148,9 +146,8 @@ pm_wakeup_flags_reset();
|
|||||||
} while (!pm_background_tasks_suspended() && (wakeup_flags == 0));
|
} while (!pm_background_tasks_suspended() && (wakeup_flags == 0));
|
||||||
|
|
||||||
if (true) {
|
if (true) {
|
||||||
|
|
||||||
pm_wakeup_flags_get(&wakeup_flags);
|
pm_wakeup_flags_get(&wakeup_flags);
|
||||||
if(wakeup_flags != 0) {
|
if (wakeup_flags != 0) {
|
||||||
// If any wakeup flag is set, exit the loop.
|
// If any wakeup flag is set, exit the loop.
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -214,7 +211,6 @@ pm_wakeup_flags_reset();
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void pm_background_tasks_suspend(void) {
|
static void pm_background_tasks_suspend(void) {
|
||||||
// stwlc38
|
// stwlc38
|
||||||
// npm1300
|
// npm1300
|
||||||
|
@ -117,6 +117,8 @@ void pm_monitor_power_sources(void) {
|
|||||||
// Process state machine with updated battery and power source information
|
// Process state machine with updated battery and power source information
|
||||||
pm_process_state_machine();
|
pm_process_state_machine();
|
||||||
|
|
||||||
|
pm_store_data_to_backup_ram();
|
||||||
|
|
||||||
// Request fresh measurements
|
// Request fresh measurements
|
||||||
npm1300_measure(pm_pmic_data_ready, NULL);
|
npm1300_measure(pm_pmic_data_ready, NULL);
|
||||||
drv->pmic_measurement_ready = false;
|
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};
|
backup_ram_power_manager_data_t pm_data = {0};
|
||||||
|
|
||||||
// Store the current state of the power manager
|
// Store the current state of the power manager
|
||||||
|
if (drv->battery_critical) {
|
||||||
|
pm_data.soc = 0;
|
||||||
|
} else {
|
||||||
pm_data.soc = drv->fuel_gauge.soc;
|
pm_data.soc = drv->fuel_gauge.soc;
|
||||||
|
}
|
||||||
|
pm_data.bat_critical = drv->battery_critical;
|
||||||
pm_data.last_capture_timestamp = systick_ms();
|
pm_data.last_capture_timestamp = systick_ms();
|
||||||
|
|
||||||
// Store the data in backup RAM
|
// Store the data in backup RAM
|
||||||
|
Loading…
Reference in New Issue
Block a user