diff options
-rw-r--r-- | common/battery.c | 17 | ||||
-rw-r--r-- | include/battery.h | 1 | ||||
-rw-r--r-- | include/config.h | 1 |
3 files changed, 18 insertions, 1 deletions
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. |