summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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));
/*