Skip to content

Commit f8203c2

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 0a2c785 commit f8203c2

File tree

2 files changed

+98
-94
lines changed

2 files changed

+98
-94
lines changed

baseboard/fwk/battery.c

Lines changed: 0 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,6 @@ const struct battery_info *battery_get_info(void)
119119
}
120120

121121
static enum battery_present batt_pres_prev = BP_NOT_SURE;
122-
static uint8_t charging_maximum_level = NEED_RESTORE;
123122
static int old_btp;
124123

125124
int board_cut_off_battery(void)
@@ -326,53 +325,6 @@ void battery_customize(struct charge_state_data *emi_info)
326325

327326
#endif
328327

329-
static void battery_percentage_control(void)
330-
{
331-
enum ec_charge_control_mode new_mode;
332-
static int in_percentage_control;
333-
uint32_t batt_os_percentage = get_system_percentage();
334-
int rv;
335-
336-
/**
337-
* If the host command EC_CMD_CHARGE_CONTROL set control mode to CHARGE_CONTROL_DISCHARGE
338-
* or CHARGE_CONTROL_IDLE, ignore the battery_percentage_control();
339-
*/
340-
if (!in_percentage_control && get_chg_ctrl_mode() != CHARGE_CONTROL_NORMAL)
341-
return;
342-
343-
if (charging_maximum_level == NEED_RESTORE)
344-
system_get_bbram(SYSTEM_BBRAM_IDX_CHG_MAX, &charging_maximum_level);
345-
346-
if (charging_maximum_level & CHG_LIMIT_OVERRIDE) {
347-
new_mode = CHARGE_CONTROL_NORMAL;
348-
if (batt_os_percentage == 1000)
349-
charging_maximum_level = charging_maximum_level | 0x64;
350-
} else if (charging_maximum_level < 20)
351-
new_mode = CHARGE_CONTROL_NORMAL;
352-
else if (batt_os_percentage > charging_maximum_level * 10) {
353-
new_mode = CHARGE_CONTROL_DISCHARGE;
354-
in_percentage_control = 1;
355-
} else if (batt_os_percentage == charging_maximum_level * 10) {
356-
new_mode = CHARGE_CONTROL_IDLE;
357-
in_percentage_control = 1;
358-
} else {
359-
new_mode = CHARGE_CONTROL_NORMAL;
360-
in_percentage_control = 0;
361-
}
362-
363-
364-
ccprints("Charge Limit mode = %d", new_mode);
365-
366-
set_chg_ctrl_mode(new_mode);
367-
#ifdef CONFIG_CHARGER_DISCHARGE_ON_AC
368-
rv = charger_discharge_on_ac(new_mode == CHARGE_CONTROL_DISCHARGE);
369-
#endif
370-
if (rv != EC_SUCCESS)
371-
ccprintf("fail to discharge.");
372-
}
373-
DECLARE_HOOK(HOOK_AC_CHANGE, battery_percentage_control, HOOK_PRIO_DEFAULT);
374-
DECLARE_HOOK(HOOK_BATTERY_SOC_CHANGE, battery_percentage_control, HOOK_PRIO_DEFAULT);
375-
376328
static void fix_single_param(int flag, int *cached, int *curr)
377329
{
378330
if (flag)
@@ -477,43 +429,3 @@ __override void board_battery_compensate_params(struct batt_params *batt)
477429
/* override the display charge value for Windows system */
478430
batt->display_charge = get_system_percentage();
479431
}
480-
481-
/*****************************************************************************/
482-
/* Customize host command */
483-
484-
/*
485-
* Charging limit control.
486-
*/
487-
static enum ec_status cmd_charging_limit_control(struct host_cmd_handler_args *args)
488-
{
489-
490-
const struct ec_params_ec_chg_limit_control *p = args->params;
491-
struct ec_response_chg_limit_control *r = args->response;
492-
493-
if (p->modes & CHG_LIMIT_DISABLE) {
494-
charging_maximum_level = 0;
495-
system_set_bbram(SYSTEM_BBRAM_IDX_CHG_MAX, 0);
496-
}
497-
498-
if (p->modes & CHG_LIMIT_SET_LIMIT) {
499-
if( p->max_percentage < 20 )
500-
return EC_RES_ERROR;
501-
502-
charging_maximum_level = p->max_percentage;
503-
system_set_bbram(SYSTEM_BBRAM_IDX_CHG_MAX, charging_maximum_level);
504-
}
505-
506-
if (p->modes & CHG_LIMIT_OVERRIDE)
507-
charging_maximum_level = charging_maximum_level | CHG_LIMIT_OVERRIDE;
508-
509-
if (p->modes & CHG_LIMIT_GET_LIMIT) {
510-
system_get_bbram(SYSTEM_BBRAM_IDX_CHG_MAX, &r->max_percentage);
511-
args->response_size = sizeof(*r);
512-
}
513-
514-
battery_percentage_control();
515-
516-
return EC_RES_SUCCESS;
517-
}
518-
DECLARE_HOST_COMMAND(EC_CMD_CHARGE_LIMIT_CONTROL, cmd_charging_limit_control,
519-
EC_VER_MASK(0));

baseboard/fwk/battery_extender.c

Lines changed: 98 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,16 @@
66

77
#include "battery.h"
88
#include "baseboard_host_commands.h"
9+
#include "battery.h"
10+
#include "battery_smart.h"
911
#include "charge_state.h"
12+
#include "charger.h"
1013
#include "console.h"
1114
#include "ec_commands.h"
1215
#include "extpower.h"
16+
#include "host_command.h"
17+
#include "host_command_customization.h"
18+
#include "system.h"
1319
#include "timer.h"
1420
#include "util.h"
1521
#include "hooks.h"
@@ -19,6 +25,8 @@
1925
#include "config.h"
2026
#include "console.h"
2127

28+
#include "keyboard_customization.h"
29+
2230
#define CPRINTS(format, args...) cprints(CC_SYSTEM, format, ## args)
2331
#define CPRINTF(format, args...) cprintf(CC_SYSTEM, format, ## args)
2432

@@ -44,7 +52,11 @@ static timestamp_t batt_extender_deadline;
4452
static timestamp_t batt_extender_deadline_stage2;
4553

4654
static timestamp_t reset_deadline;
55+
static int sustainer_lower = 100;
56+
static int sustainer_upper = 100;
4757

58+
static uint8_t charging_maximum_level = NEED_RESTORE;
59+
static uint8_t old_charger_limit;
4860

4961
static void extender_init(void)
5062
{
@@ -58,12 +70,44 @@ static void extender_init(void)
5870
}
5971
DECLARE_HOOK(HOOK_INIT, extender_init, HOOK_PRIO_DEFAULT);
6072

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

62102
void battery_extender(void)
63103
{
64104
timestamp_t now = get_time();
65105

66-
if (batt_extender_disable) {
106+
if (stage == BATT_EXTENDER_STAGE_0)
107+
battery_percentage_control();
108+
109+
/* don't runnig extender when unit in factory mode */
110+
if (batt_extender_disable || factory_status()) {
67111
stage = BATT_EXTENDER_STAGE_0;
68112
reset_deadline.val = 0;
69113
batt_extender_deadline.val = 0;
@@ -76,6 +120,16 @@ void battery_extender(void)
76120
reset_deadline.val = now.val + battery_extender_reset;
77121
}
78122

123+
if (sustainer_upper != charger_sustainer_percentage()) {
124+
sustainer_upper = charger_sustainer_percentage();
125+
sustainer_lower = sustainer_upper - 5;
126+
/* if we already trigger stage, set 5 SECOND to update the sustainer again */
127+
if (stage == BATT_EXTENDER_STAGE_1) {
128+
batt_extender_deadline.val = now.val + 5 * SECOND;
129+
} else if (stage == BATT_EXTENDER_STAGE_2)
130+
batt_extender_deadline_stage2.val = now.val + 5 * SECOND;
131+
}
132+
79133
if (reset_deadline.val &&
80134
timestamp_expired(reset_deadline, &now)) {
81135
reset_deadline.val = 0;
@@ -93,14 +147,12 @@ void battery_extender(void)
93147
timestamp_expired(batt_extender_deadline_stage2, &now)) {
94148
batt_extender_deadline_stage2.val = 0;
95149
stage = BATT_EXTENDER_STAGE_2;
96-
battery_sustainer_set(85, 87);
97-
}
98-
99-
else if (batt_extender_deadline.val &&
150+
battery_sustainer_set(MIN(85, sustainer_lower), MIN(87, sustainer_upper));
151+
} else if (batt_extender_deadline.val &&
100152
timestamp_expired(batt_extender_deadline, &now)) {
101153
batt_extender_deadline.val = 0;
102154
stage = BATT_EXTENDER_STAGE_1;
103-
battery_sustainer_set(90, 95);
155+
battery_sustainer_set(MIN(90, sustainer_lower), MIN(95, sustainer_upper));
104156
}
105157
}
106158
DECLARE_HOOK(HOOK_SECOND, battery_extender, HOOK_PRIO_DEFAULT);
@@ -176,6 +228,43 @@ static enum ec_status battery_extender_hc(struct host_cmd_handler_args *args)
176228
}
177229
DECLARE_HOST_COMMAND(EC_CMD_BATTERY_EXTENDER, battery_extender_hc, EC_VER_MASK(0));
178230

231+
/*****************************************************************************/
232+
/* Host command */
233+
234+
static enum ec_status cmd_charging_limit_control(struct host_cmd_handler_args *args)
235+
{
236+
237+
const struct ec_params_ec_chg_limit_control *p = args->params;
238+
struct ec_response_chg_limit_control *r = args->response;
239+
240+
if (p->modes & CHG_LIMIT_DISABLE) {
241+
charging_maximum_level = 0;
242+
system_set_bbram(SYSTEM_BBRAM_IDX_CHG_MAX, 0);
243+
}
244+
245+
if (p->modes & CHG_LIMIT_SET_LIMIT) {
246+
if (p->max_percentage < 20)
247+
return EC_RES_ERROR;
248+
249+
charging_maximum_level = p->max_percentage;
250+
system_set_bbram(SYSTEM_BBRAM_IDX_CHG_MAX, charging_maximum_level);
251+
}
252+
253+
if (p->modes & CHG_LIMIT_OVERRIDE)
254+
charging_maximum_level = charging_maximum_level | CHG_LIMIT_OVERRIDE;
255+
256+
if (p->modes & CHG_LIMIT_GET_LIMIT) {
257+
system_get_bbram(SYSTEM_BBRAM_IDX_CHG_MAX, &r->max_percentage);
258+
args->response_size = sizeof(*r);
259+
}
260+
261+
battery_percentage_control();
262+
263+
return EC_RES_SUCCESS;
264+
}
265+
DECLARE_HOST_COMMAND(EC_CMD_CHARGE_LIMIT_CONTROL, cmd_charging_limit_control,
266+
EC_VER_MASK(0));
267+
179268
static uint64_t cmd_parse_timestamp(int argc, char **argv)
180269
{
181270
uint64_t time_val = 0;
@@ -294,6 +383,9 @@ static int cmd_batt_extender(int argc, char **argv)
294383
CPRINTF("\t - expires in: ");
295384
print_time_offset(reset_deadline.val, now.val);
296385
}
386+
CPRINTF("\tsustainer percentage:\n");
387+
CPRINTF("\tlower: %d, upper: %d\n", sustainer_lower, sustainer_upper);
388+
CPRINTF("\tUser charge limit:%d\n", charging_maximum_level);
297389
}
298390

299391
return EC_SUCCESS;

0 commit comments

Comments
 (0)