1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-08-02 11:58:32 +00:00

feat(core): improve power_manager backup ram data check [no changelog]

This commit is contained in:
kopecdav 2025-05-05 18:14:29 +02:00 committed by kopecdav
parent 7acac1a0fd
commit 704bf3ed7c
4 changed files with 25 additions and 17 deletions

View File

@ -186,6 +186,11 @@ backup_ram_status_t backup_ram_read_power_manager_data(
return BACKUP_RAM_DATA_CHECK_ERROR;
}
// If SoC is equal to 0.0f, battery critical flag must be set
if (pm_data->soc == 0.0f && !pm_data->bat_critical) {
return BACKUP_RAM_DATA_CHECK_ERROR;
}
return BACKUP_RAM_OK;
}

View File

@ -27,6 +27,9 @@
#include "../stwlc38/stwlc38.h"
#include "power_manager_internal.h"
#pragma GCC optimize ("O0")
// Global driver instance
pm_driver_t g_pm = {
.initialized = false,
@ -55,7 +58,7 @@ pm_status_t pm_init(bool skip_bootup_sequence) {
}
// Initialize fuel gauge
fuel_gauge_init(&(drv->fuel_gauge), PM_FUEL_GAUGE_R, PM_FUEL_GAUGE_Q,
fuel_gauge_init(&drv->fuel_gauge, PM_FUEL_GAUGE_R, PM_FUEL_GAUGE_Q,
PM_FUEL_GAUGE_R_AGGRESSIVE, PM_FUEL_GAUGE_Q_AGGRESSIVE,
PM_FUEL_GAUGE_P_INIT);
@ -76,8 +79,8 @@ pm_status_t pm_init(bool skip_bootup_sequence) {
} else {
// Backup RAM contain valid data
drv->state = pm_recovery_data.bootloader_exit_state;
drv->fuel_gauge.soc = pm_recovery_data.soc;
drv->fuel_gauge_request_new_guess = false;
fuel_gauge_set_soc(&drv->fuel_gauge,pm_recovery_data.soc);
}
drv->fuel_gauge_initialized = true;
@ -109,10 +112,6 @@ pm_status_t pm_init(bool skip_bootup_sequence) {
void pm_deinit(void) {
pm_driver_t* drv = &g_pm;
if(drv->fuel_gauge_initialized){
pm_store_data_to_backup_ram();
}
if (drv->monitoring_timer) {
systimer_delete(drv->monitoring_timer);
drv->monitoring_timer = NULL;
@ -123,6 +122,10 @@ void pm_deinit(void) {
drv->shutdown_timer = NULL;
}
if(drv->fuel_gauge_initialized){
pm_store_data_to_backup_ram();
}
npm1300_deinit();
stwlc38_deinit();
@ -228,9 +231,9 @@ pm_status_t pm_turn_on(void) {
}
// Poll until at least single PMIC measurement is done
while(drv->pmic_last_update_ms == 0){
}
while(drv->pmic_last_update_ms == 0){};
// Check if device has enough power to startup
if(drv->pmic_data.usb_status == 0x0 &&
drv->pmic_data.vbat < PM_BATTERY_UNDERVOLT_RECOVERY_THR_V){
return PM_REQUEST_REJECTED;
@ -243,16 +246,16 @@ pm_status_t pm_turn_on(void) {
return PM_REQUEST_REJECTED;
}
irq_key_t irq_key = irq_lock();
// Try to recover SoC from the backup RAM
backup_ram_power_manager_data_t pm_recovery_data;
backup_ram_status_t status =
backup_ram_read_power_manager_data(&pm_recovery_data);
if (status == BACKUP_RAM_OK && pm_recovery_data.soc != 0.0f) {
drv->fuel_gauge.soc = pm_recovery_data.soc;
fuel_gauge_set_soc(&drv->fuel_gauge, pm_recovery_data.soc);
} else {
// Wait for 1s to sample battery data
systick_delay_ms(1000);
pm_battery_initial_soc_guess();
}
@ -261,8 +264,6 @@ pm_status_t pm_turn_on(void) {
drv->fuel_gauge_initialized = true;
irq_unlock(irq_key);
return PM_OK;
}

View File

@ -89,8 +89,8 @@ typedef struct {
// Power source hardware state
npm1300_report_t pmic_data;
stwlc38_report_t wireless_data;
uint32_t pmic_last_update_ms;
uint32_t pmic_sampling_period_ms;
volatile uint32_t pmic_last_update_ms;
volatile uint32_t pmic_sampling_period_ms;
bool pmic_measurement_ready;
// Power source logical state

View File

@ -27,6 +27,8 @@
#include "../stwlc38/stwlc38.h"
#include "power_manager_internal.h"
#pragma GCC optimize ("O0")
void pm_monitor_power_sources(void) {
pm_driver_t* drv = &g_pm;
@ -133,7 +135,7 @@ void pm_pmic_data_ready(void* context, npm1300_report_t* report) {
drv->pmic_sampling_period_ms = PM_BATTERY_SAMPLING_PERIOD_MS;
} else {
// Timeout, reset the last update timestamp
drv->pmic_sampling_period_ms = drv->pmic_last_update_ms - systick_ms();
drv->pmic_sampling_period_ms = systick_ms() - drv->pmic_last_update_ms;
}
drv->pmic_last_update_ms = systick_ms();