diff options
author | Rong Chang <rongchang@chromium.org> | 2012-10-08 20:39:40 +0800 |
---|---|---|
committer | Gerrit <chrome-bot@google.com> | 2012-10-08 23:05:45 -0700 |
commit | e679d8504d6d34aa8e9d7d7fb9a78b38f35e9415 (patch) | |
tree | 26d6d07bb10b901769566460a70778a290d38ac8 | |
parent | fcd0f0a5e485653d40d6409802d1a26c4595d605 (diff) | |
download | chrome-ec-e679d8504d6d34aa8e9d7d7fb9a78b38f35e9415.tar.gz |
link: Revive under voltage protection battery pack
Experiments showed that some UVP batteries took ~30 seconds to restart
its gas gauge IC. This change adds 30 seconds polling check to determine
the condition.
Signed-off-by: Rong Chang <rongchang@chromium.org>
BRANCH=link
BUG=chrome-os-partner:13923
BUG=chrome-os-partner:14094
TEST=manual
Disconnect battery and plug in charger. The charging LED should turn
red after 30 seconds.
Change-Id: I425e63c428aeeaf1468bc2f9886457de1145cada
Reviewed-on: https://gerrit.chromium.org/gerrit/34886
Reviewed-by: Randall Spangler <rspangler@chromium.org>
Commit-Ready: Rong Chang <rongchang@chromium.org>
Tested-by: Rong Chang <rongchang@chromium.org>
-rw-r--r-- | common/charge_state.c | 24 | ||||
-rw-r--r-- | include/charge_state.h | 1 |
2 files changed, 21 insertions, 4 deletions
diff --git a/common/charge_state.c b/common/charge_state.c index 3a91afd273..8b4c6219f8 100644 --- a/common/charge_state.c +++ b/common/charge_state.c @@ -178,14 +178,29 @@ static int state_common(struct power_state_context *ctx) rv = battery_temperature(&batt->temperature); if (rv) { /* Check low battery condition and retry */ - if (curr->ac && !(curr->error & F_CHARGER_MASK) && + if (curr->ac && ctx->battery_present == 1 && + !(curr->error & F_CHARGER_MASK) && (curr->charging_voltage == 0 || curr->charging_current == 0)) { - charger_set_voltage(ctx->battery->voltage_min); + ctx->battery_present = 0; + /* + * Try to revive ultra low voltage pack. + * Charge battery pack with minimum current + * and maximum voltage for 30 seconds. + */ + charger_set_voltage(ctx->battery->voltage_max); charger_set_current(ctx->charger->current_min); - usleep(SECOND); - rv = battery_temperature(&batt->temperature); + for (d = 0; d < 30; d++) { + usleep(SECOND); + rv = battery_temperature(&batt->temperature); + if (rv == 0) { + ctx->battery_present = 1; + break; + } + } } + } else { + ctx->battery_present = 1; } if (rv) @@ -594,6 +609,7 @@ void charge_state_machine_task(void) ctx->trickle_charging_time.val = 0; ctx->battery = battery_get_info(); ctx->charger = charger_get_info(); + ctx->battery_present = 1; /* Setup LPC direct memmap */ ctx->memmap_batt_volt = diff --git a/include/charge_state.h b/include/charge_state.h index d3b310607e..eda78abfd9 100644 --- a/include/charge_state.h +++ b/include/charge_state.h @@ -114,6 +114,7 @@ struct power_state_context { timestamp_t charger_update_time; timestamp_t trickle_charging_time; timestamp_t voltage_debounce_time; + int battery_present; }; /* Trickle charging state handler. |