summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRong Chang <rongchang@chromium.org>2012-10-08 20:39:40 +0800
committerRong Chang <rongchang@chromium.org>2012-10-16 00:58:08 -0700
commit0e24a2e6214ad2e9f137006e8d3dae26e0a117bf (patch)
tree26d6d07bb10b901769566460a70778a290d38ac8
parentfcd0f0a5e485653d40d6409802d1a26c4595d605 (diff)
downloadchrome-ec-0e24a2e6214ad2e9f137006e8d3dae26e0a117bf.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. Original-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> (cherry picked from commit e679d8504d6d34aa8e9d7d7fb9a78b38f35e9415) Change-Id: I954393c9055c1b412bb3c79a8ef0c328f92b21ba Reviewed-on: https://gerrit.chromium.org/gerrit/35662 Reviewed-by: Rong Chang <rongchang@chromium.org> Tested-by: Rong Chang <rongchang@chromium.org>
-rw-r--r--common/charge_state.c24
-rw-r--r--include/charge_state.h1
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.