diff --git a/core/embed/sys/power_manager/stm32u5/power_manager.c b/core/embed/sys/power_manager/stm32u5/power_manager.c index c3a7ba7815..14cf4e0e8e 100644 --- a/core/embed/sys/power_manager/stm32u5/power_manager.c +++ b/core/embed/sys/power_manager/stm32u5/power_manager.c @@ -116,6 +116,15 @@ pm_status_t pm_init(bool inherit_state) { // Enable charging by default drv->charging_enabled = true; + // Poll until fuel_gauge is initialized and first PMIC & WLC measurements + // propagates into power_monitor. + bool state_machine_stabilized; + do{ + irq_key_t irq_key = irq_lock(); + state_machine_stabilized = drv->state_machine_stabilized; + irq_unlock(irq_key); + }while(!state_machine_stabilized); + drv->initialized = true; return PM_OK; diff --git a/core/embed/sys/power_manager/stm32u5/power_manager_internal.h b/core/embed/sys/power_manager/stm32u5/power_manager_internal.h index 91274f3085..1151fa9255 100644 --- a/core/embed/sys/power_manager/stm32u5/power_manager_internal.h +++ b/core/embed/sys/power_manager/stm32u5/power_manager_internal.h @@ -69,6 +69,7 @@ typedef struct { // Power manager core driver structure typedef struct { bool initialized; + bool state_machine_stabilized; pm_internal_state_t state; pm_event_t event_flags; diff --git a/core/embed/sys/power_manager/stm32u5/power_monitoring.c b/core/embed/sys/power_manager/stm32u5/power_monitoring.c index 72c66ab932..45d73c8212 100644 --- a/core/embed/sys/power_manager/stm32u5/power_monitoring.c +++ b/core/embed/sys/power_manager/stm32u5/power_monitoring.c @@ -115,6 +115,9 @@ void pm_monitor_power_sources(void) { // Request fresh measurements npm1300_measure(pm_pmic_data_ready, NULL); drv->pmic_measurement_ready = false; + + drv->state_machine_stabilized = true; + } // PMIC measurement callback