summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerek Basehore <dbasehore@google.com>2023-05-04 14:55:37 -0700
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2023-05-11 00:11:14 +0000
commit24bc963111a5aa0c419d75918807c55ed420095b (patch)
treedb2e11010ba8394396d4607735037c6a981b8ea8
parent69da0638ea7c3b2cea9292a8f342a3ac5447caa8 (diff)
downloadchrome-ec-firmware-atlas-11827.B.tar.gz
chgstv2: Always discharge if soc is > sustainer_soc.upperfirmware-atlas-11827.B
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/+/4507759 Tested-by: Derek Basehore <dbasehore@chromium.org> Reviewed-by: Daisuke Nojiri <dnojiri@chromium.org> Commit-Queue: Derek Basehore <dbasehore@chromium.org> Auto-Submit: Derek Basehore <dbasehore@chromium.org>
-rw-r--r--common/charge_state_v2.c15
-rw-r--r--test/sbs_charging_v2.c4
2 files changed, 12 insertions, 7 deletions
diff --git a/common/charge_state_v2.c b/common/charge_state_v2.c
index 70e676a07a..be9c98052f 100644
--- a/common/charge_state_v2.c
+++ b/common/charge_state_v2.c
@@ -1539,10 +1539,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 */
@@ -1551,8 +1553,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 addd438d7e..e1c7602ad8 100644
--- a/test/sbs_charging_v2.c
+++ b/test/sbs_charging_v2.c
@@ -831,7 +831,7 @@ 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);
@@ -841,7 +841,7 @@ 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;