1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-06-26 09:52:34 +00:00

feat(core/prodtest): limit charging in prodtest to 70% SOC

[no changelog]
This commit is contained in:
tychovrahe 2025-05-08 20:05:19 +02:00 committed by kopecdav
parent 278a09f4c5
commit 2e23349419
5 changed files with 38 additions and 1 deletions

View File

@ -194,7 +194,7 @@ static void drivers_init(void) {
#endif #endif
#ifdef USE_POWER_MANAGER #ifdef USE_POWER_MANAGER
pm_init(true); pm_init(true);
pm_turn_on(); pm_set_soc_limit(70);
#endif #endif
display_init(DISPLAY_RESET_CONTENT); display_init(DISPLAY_RESET_CONTENT);

View File

@ -114,3 +114,4 @@ pm_status_t pm_store_data_to_backup_ram();
pm_status_t pm_wakeup_flags_set(pm_wakeup_flags_t flags); pm_status_t pm_wakeup_flags_set(pm_wakeup_flags_t flags);
pm_status_t pm_wakeup_flags_reset(void); pm_status_t pm_wakeup_flags_reset(void);
pm_status_t pm_wakeup_flags_get(pm_wakeup_flags_t* flags); pm_status_t pm_wakeup_flags_get(pm_wakeup_flags_t* flags);
pm_status_t pm_set_soc_limit(uint8_t limit);

View File

@ -117,6 +117,9 @@ pm_status_t pm_init(bool inherit_state) {
drv->charging_enabled = true; drv->charging_enabled = true;
pm_charging_set_max_current(PM_BATTERY_CHARGING_CURRENT_MAX); pm_charging_set_max_current(PM_BATTERY_CHARGING_CURRENT_MAX);
// Set default SOC limit
drv->soc_limit = 100;
// Poll until fuel_gauge is initialized and first PMIC & WLC measurements // Poll until fuel_gauge is initialized and first PMIC & WLC measurements
// propagates into power_monitor. // propagates into power_monitor.
bool state_machine_stabilized; bool state_machine_stabilized;
@ -407,6 +410,25 @@ pm_status_t pm_wakeup_flags_get(pm_wakeup_flags_t* flags) {
return PM_OK; return PM_OK;
} }
pm_status_t pm_set_soc_limit(uint8_t limit) {
pm_driver_t* drv = &g_pm;
if (!drv->initialized) {
return PM_NOT_INITIALIZED;
}
if (limit > 100) {
return PM_ERROR;
}
if (limit <= PM_SOC_LIMIT_HYSTERESIS) {
return PM_ERROR;
}
drv->soc_limit = limit;
return PM_OK;
}
// Timer handlers // Timer handlers
static void pm_monitoring_timer_handler(void* context) { static void pm_monitoring_timer_handler(void* context) {
pm_monitor_power_sources(); pm_monitor_power_sources();

View File

@ -35,6 +35,7 @@
#define PM_BATTERY_UNDERVOLT_RECOVERY_THR_V 3.1f #define PM_BATTERY_UNDERVOLT_RECOVERY_THR_V 3.1f
#define PM_BATTERY_UNDERVOLT_RECOVERY_WPC_THR_V 3.2f #define PM_BATTERY_UNDERVOLT_RECOVERY_WPC_THR_V 3.2f
#define PM_BATTERY_LOW_THRESHOLD_SOC 15 #define PM_BATTERY_LOW_THRESHOLD_SOC 15
#define PM_SOC_LIMIT_HYSTERESIS 5
#define PM_BATTERY_CHARGING_CURRENT_MAX PMIC_CHARGING_LIMIT_MAX #define PM_BATTERY_CHARGING_CURRENT_MAX PMIC_CHARGING_LIMIT_MAX
#define PM_BATTERY_CHARGING_CURRENT_MIN PMIC_CHARGING_LIMIT_MIN #define PM_BATTERY_CHARGING_CURRENT_MIN PMIC_CHARGING_LIMIT_MIN
#define PM_BATTERY_SAMPLING_BUF_SIZE 10 #define PM_BATTERY_SAMPLING_BUF_SIZE 10
@ -67,6 +68,8 @@ typedef struct {
uint8_t bat_sampling_buf_tail_idx; uint8_t bat_sampling_buf_tail_idx;
uint8_t bat_sampling_buf_head_idx; uint8_t bat_sampling_buf_head_idx;
uint8_t soc_ceiled; uint8_t soc_ceiled;
uint8_t soc_limit;
bool soc_limit_reached;
// Battery charging state // Battery charging state
bool charging_enabled; bool charging_enabled;

View File

@ -188,6 +188,17 @@ void pm_charging_controller(pm_driver_t* drv) {
pmic_set_charging_limit(drv->charging_current_target_ma); pmic_set_charging_limit(drv->charging_current_target_ma);
} }
if (drv->soc_ceiled >= drv->soc_limit) {
drv->soc_limit_reached = true;
} else if (drv->soc_ceiled < drv->soc_limit - PM_SOC_LIMIT_HYSTERESIS) {
drv->soc_limit_reached = false;
}
if (drv->soc_limit_reached) {
// Set charging current limit to 0
drv->charging_current_target_ma = 0;
}
if (drv->charging_current_target_ma == 0) { if (drv->charging_current_target_ma == 0) {
pmic_set_charging(false); pmic_set_charging(false);
} else { } else {