diff options
author | Daisuke Nojiri <dnojiri@chromium.org> | 2018-03-26 13:37:00 -0700 |
---|---|---|
committer | ChromeOS Commit Bot <chromeos-commit-bot@chromium.org> | 2018-04-06 03:13:00 +0000 |
commit | 2a6fd1511b4d8df143d6cc848384deadfcf26132 (patch) | |
tree | b07479fec12a017f642d7094af43e7ad20bf607f /common | |
parent | 1ccb411f62439925eaf9a0ea3d15670ff55320b9 (diff) | |
download | chrome-ec-2a6fd1511b4d8df143d6cc848384deadfcf26132.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>
(cherry picked from commit 46b2618d72f67570a2a77711889b670aa64c6c51)
Reviewed-on: https://chromium-review.googlesource.com/998853
Reviewed-by: Philip Chen <philipchen@chromium.org>
Commit-Queue: Philip Chen <philipchen@chromium.org>
Tested-by: Philip Chen <philipchen@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 787e16d856..2008537a2d 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 */ @@ -1196,6 +1197,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; @@ -1375,7 +1382,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; @@ -1401,7 +1408,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; } @@ -1409,7 +1416,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; } @@ -1417,7 +1424,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 && @@ -1426,7 +1433,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 { @@ -1436,7 +1443,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 = @@ -1490,7 +1497,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: @@ -1524,7 +1531,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 |