diff options
-rw-r--r-- | common/charge_state_v2.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/common/charge_state_v2.c b/common/charge_state_v2.c index f693f99482..27bdbab410 100644 --- a/common/charge_state_v2.c +++ b/common/charge_state_v2.c @@ -46,8 +46,20 @@ static int manual_mode; /* volt/curr are no longer maintained by charger */ static unsigned int user_current_limit = -1U; test_export_static timestamp_t shutdown_warning_time; static timestamp_t precharge_start_time; + +/* Is battery connected but unresponsive after precharge? */ static int battery_seems_to_be_dead; + static int battery_seems_to_be_disconnected; + +/* + * Was battery removed? Set when we see BP_NO, cleared after the battery is + * reattached and becomes responsive. Used to indicate an error state after + * removal and trigger re-reading the battery static info when battery is + * reattached and responsive. + */ +static int battery_was_removed; + static int problems_exist; static int debugging; static int fake_state_of_charge = -1; @@ -307,6 +319,7 @@ static void dump_charge_state(void) ccprintf("battery_seems_to_be_dead = %d\n", battery_seems_to_be_dead); ccprintf("battery_seems_to_be_disconnected = %d\n", battery_seems_to_be_disconnected); + ccprintf("battery_was_removed = %d\n", battery_was_removed); ccprintf("debug output = %s\n", debugging ? "on" : "off"); #undef DUMP } @@ -657,6 +670,8 @@ void charger_task(void) if (curr.batt.is_present == BP_NO) { ASSERT(curr.ac); /* How are we running? */ curr.state = ST_IDLE; + curr.batt_is_charging = 0; + battery_was_removed = 1; goto wait_for_it; } @@ -759,15 +774,16 @@ void charger_task(void) } else #endif if (curr.state == ST_PRECHARGE || - battery_seems_to_be_dead) { + battery_seems_to_be_dead || + battery_was_removed) { CPRINTS("battery woke up"); /* Update the battery-specific values */ batt_info = battery_get_info(); need_static = 1; - } + } - battery_seems_to_be_dead = 0; + battery_seems_to_be_dead = battery_was_removed = 0; curr.state = ST_CHARGE; } @@ -916,7 +932,7 @@ enum charge_state charge_get_state(void) { switch (curr.state) { case ST_IDLE: - if (battery_seems_to_be_dead) + if (battery_seems_to_be_dead || battery_was_removed) return PWR_STATE_ERROR; return PWR_STATE_IDLE; case ST_DISCHARGE: |