diff options
-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. |