diff options
author | Daisuke Nojiri <dnojiri@chromium.org> | 2018-03-26 13:37:00 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2018-03-28 19:34:32 -0700 |
commit | 46b2618d72f67570a2a77711889b670aa64c6c51 (patch) | |
tree | 9c4aa3268b42d2b6e5c6bed97dde5e9a8224cdee /common | |
parent | 2da18f938d64462ac62f6a77f46d05237ed30096 (diff) | |
download | chrome-ec-46b2618d72f67570a2a77711889b670aa64c6c51.tar.gz |
chgstv2: Notify charge state transition
Currently, charge state changes (i.e. enum charge_state_v2) are not
announced. Because of this, a charge LED is controlled by HOOK_TICK
(and polling charge status by charge_get_state).
Instead of checking charge status every 200 msec (or 500 msec), we
should change a charge LED only when charge status changes.
This patch makes HOOK_BATTERY_SOC_CHANGE get notified when charge
state transitions.
BUG=chromium:824942
BRANCH=none
TEST=On Nami, try AC plug/unplug, battery connect/disconnect.
Change-Id: I47a9542035666636d55f414e857d55ec36d69638
Signed-off-by: Daisuke Nojiri <dnojiri@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/981397
Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
Diffstat (limited to 'common')
-rw-r--r-- | common/charge_state_v2.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/common/charge_state_v2.c b/common/charge_state_v2.c index 1c5b08ecd2..a5e8aea37e 100644 --- a/common/charge_state_v2.c +++ b/common/charge_state_v2.c @@ -52,6 +52,7 @@ static int charge_request(int voltage, int current); */ static const struct battery_info *batt_info; static struct charge_state_data curr; +static enum charge_state_v2 prev_state; static int prev_ac, prev_charge, prev_full; static enum battery_present prev_bp; static int is_full; /* battery not accepting current */ @@ -1307,6 +1308,12 @@ static void notify_host_of_low_battery(void) #endif } +static void set_charge_state(enum charge_state_v2 state) +{ + prev_state = curr.state; + curr.state = state; +} + const struct batt_params *charger_current_battery_params(void) { return &curr.batt; @@ -1486,7 +1493,7 @@ void charger_task(void *u) if (curr.batt.is_present == BP_NO) { if (!curr.ac) CPRINTS("running with no battery and no AC"); - curr.state = ST_IDLE; + set_charge_state(ST_IDLE); curr.batt_is_charging = 0; battery_was_removed = 1; goto wait_for_it; @@ -1512,7 +1519,7 @@ void charger_task(void *u) battery_critical = shutdown_on_critical_battery(); if (!curr.ac) { - curr.state = ST_DISCHARGE; + set_charge_state(ST_DISCHARGE); goto wait_for_it; } @@ -1520,7 +1527,7 @@ void charger_task(void *u) /* Used for factory tests. */ if (chg_ctl_mode != CHARGE_CONTROL_NORMAL) { - curr.state = ST_IDLE; + set_charge_state(ST_IDLE); goto wait_for_it; } @@ -1528,7 +1535,7 @@ void charger_task(void *u) if (!(curr.batt.flags & BATT_FLAG_RESPONSIVE)) { if (battery_seems_to_be_dead || battery_is_cut_off()) { /* It's dead, do nothing */ - curr.state = ST_IDLE; + set_charge_state(ST_IDLE); curr.requested_voltage = 0; curr.requested_current = 0; } else if (curr.state == ST_PRECHARGE && @@ -1537,7 +1544,7 @@ void charger_task(void *u) /* We've tried long enough, give up */ CPRINTS("battery seems to be dead"); battery_seems_to_be_dead = 1; - curr.state = ST_IDLE; + set_charge_state(ST_IDLE); curr.requested_voltage = 0; curr.requested_current = 0; } else { @@ -1547,7 +1554,7 @@ void charger_task(void *u) precharge_start_time = get_time(); need_static = 1; } - curr.state = ST_PRECHARGE; + set_charge_state(ST_PRECHARGE); curr.requested_voltage = batt_info->voltage_max; curr.requested_current = @@ -1601,7 +1608,7 @@ void charger_task(void *u) } battery_seems_to_be_dead = battery_was_removed = 0; - curr.state = ST_CHARGE; + set_charge_state(ST_CHARGE); } wait_for_it: @@ -1635,7 +1642,8 @@ wait_for_it: #ifdef CONFIG_EC_EC_COMM_BATTERY_MASTER (charge_base != prev_charge_base) || #endif - (is_full != prev_full)) { + (is_full != prev_full) || + (curr.state != prev_state)) { show_charging_progress(); prev_charge = curr.batt.state_of_charge; #ifdef CONFIG_EC_EC_COMM_BATTERY_MASTER |