diff options
author | Wonjoon Lee <woojoo.lee@samsung.com> | 2016-11-08 19:05:51 +0900 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2017-01-30 16:48:44 -0800 |
commit | 21b47a9ee5a30388184c4f767b8997da63d9bdd0 (patch) | |
tree | 73368fd5fa1763d836861d3d6106e0d13deb3aaa | |
parent | 93951a491dd00e20addc1ff99c2896bb9752e665 (diff) | |
download | chrome-ec-21b47a9ee5a30388184c4f767b8997da63d9bdd0.tar.gz |
kevin: discharge when battery is near full
For device that are using ceramic caps, when battery is full, discharge
to 97% and then charge again until the battery is full. This should also
help us meet CEC energy spec.
BUG=chrome-os-partner:56255
BRANCH=gru
TEST=Manual on kevin, insert charger with battery at 97%, verify battery
does charge until 100%, and then discharge down to 96% and verify battery
charges. Charge to 100% again.
Change-Id: I5099cbbb1228823cc611c456e7e3d8311f1c94d6
Signed-off-by: Wonjoon Lee <woojoo.lee@samsung.com>
Reviewed-on: https://chromium-review.googlesource.com/434220
Commit-Ready: Shawn N <shawnn@chromium.org>
Tested-by: Shawn N <shawnn@chromium.org>
Reviewed-by: Shawn N <shawnn@chromium.org>
-rw-r--r-- | board/kevin/battery.c | 21 | ||||
-rw-r--r-- | board/kevin/led_gru.c | 3 | ||||
-rw-r--r-- | board/kevin/led_kevin.c | 6 |
3 files changed, 20 insertions, 10 deletions
diff --git a/board/kevin/battery.c b/board/kevin/battery.c index 50df1d0258..019dad2f3c 100644 --- a/board/kevin/battery.c +++ b/board/kevin/battery.c @@ -108,8 +108,8 @@ enum battery_disconnect_state battery_get_disconnect_state(void) int charger_profile_override(struct charge_state_data *curr) { - static int prev_state = ST_IDLE; const struct battery_info *batt_info = battery_get_info(); + int now_discharging; /* battery temp in 0.1 deg C */ int bat_temp_c = curr->batt.temperature - 2731; @@ -117,19 +117,22 @@ int charger_profile_override(struct charge_state_data *curr) if (curr->state == ST_CHARGE) { /* Don't charge if outside of allowable temperature range */ if (bat_temp_c >= batt_info->charging_max_c * 10 || - bat_temp_c < batt_info->charging_min_c * 10 || - /* Don't start charging if battery is nearly full */ - (prev_state != ST_CHARGE && - curr->batt.state_of_charge > 95) || - /* Don't charge if battery voltage is approaching max */ - curr->batt.voltage > batt_info->voltage_max - 10) { + bat_temp_c < batt_info->charging_min_c * 10) { curr->requested_current = curr->requested_voltage = 0; curr->batt.flags &= ~BATT_FLAG_WANT_CHARGE; curr->state = ST_IDLE; - } + now_discharging = 0; + /* Don't start charging if battery is nearly full */ + } else if (curr->batt.status & STATUS_FULLY_CHARGED) { + curr->requested_current = curr->requested_voltage = 0; + curr->batt.flags &= ~BATT_FLAG_WANT_CHARGE; + curr->state = ST_DISCHARGE; + now_discharging = 1; + } else + now_discharging = 0; + charger_discharge_on_ac(now_discharging); } - prev_state = curr->state; return 0; } diff --git a/board/kevin/led_gru.c b/board/kevin/led_gru.c index 35b9e22117..f02ecb868e 100644 --- a/board/kevin/led_gru.c +++ b/board/kevin/led_gru.c @@ -106,6 +106,9 @@ static void gru_led_set_battery(void) else if (charge_get_percent() < 10) bat_led_set_color((battery_second & 3) ? LED_OFF : LED_AMBER); + else if (charge_get_percent() >= BATTERY_LEVEL_NEAR_FULL && + (chflags & CHARGE_FLAG_EXTERNAL_POWER)) + bat_led_set_color(LED_GREEN); else bat_led_set_color(LED_OFF); break; diff --git a/board/kevin/led_kevin.c b/board/kevin/led_kevin.c index 21c1d0fe95..a06c1553ef 100644 --- a/board/kevin/led_kevin.c +++ b/board/kevin/led_kevin.c @@ -86,7 +86,11 @@ static void kevin_led_set_power_battery(void) /* CHIPSET_STATE_OFF */ switch (charge_get_state()) { case PWR_STATE_DISCHARGE: - set_color(LED_OFF); + if ((charge_get_flags() & CHARGE_FLAG_EXTERNAL_POWER) && + charge_get_percent() >= BATTERY_LEVEL_NEAR_FULL) + set_color(LED_GREEN); + else + set_color(LED_OFF); break; case PWR_STATE_CHARGE: set_color(LED_RED); |