summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorDaisuke Nojiri <dnojiri@chromium.org>2018-03-26 13:37:00 -0700
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2018-04-06 03:13:00 +0000
commit2a6fd1511b4d8df143d6cc848384deadfcf26132 (patch)
treeb07479fec12a017f642d7094af43e7ad20bf607f /common
parent1ccb411f62439925eaf9a0ea3d15670ff55320b9 (diff)
downloadchrome-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.c24
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