From e470e5a7f05143646685ed1bb0b73076fc2682ba Mon Sep 17 00:00:00 2001 From: Daisuke Nojiri Date: Thu, 1 Nov 2018 12:46:33 -0700 Subject: Battery: Apply full factor to full capacity This change introduces CONFIG_BATT_HOST_FULL_FACTOR. If it's 100, meaning no compensation, we multiply full capacity by CONFIG_BATT_FULL_FACTOR. This makes the rest of the system see consistent charge percentage behavior. Signed-off-by: Daisuke Nojiri BUG=b:109954565,b:80270446 BRANCH=none TEST=Verify display percentages printed by EC and power_supply_info move up synchronously on charge and turns to full at the same time. Change-Id: Ifb27c802b0cf04195ac5b426c13f9476189feb75 Reviewed-on: https://chromium-review.googlesource.com/1313468 Commit-Ready: ChromeOS CL Exonerator Bot Tested-by: Daisuke Nojiri Reviewed-by: Jett Rink --- common/battery.c | 20 +++++++++++++------- include/config.h | 5 +---- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/common/battery.c b/common/battery.c index 68ff0f3e62..71b05ba40a 100644 --- a/common/battery.c +++ b/common/battery.c @@ -21,11 +21,9 @@ #define CPRINTF(format, args...) cprintf(CC_CHARGER, format, ## args) #define CPRINTS(format, args...) cprints(CC_CHARGER, format, ## args) -/* - * See config.h for details. - * TODO: Allow host (powerd) to update it. - */ +/* See config.h for details */ static int batt_full_factor = CONFIG_BATT_FULL_FACTOR; +static int batt_host_full_factor = CONFIG_BATT_HOST_FULL_FACTOR; static int batt_host_shutdown_pct = CONFIG_BATT_HOST_SHUTDOWN_PERCENTAGE; #ifdef CONFIG_BATTERY_V2 @@ -577,7 +575,15 @@ void battery_compensate_params(struct batt_params *batt) if (remain <= 0 || full <= 0) return; - if (remain * 100 > full * batt_full_factor) { + if (batt_host_full_factor == 100) { + /* full_factor is effectively disabled in powerd. */ + batt->full_capacity = full * batt_full_factor / 100; + full = batt->full_capacity; + if (remain > full) { + batt->remaining_capacity = full; + remain = batt->remaining_capacity; + } + } else if (remain * 100 > full * batt_full_factor) { batt->remaining_capacity = full; batt->display_charge = 1000; return; @@ -585,11 +591,11 @@ void battery_compensate_params(struct batt_params *batt) /* * Powerd uses the following equation to calculate display percentage: - * charge = remain/full; + * charge = 100 * remain/full; * 100 * (charge - shutdown_pct) / (full_factor - shutdown_pct); */ numer = (100 * remain - full * batt_host_shutdown_pct) * 1000; - denom = full * (batt_full_factor - batt_host_shutdown_pct); + denom = full * (batt_host_full_factor - batt_host_shutdown_pct); /* Rounding (instead of truncating) */ batt->display_charge = (numer + denom / 2) / denom; } diff --git a/include/config.h b/include/config.h index 6f283416e4..4051703f99 100644 --- a/include/config.h +++ b/include/config.h @@ -425,12 +425,9 @@ * Some batteries don't update full capacity timely or don't update it at all. * On such systems, compensation is required to guarantee remaining_capacity * will be equal to full_capacity eventually. This used to be done in ACPI. - * - * This number should match those used by powerd to evenly scale battery - * reading from 0 to 100%. These are default values, which are effective until - * the host boots. */ #define CONFIG_BATT_FULL_FACTOR 98 +#define CONFIG_BATT_HOST_FULL_FACTOR 94 #define CONFIG_BATT_HOST_SHUTDOWN_PERCENTAGE 4 /* -- cgit v1.2.1