From 90468a2220f07129ad10cea3b982e4dc189496b9 Mon Sep 17 00:00:00 2001 From: kopecdav Date: Wed, 23 Apr 2025 09:30:24 +0200 Subject: [PATCH] feat(core): add power manager to revison C [no changelog] --- .../sys/power_manager/stm32u5/power_manager.c | 2 +- .../stm32u5/power_manager_internal.h | 5 +-- .../power_manager/stm32u5/power_monitoring.c | 33 +++++++++++-------- .../models/T3W1/trezor_t3w1_revC.py | 11 +++++++ 4 files changed, 34 insertions(+), 17 deletions(-) diff --git a/core/embed/sys/power_manager/stm32u5/power_manager.c b/core/embed/sys/power_manager/stm32u5/power_manager.c index 43842f9990..26b805431f 100644 --- a/core/embed/sys/power_manager/stm32u5/power_manager.c +++ b/core/embed/sys/power_manager/stm32u5/power_manager.c @@ -59,7 +59,7 @@ power_manager_status_t power_manager_init(power_manager_state_t initial_state) { } // Clear fuel gauge state - memcpy(drv->fuel_gauge, 0, sizeof(fuel_gauge_state_t)); + memset(&drv->fuel_gauge, 0, sizeof(fuel_gauge_state_t)); // Initialize fuel gauge fuel_gauge_init(&(drv->fuel_gauge), POWER_MANAGER_FUEL_GAUGE_R, 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 68febc15af..72ae97ba12 100644 --- a/core/embed/sys/power_manager/stm32u5/power_manager_internal.h +++ b/core/embed/sys/power_manager/stm32u5/power_manager_internal.h @@ -68,8 +68,8 @@ typedef struct { bool fuel_gauge_initialized; power_manager_sampling_data_t bat_sampling_buf[ POWER_MANAGER_BATTERY_SAMPLING_BUF_SIZE]; - uint8_t bat_sampling_buf_tail_idx = 0; - uint8_t bat_sampling_buf_head_idx = 0; + uint8_t bat_sampling_buf_tail_idx; + uint8_t bat_sampling_buf_head_idx; // Battery charging state @@ -114,6 +114,7 @@ void pm_monitor_power_sources(void); void pm_process_state_machine(void); void pm_pmic_data_ready(void* context, npm1300_report_t* report); void pm_charging_controller(power_manager_driver_t* drv); +void pm_battery_sampling(float vbat, float ibat, float ntc_temp); void pm_battery_initial_soc_guess(void); // State handlers diff --git a/core/embed/sys/power_manager/stm32u5/power_monitoring.c b/core/embed/sys/power_manager/stm32u5/power_monitoring.c index 9f66ec7294..79bad5cfb2 100644 --- a/core/embed/sys/power_manager/stm32u5/power_monitoring.c +++ b/core/embed/sys/power_manager/stm32u5/power_monitoring.c @@ -41,6 +41,9 @@ void pm_monitor_power_sources(void) { drv->pmic_data.ntc_temp); } else { + pm_battery_sampling(drv->pmic_data.vbat, drv->pmic_data.ibat, + drv->pmic_data.ntc_temp); + // Battery sampling period, collect data before initial guess is made. fuel_gauge_initial_guess(&drv->fuel_gauge, drv->pmic_data.vbat, drv->pmic_data.ibat, drv->pmic_data.ntc_temp); @@ -169,22 +172,22 @@ void pm_battery_sampling(float vbat, float ibat, float ntc_temp) { power_manager_driver_t* drv = &g_power_manager; // Store battery data in the buffer - drv->bat_sampling_buf[bat_sampling_buf_head_idx].vbat = vbat; - drv->bat_sampling_buf[bat_sampling_buf_head_idx].ibat = ibat; - drv->bat_sampling_buf[bat_sampling_buf_head_idx].ntc_temp = ntc_temp; + drv->bat_sampling_buf[drv->bat_sampling_buf_head_idx].vbat = vbat; + drv->bat_sampling_buf[drv->bat_sampling_buf_head_idx].ibat = ibat; + drv->bat_sampling_buf[drv->bat_sampling_buf_head_idx].ntc_temp = ntc_temp; // Update head index drv->bat_sampling_buf_head_idx++; - if (bat_sampling_buf_head_idx >= POWER_MANAGER_BAT_DATA_BUF_SIZE) { - bat_sampling_buf_head_idx = 0; + if (drv->bat_sampling_buf_head_idx >= POWER_MANAGER_BATTERY_SAMPLING_BUF_SIZE) { + drv->bat_sampling_buf_head_idx = 0; } // Check if the buffer is full - if (bat_sampling_buf_head_idx == bat_sampling_buf_tail_idx) { + if (drv->bat_sampling_buf_head_idx == drv->bat_sampling_buf_tail_idx) { // Buffer is full, move tail index forward - bat_sampling_buf_tail_idx++; - if (bat_sampling_buf_tail_idx >= POWER_MANAGER_BAT_DATA_BUF_SIZE) { - bat_sampling_buf_tail_idx = 0; + drv->bat_sampling_buf_tail_idx++; + if (drv->bat_sampling_buf_tail_idx >= POWER_MANAGER_BATTERY_SAMPLING_BUF_SIZE) { + drv->bat_sampling_buf_tail_idx = 0; } } @@ -194,24 +197,26 @@ void pm_battery_initial_soc_guess(void){ power_manager_driver_t* drv = &g_power_manager; // Check if the buffer is full - if (bat_sampling_buf_head_idx == bat_sampling_buf_tail_idx) { + if (drv->bat_sampling_buf_head_idx == drv->bat_sampling_buf_tail_idx) { // Buffer is empty, no data to process return; } // Calculate average voltage, current and temperature from the sampling // buffer and run the fuel gauge initial guess - uint8_t buf_idx = bat_sampling_buf_tail_idx; + uint8_t buf_idx = drv->bat_sampling_buf_tail_idx; uint8_t samples_count = 0; - float vbat_g, ibat_g, ntc_temp_g = 0.0f; - while(bat_sampling_buf_head_idx != buf_idx) { + float vbat_g = 0.0f; + float ibat_g = 0.0f; + float ntc_temp_g = 0.0f; + while(drv->bat_sampling_buf_head_idx != buf_idx) { vbat_g += drv->bat_sampling_buf[buf_idx].vbat; ibat_g += drv->bat_sampling_buf[buf_idx].ibat; ntc_temp_g += drv->bat_sampling_buf[buf_idx].ntc_temp; buf_idx++; - if (buf_idx >= POWER_MANAGER_BAT_DATA_BUF_SIZE) { + if (buf_idx >= POWER_MANAGER_BATTERY_SAMPLING_BUF_SIZE) { buf_idx = 0; } diff --git a/core/site_scons/models/T3W1/trezor_t3w1_revC.py b/core/site_scons/models/T3W1/trezor_t3w1_revC.py index a00bfb435a..2c3a60d3f7 100644 --- a/core/site_scons/models/T3W1/trezor_t3w1_revC.py +++ b/core/site_scons/models/T3W1/trezor_t3w1_revC.py @@ -208,6 +208,17 @@ def configure( paths += ["embed/util/hw_revision/inc"] sources += ["embed/util/hw_revision/stm32/hw_revision.c"] + if "power_manager" in features_wanted: + sources += [ + "embed/sys/power_manager/stm32u5/power_manager.c", + "embed/sys/power_manager/stm32u5/power_monitoring.c", + "embed/sys/power_manager/stm32u5/power_states.c", + ] + paths += ["embed/sys/power_manager/stm32u5/inc/"] + paths += ["embed/sys/power_manager/inc"] + defines += [("USE_POWER_MANAGER", "1")] + features_available.append("power_manager") + defines += [ "FRAMEBUFFER", "DISPLAY_RGBA8888",