Skip to content

Commit 7a0638b

Browse files
LeoCX-Tsaikiram9
authored andcommitted
fwk: main: combine charger limit and battery extender
We have two functions to control the charger mode to save battery life, combine two functions to avoid the race condition, we will all use sustainer_set. when extender is not triggered yet, it will execute battery_percentage_control after trigger uses battery_extender. BRANCH=fwk-main BUG=https://app.clickup.com/t/86eqxq8c1 TEST= verify on marigold, condition 1, set charger limit(70%) first and trigger it to make sure percentage is down to 70%, use cmd battextender timeext 3 m and battextender timeext2 4 m check if stage 1 trigger percentage still keep at 70% when stage 2 trigger also keep at 70%. (battery LED keep White) TEST= verify on marigold, condition 2, after condition 1 setting charger limit(60%) again after 5 Sec check battery start discharge and stop at 60%. (battery LED keep White) TEST= verify on marigold, condition 3, disable charger limit(100%) check battextender will set default range and star charging until trigger stage1(95-90) and stage2(87-85). (battery LED will be charge LED(60%~95% amber), after trigger stage1 will be white) Signed-off-by: LeoCX_Tsai <[email protected]> (cherry picked from commit d18a2aaa230f0f59265983ab277e716d3558c67f)
1 parent bb721fd commit 7a0638b

File tree

3 files changed

+100
-120
lines changed

3 files changed

+100
-120
lines changed

zephyr/program/framework/CMakeLists.txt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,6 @@ zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_TOUCHPAD_CUSTOMIZED
3838
zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_CHARGE_MANAGER
3939
"src/battery_extender.c")
4040

41-
zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_CHARGE_MANAGER
42-
"src/charge_limit_control.c")
43-
4441
if(DEFINED CONFIG_BOARD_LOTUS)
4542
project(lotus)
4643
cros_ec_library_include_directories_ifdef(CONFIG_BOARD_LOTUS include)

zephyr/program/framework/src/battery_extender.c

Lines changed: 100 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,25 @@
55
*/
66

77
#include "battery.h"
8+
#include "battery_smart.h"
89
#include "board_host_command.h"
10+
#include "board_charger.h"
11+
#include "battery_fuel_gauge.h"
12+
#include "board_function.h"
913
#include "charge_state.h"
14+
#include "charger.h"
1015
#include "console.h"
16+
#include "customized_shared_memory.h"
1117
#include "ec_commands.h"
1218
#include "extpower.h"
19+
#include "factory.h"
20+
#include "host_command.h"
21+
#include "system.h"
1322
#include "timer.h"
1423
#include "util.h"
1524
#include "hooks.h"
1625

1726

18-
1927
#define CPRINTS(format, args...) cprints(CC_SYSTEM, format, ## args)
2028
#define CPRINTF(format, args...) cprintf(CC_SYSTEM, format, ## args)
2129

@@ -41,7 +49,11 @@ static timestamp_t batt_extender_deadline;
4149
static timestamp_t batt_extender_deadline_stage2;
4250

4351
static timestamp_t reset_deadline;
52+
static int sustainer_lower = 100;
53+
static int sustainer_upper = 100;
4454

55+
static uint8_t charging_maximum_level = EC_CHARGE_LIMIT_RESTORE;
56+
static uint8_t old_charger_limit;
4557

4658
static void extender_init(void)
4759
{
@@ -55,12 +67,44 @@ static void extender_init(void)
5567
}
5668
DECLARE_HOOK(HOOK_INIT, extender_init, HOOK_PRIO_DEFAULT);
5769

70+
int charger_sustainer_percentage(void)
71+
{
72+
if (!charging_maximum_level)
73+
return 100;
74+
return charging_maximum_level;
75+
}
76+
77+
static void battery_percentage_control(void)
78+
{
79+
if (charging_maximum_level == EC_CHARGE_LIMIT_RESTORE) {
80+
system_get_bbram(SYSTEM_BBRAM_IDX_CHARGE_LIMIT_MAX, &charging_maximum_level);
81+
if (charging_maximum_level & CHG_LIMIT_OVERRIDE)
82+
charging_maximum_level = charging_maximum_level & 0x64;
83+
}
84+
85+
if (charging_maximum_level & CHG_LIMIT_OVERRIDE ||
86+
!charging_maximum_level) {
87+
battery_sustainer_set(-1, -1);
88+
set_chg_ctrl_mode(CHARGE_CONTROL_NORMAL);
89+
return;
90+
}
91+
92+
if (old_charger_limit != charging_maximum_level) {
93+
old_charger_limit = charging_maximum_level;
94+
battery_sustainer_set(MAX(20, (charging_maximum_level - 5)),
95+
MAX(20, charging_maximum_level));
96+
}
97+
}
5898

5999
void battery_extender(void)
60100
{
61101
timestamp_t now = get_time();
62102

63-
if (batt_extender_disable) {
103+
if (stage == BATT_EXTENDER_STAGE_0)
104+
battery_percentage_control();
105+
106+
/* don't runnig extender when unit in factory mode */
107+
if (batt_extender_disable || factory_status()) {
64108
stage = BATT_EXTENDER_STAGE_0;
65109
reset_deadline.val = 0;
66110
batt_extender_deadline.val = 0;
@@ -73,6 +117,16 @@ void battery_extender(void)
73117
reset_deadline.val = now.val + battery_extender_reset;
74118
}
75119

120+
if (sustainer_upper != charger_sustainer_percentage()) {
121+
sustainer_upper = charger_sustainer_percentage();
122+
sustainer_lower = sustainer_upper - 5;
123+
/* if we already trigger stage, set 5 SECOND to update the sustainer again */
124+
if (stage == BATT_EXTENDER_STAGE_1) {
125+
batt_extender_deadline.val = now.val + 5 * SECOND;
126+
} else if (stage == BATT_EXTENDER_STAGE_2)
127+
batt_extender_deadline_stage2.val = now.val + 5 * SECOND;
128+
}
129+
76130
if (reset_deadline.val &&
77131
timestamp_expired(reset_deadline, &now)) {
78132
reset_deadline.val = 0;
@@ -90,14 +144,12 @@ void battery_extender(void)
90144
timestamp_expired(batt_extender_deadline_stage2, &now)) {
91145
batt_extender_deadline_stage2.val = 0;
92146
stage = BATT_EXTENDER_STAGE_2;
93-
battery_sustainer_set(85, 87);
94-
}
95-
96-
else if (batt_extender_deadline.val &&
147+
battery_sustainer_set(MIN(85, sustainer_lower), MIN(87, sustainer_upper));
148+
} else if (batt_extender_deadline.val &&
97149
timestamp_expired(batt_extender_deadline, &now)) {
98150
batt_extender_deadline.val = 0;
99151
stage = BATT_EXTENDER_STAGE_1;
100-
battery_sustainer_set(90, 95);
152+
battery_sustainer_set(MIN(90, sustainer_lower), MIN(95, sustainer_upper));
101153
}
102154
}
103155
DECLARE_HOOK(HOOK_SECOND, battery_extender, HOOK_PRIO_DEFAULT);
@@ -173,6 +225,44 @@ static enum ec_status battery_extender_hc(struct host_cmd_handler_args *args)
173225
}
174226
DECLARE_HOST_COMMAND(EC_CMD_BATTERY_EXTENDER, battery_extender_hc, EC_VER_MASK(0));
175227

228+
/*****************************************************************************/
229+
/* Host command */
230+
231+
static enum ec_status cmd_charging_limit_control(struct host_cmd_handler_args *args)
232+
{
233+
234+
const struct ec_params_ec_chg_limit_control *p = args->params;
235+
struct ec_response_chg_limit_control *r = args->response;
236+
237+
if (p->modes & CHG_LIMIT_DISABLE) {
238+
charging_maximum_level = 0;
239+
system_set_bbram(SYSTEM_BBRAM_IDX_CHARGE_LIMIT_MAX, 0);
240+
}
241+
242+
if (p->modes & CHG_LIMIT_SET_LIMIT) {
243+
if (p->max_percentage < 20)
244+
return EC_RES_ERROR;
245+
246+
charging_maximum_level = p->max_percentage;
247+
system_set_bbram(SYSTEM_BBRAM_IDX_CHARGE_LIMIT_MAX, charging_maximum_level);
248+
}
249+
250+
if (p->modes & CHG_LIMIT_OVERRIDE)
251+
charging_maximum_level = charging_maximum_level | CHG_LIMIT_OVERRIDE;
252+
253+
if (p->modes & CHG_LIMIT_GET_LIMIT) {
254+
system_get_bbram(SYSTEM_BBRAM_IDX_CHARGE_LIMIT_MAX, &charging_maximum_level);
255+
r->max_percentage = charging_maximum_level;
256+
args->response_size = sizeof(*r);
257+
}
258+
259+
battery_percentage_control();
260+
261+
return EC_RES_SUCCESS;
262+
}
263+
DECLARE_HOST_COMMAND(EC_CMD_CHARGE_LIMIT_CONTROL, cmd_charging_limit_control,
264+
EC_VER_MASK(0));
265+
176266
static uint64_t cmd_parse_timestamp(int argc, const char **argv)
177267
{
178268
uint64_t time_val = 0;
@@ -291,6 +381,9 @@ static int cmd_batt_extender(int argc, const char **argv)
291381
CPRINTF("\t - expires in: ");
292382
print_time_offset(reset_deadline.val, now.val);
293383
}
384+
CPRINTF("\tsustainer percentage:\n");
385+
CPRINTF("\tlower: %d, upper: %d\n", sustainer_lower, sustainer_upper);
386+
CPRINTF("\tUser charge limit:%d\n", charging_maximum_level);
294387
}
295388

296389
return EC_SUCCESS;

zephyr/program/framework/src/charge_limit_control.c

Lines changed: 0 additions & 110 deletions
This file was deleted.

0 commit comments

Comments
 (0)