diff options
author | Derek Basehore <dbasehore@google.com> | 2023-05-04 14:55:37 -0700 |
---|---|---|
committer | Chromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2023-05-05 03:02:23 +0000 |
commit | aeeadc2b31fa829b66c1e4366346d2dc81d03e76 (patch) | |
tree | 302e9fafdd44e6b7b3bed39f84241b73c14da550 | |
parent | 694075a660be40442a40aa20ef4aa99ca6481572 (diff) | |
download | chrome-ec-aeeadc2b31fa829b66c1e4366346d2dc81d03e76.tar.gz |
chgstv2: Always discharge if soc is > sustainer_soc.upper
For the Charge Limit feature, we need to discharge down to the upper
limit for the battery sustainer. The Charge Limit feature requires that
the system never charge above 80%, so if the feature is enabled when the
system is over that, it needs to discharge down to 80%.
BUG=b:222619859
TEST=run-sbs_charging_v2
Change-Id: I3f65743144de64411484dd3f2aa6c5fd681a47c9
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/4507756
Commit-Queue: Derek Basehore <dbasehore@chromium.org>
Tested-by: Derek Basehore <dbasehore@chromium.org>
Reviewed-by: Daisuke Nojiri <dnojiri@chromium.org>
-rw-r--r-- | common/charge_state_v2.c | 16 | ||||
-rw-r--r-- | test/sbs_charging_v2.c | 4 |
2 files changed, 12 insertions, 8 deletions
diff --git a/common/charge_state_v2.c b/common/charge_state_v2.c index 1970b51a58..2835f6b7f8 100644 --- a/common/charge_state_v2.c +++ b/common/charge_state_v2.c @@ -1432,11 +1432,12 @@ static void sustain_battery_soc(void) */ switch (mode) { case CHARGE_CONTROL_NORMAL: - /* Going up */ - if (sustain_soc.upper < soc) - mode = sustain_soc.upper == sustain_soc.lower ? - CHARGE_CONTROL_IDLE : - CHARGE_CONTROL_DISCHARGE; + /* Going up. Always DISCHARGE if the soc is above upper. */ + if (sustain_soc.lower == soc && soc == sustain_soc.upper) { + mode = CHARGE_CONTROL_IDLE; + } else if (sustain_soc.upper < soc) { + mode = CHARGE_CONTROL_DISCHARGE; + } break; case CHARGE_CONTROL_IDLE: /* Discharging naturally */ @@ -1445,8 +1446,11 @@ static void sustain_battery_soc(void) break; case CHARGE_CONTROL_DISCHARGE: /* Discharging actively. */ - if (soc < sustain_soc.lower) + if (sustain_soc.lower == soc && soc == sustain_soc.upper) { + mode = CHARGE_CONTROL_IDLE; + } else if (soc < sustain_soc.lower) { mode = CHARGE_CONTROL_NORMAL; + } break; default: return; diff --git a/test/sbs_charging_v2.c b/test/sbs_charging_v2.c index 041f4f9a45..f47e349672 100644 --- a/test/sbs_charging_v2.c +++ b/test/sbs_charging_v2.c @@ -964,7 +964,7 @@ test_static int test_battery_sustainer_discharge_idle(void) /* (lower =) upper < SoC */ display_soc = 810; wait_charging_state(); - TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_IDLE); + TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_DISCHARGE); /* Unplug AC. Sustainer gets deactivated. */ gpio_set_level(GPIO_AC_PRESENT, 0); @@ -974,7 +974,7 @@ test_static int test_battery_sustainer_discharge_idle(void) /* Replug AC. Sustainer gets re-activated. */ gpio_set_level(GPIO_AC_PRESENT, 1); wait_charging_state(); - TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_IDLE); + TEST_ASSERT(get_chg_ctrl_mode() == CHARGE_CONTROL_DISCHARGE); /* lower = SoC = upper */ display_soc = 800; |