From 94f2f2caa47a6e45c5d3505a10b41fd85ab9a8d3 Mon Sep 17 00:00:00 2001 From: Daisuke Nojiri Date: Mon, 29 Oct 2018 14:10:08 -0700 Subject: Battery: Get display charge percentage This patch converts the actual battery charge to the display percentage using the same conversion used by Powerd. EC can use this number to control LEDs synchronously to the value on the display. Signed-off-by: Daisuke Nojiri BUG=b:109954565,b:80270446 BRANCH=none TEST=Verify charge LED changes to white (full) on Sona synchronously to the display percentage. TEST=Verify charge LED changes to blinking white (low) on Sona within 30 seconds synchronously to the display percentage. Change-Id: I2041cb768dee27b8dba94a32db0eb62dfa14c73b Reviewed-on: https://chromium-review.googlesource.com/1309033 Commit-Ready: Daisuke Nojiri Tested-by: Daisuke Nojiri Reviewed-by: Jett Rink Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3869318 Auto-Submit: Daisuke Nojiri Commit-Queue: Daisuke Nojiri --- common/battery.c | 17 ++++++++++++++++- include/battery.h | 1 + include/config.h | 1 + 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/common/battery.c b/common/battery.c index 9d380efe86..346b9207b8 100644 --- a/common/battery.c +++ b/common/battery.c @@ -26,6 +26,7 @@ * TODO: Allow host (powerd) to update it. */ static int batt_full_factor = CONFIG_BATT_FULL_FACTOR; +static int batt_host_shutdown_pct = CONFIG_BATT_HOST_SHUTDOWN_PERCENTAGE; #ifdef CONFIG_BATTERY_V2 /* @@ -565,6 +566,7 @@ DECLARE_HOOK(HOOK_INIT, battery_init, HOOK_PRIO_DEFAULT); void battery_compensate_params(struct batt_params *batt) { + int numer, denom; int remain = batt->remaining_capacity; int full = batt->full_capacity; @@ -575,8 +577,21 @@ void battery_compensate_params(struct batt_params *batt) if (remain <= 0 || full <= 0) return; - if (remain * 100 > full * batt_full_factor) + if (remain * 100 > full * batt_full_factor) { batt->remaining_capacity = full; + batt->display_charge = 1000; + return; + } + + /* + * Powerd uses the following equation to calculate display percentage: + * charge = 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); + /* Rounding (instead of truncating) */ + batt->display_charge = (numer + denom / 2) / denom; } __attribute__((weak)) int get_battery_manufacturer_name(char *dest, int size) diff --git a/include/battery.h b/include/battery.h index 805dc851c9..df5aee5990 100644 --- a/include/battery.h +++ b/include/battery.h @@ -85,6 +85,7 @@ struct batt_params { int desired_current; /* Charging current desired by battery (mA) */ int remaining_capacity; /* Remaining capacity in mAh */ int full_capacity; /* Capacity in mAh (might change occasionally) */ + int display_charge; /* Display charge in 10ths of a % (1000=100.0%) */ int status; /* Battery status */ enum battery_present is_present; /* Is the battery physically present */ int flags; /* Flags */ diff --git a/include/config.h b/include/config.h index d732145fae..3b9a2e7695 100644 --- a/include/config.h +++ b/include/config.h @@ -504,6 +504,7 @@ * the host boots. */ #define CONFIG_BATT_FULL_FACTOR 98 +#define CONFIG_BATT_HOST_SHUTDOWN_PERCENTAGE 4 /* * Expose some data when it is needed. -- cgit v1.2.1