summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTang Qijun <qijun.tang@ecs.corp-partner.google.com>2022-12-27 15:08:43 +0800
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2023-02-01 15:29:15 +0000
commit97c339ed76e8306bb288d2d5d9be5a6260953a1f (patch)
treea6942e39d6015e07061c0ab8c95153f8cab00e83
parent2f822d323b2a2c14406ba2650331acf5326b2896 (diff)
downloadchrome-ec-firmware-dedede-13606.516.B-master.tar.gz
chgstv2: optimization battery protection for low voltagefirmware-dedede-13606.516.B-master
Deep_charge_battery needs to precharge first, and then enter the idle or charge state. Because before entering deep_charge_battery, the curr.state state may be the idle state, which may cause no precharge process. Therefore, add a flag to curr.batt.flags for record whether the precharge process has been performed. BRANCH=trogdor BUG=b:263921114 TEST=After the battery is discharged below voltage_min, the charging process enters deep_charge_battery and precharges first, and when the battery voltage is greater than voltage_min, it enters the charge state and charges normally. TEST=run-battery_get_params_smart Change-Id: I3a353bbcb4149b873176006bc009fbd3e8824aab Signed-off-by: Tang Qijun <qijun.tang@ecs.corp-partner.google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/4125706 Tested-by: Daisuke Nojiri <dnojiri@chromium.org> Reviewed-by: Daisuke Nojiri <dnojiri@chromium.org> Commit-Queue: Daisuke Nojiri <dnojiri@chromium.org> Code-Coverage: Zoss <zoss-cl-coverage@prod.google.com> Commit-Queue: Bob Moragues <moragues@chromium.org> (cherry picked from commit f0436fe4c66f1a6759c2ae28157ec495b53eab9c) Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/4212310 Reviewed-by: Shou-Chieh Hsu <shouchieh@chromium.org> Reviewed-by: Owen Yang <owen.yang@ecs.corp-partner.google.com> Commit-Queue: Ivan Chen <yulunchen@google.com> Tested-by: Owen Yang <owen.yang@ecs.corp-partner.google.com>
-rw-r--r--common/charge_state_v2.c29
-rw-r--r--include/battery.h3
-rw-r--r--test/battery_get_params_smart.c4
3 files changed, 27 insertions, 9 deletions
diff --git a/common/charge_state_v2.c b/common/charge_state_v2.c
index 9b567ba2ff..6b5336c03a 100644
--- a/common/charge_state_v2.c
+++ b/common/charge_state_v2.c
@@ -1539,7 +1539,8 @@ __test_only enum charge_state_v2 charge_get_state_v2(void)
static void deep_charge_battery(int *need_static)
{
- if (curr.state == ST_IDLE) {
+ if ((curr.state == ST_IDLE) &&
+ (curr.batt.flags & BATT_FLAG_DEEP_CHARGE)) {
/* Deep charge time out , do nothing */
curr.requested_voltage = 0;
curr.requested_current = 0;
@@ -1562,6 +1563,7 @@ static void deep_charge_battery(int *need_static)
set_charge_state(ST_PRECHARGE);
curr.requested_voltage = batt_info->voltage_max;
curr.requested_current = batt_info->precharge_current;
+ curr.batt.flags |= BATT_FLAG_DEEP_CHARGE;
}
}
@@ -1814,13 +1816,26 @@ void charger_task(void *u)
goto wait_for_it;
}
- if (IS_ENABLED(CONFIG_BATTERY_LOW_VOLTAGE_PROTECTION) &&
- !(curr.batt.flags & BATT_FLAG_BAD_VOLTAGE) &&
- (curr.batt.voltage <= batt_info->voltage_min)) {
- deep_charge_battery(&need_static);
- goto wait_for_it;
- }
+ /*
+ * When the battery voltage is lower than voltage_min,precharge
+ * first to protect the battery
+ */
+ if (IS_ENABLED(CONFIG_BATTERY_LOW_VOLTAGE_PROTECTION)) {
+ if (!(curr.batt.flags & BATT_FLAG_BAD_VOLTAGE) &&
+ (curr.batt.voltage <= batt_info->voltage_min)) {
+ deep_charge_battery(&need_static);
+ goto wait_for_it;
+ }
+ /*
+ * Finished deep charge before timeout. Clear the flag
+ * so that we can do deep charge again (when it's deeply
+ * discharged again).
+ */
+ if ((curr.batt.flags & BATT_FLAG_DEEP_CHARGE)) {
+ curr.batt.flags &= ~BATT_FLAG_DEEP_CHARGE;
+ }
+ }
/* The battery is responding. Yay. Try to use it. */
/*
diff --git a/include/battery.h b/include/battery.h
index ce39d8ddd2..724afad905 100644
--- a/include/battery.h
+++ b/include/battery.h
@@ -162,6 +162,9 @@ int battery_get_avg_voltage(void); /* in mV */
(BATT_FLAG_BAD_ANY | BATT_FLAG_WANT_CHARGE | BATT_FLAG_RESPONSIVE | \
BATT_FLAG_IMBALANCED_CELL)
+/* The flag of prechare when the battery voltage is lower than voltage_min */
+#define BATT_FLAG_DEEP_CHARGE 0x00010000
+
/* Battery constants */
struct battery_info {
/* Operation voltage in mV */
diff --git a/test/battery_get_params_smart.c b/test/battery_get_params_smart.c
index 63a0abe64c..f63003d8d9 100644
--- a/test/battery_get_params_smart.c
+++ b/test/battery_get_params_smart.c
@@ -167,9 +167,9 @@ static int test_flags(void)
*/
reset_and_fail_on(0, 0, -1);
batt.flags |= BATT_FLAG_BAD_TEMPERATURE;
- batt.flags |= BIT(31);
+ batt.flags |= BATT_FLAG_DEEP_CHARGE;
battery_get_params(&batt);
- TEST_ASSERT(batt.flags & BIT(31));
+ TEST_ASSERT(batt.flags & BATT_FLAG_DEEP_CHARGE);
TEST_ASSERT(!(batt.flags & BATT_FLAG_BAD_ANY));
/*