summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/battery.c17
-rw-r--r--include/battery.h1
-rw-r--r--include/config.h1
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.