summaryrefslogtreecommitdiff
path: root/board
diff options
context:
space:
mode:
authorAlec Berg <alecaberg@chromium.org>2015-07-24 14:32:27 -0700
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2015-07-29 06:38:52 +0000
commit511766b6388099ed6894f7209430de145397afc4 (patch)
tree5f744981802827717b0d53a9b463e481feffce20 /board
parentd27dacf214bfbd1ce628fae5b1b63e4e1f9d00e1 (diff)
downloadchrome-ec-511766b6388099ed6894f7209430de145397afc4.tar.gz
glados: implement and enable fast charging profiles
Implement and enable custom charging profiles on glados to allow us to charge faster. BUG=chrome-os-partner:42864 BRANCH=none TEST=load on glados and charge at room temp. verify using "charger" command that the battery current matches the expected fast charging current for the given temp range. Change-Id: I7b213fd1724e9df09ada89ca27b05e0540b4de2a Signed-off-by: Alec Berg <alecaberg@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/288208 Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
Diffstat (limited to 'board')
-rw-r--r--board/glados/battery.c177
-rw-r--r--board/glados/board.h1
2 files changed, 178 insertions, 0 deletions
diff --git a/board/glados/battery.c b/board/glados/battery.c
index 3365c93be1..307f977c67 100644
--- a/board/glados/battery.c
+++ b/board/glados/battery.c
@@ -7,6 +7,9 @@
#include "battery.h"
#include "battery_smart.h"
+#include "charge_state.h"
+#include "console.h"
+#include "ec_commands.h"
#include "i2c.h"
#include "util.h"
@@ -52,3 +55,177 @@ int board_cut_off_battery(void)
return rv;
}
+
+#ifdef CONFIG_CHARGER_PROFILE_OVERRIDE
+
+static int fast_charging_allowed = 1;
+
+/*
+ * This can override the smart battery's charging profile. To make a change,
+ * modify one or more of requested_voltage, requested_current, or state.
+ * Leave everything else unchanged.
+ *
+ * Return the next poll period in usec, or zero to use the default (which is
+ * state dependent).
+ */
+int charger_profile_override(struct charge_state_data *curr)
+{
+ /* temp in 0.1 deg C */
+ int temp_c = curr->batt.temperature - 2731;
+ /* keep track of last temperature range for hysteresis */
+ static enum {
+ TEMP_RANGE_1,
+ TEMP_RANGE_2,
+ TEMP_RANGE_3,
+ TEMP_RANGE_4,
+ TEMP_RANGE_5,
+ } temp_range = TEMP_RANGE_3;
+ /* keep track of last voltage range for hysteresis */
+ static enum {
+ VOLTAGE_RANGE_LOW,
+ VOLTAGE_RANGE_HIGH,
+ } voltage_range = VOLTAGE_RANGE_LOW;
+
+ /* Current and previous battery voltage */
+ int batt_voltage;
+ static int prev_batt_voltage;
+
+ /*
+ * Determine temperature range. The five ranges are:
+ * < 10C
+ * 10-15C
+ * 15-23C
+ * 23-45C
+ * > 45C
+ *
+ * Add 0.2 degrees of hysteresis.
+ * If temp reading was bad, use last range.
+ */
+ if (!(curr->batt.flags & BATT_FLAG_BAD_TEMPERATURE)) {
+ if (temp_c < 99)
+ temp_range = TEMP_RANGE_1;
+ else if (temp_c > 101 && temp_c < 149)
+ temp_range = TEMP_RANGE_2;
+ else if (temp_c > 151 && temp_c < 229)
+ temp_range = TEMP_RANGE_3;
+ else if (temp_c > 231 && temp_c < 449)
+ temp_range = TEMP_RANGE_4;
+ else if (temp_c > 451)
+ temp_range = TEMP_RANGE_5;
+ }
+
+ /*
+ * If battery voltage reading is bad, use the last reading. Otherwise,
+ * determine voltage range with 20mV * hysteresis.
+ */
+ if (curr->batt.flags & BATT_FLAG_BAD_VOLTAGE) {
+ batt_voltage = prev_batt_voltage;
+ } else {
+ batt_voltage = prev_batt_voltage = curr->batt.voltage;
+ if (batt_voltage < 8280)
+ voltage_range = VOLTAGE_RANGE_LOW;
+ else if (batt_voltage > 8300)
+ voltage_range = VOLTAGE_RANGE_HIGH;
+ }
+
+ /*
+ * If we are not charging or we aren't using fast charging profiles,
+ * then do not override desired current and voltage.
+ */
+ if (curr->state != ST_CHARGE || !fast_charging_allowed)
+ return 0;
+
+ /*
+ * Okay, impose our custom will:
+ * When battery is 0-10C:
+ * CC at 486mA @ 8.7V
+ * CV at 8.7V
+ *
+ * When battery is <15C:
+ * CC at 1458mA @ 8.7V
+ * CV at 8.7V
+ *
+ * When battery is <23C:
+ * CC at 3402mA until 8.3V @ 8.7V
+ * CC at 2430mA @ 8.7V
+ * CV at 8.7V
+ *
+ * When battery is <45C:
+ * CC at 4860mA until 8.3V @ 8.7V
+ * CC at 2430mA @ 8.7V
+ * CV at 8.7V until current drops to 450mA
+ *
+ * When battery is >45C:
+ * CC at 2430mA @ 8.3V
+ * CV at 8.3V (when battery is hot we don't go to fully charged)
+ */
+ switch (temp_range) {
+ case TEMP_RANGE_1:
+ curr->requested_current = 486;
+ curr->requested_voltage = 8700;
+ break;
+ case TEMP_RANGE_2:
+ curr->requested_current = 1458;
+ curr->requested_voltage = 8700;
+ break;
+ case TEMP_RANGE_3:
+ curr->requested_voltage = 8700;
+ if (voltage_range == VOLTAGE_RANGE_HIGH)
+ curr->requested_current = 2430;
+ else
+ curr->requested_current = 3402;
+ break;
+ case TEMP_RANGE_4:
+ curr->requested_voltage = 8700;
+ if (voltage_range == VOLTAGE_RANGE_HIGH)
+ curr->requested_current = 2430;
+ else
+ curr->requested_current = 4860;
+ break;
+ case TEMP_RANGE_5:
+ curr->requested_current = 2430;
+ curr->requested_voltage = 8300;
+ break;
+ }
+
+ return 0;
+}
+
+/* Customs options controllable by host command. */
+#define PARAM_FASTCHARGE (CS_PARAM_CUSTOM_PROFILE_MIN + 0)
+
+enum ec_status charger_profile_override_get_param(uint32_t param,
+ uint32_t *value)
+{
+ if (param == PARAM_FASTCHARGE) {
+ *value = fast_charging_allowed;
+ return EC_RES_SUCCESS;
+ }
+ return EC_RES_INVALID_PARAM;
+}
+
+enum ec_status charger_profile_override_set_param(uint32_t param,
+ uint32_t value)
+{
+ if (param == PARAM_FASTCHARGE) {
+ fast_charging_allowed = value;
+ return EC_RES_SUCCESS;
+ }
+ return EC_RES_INVALID_PARAM;
+}
+
+static int command_fastcharge(int argc, char **argv)
+{
+ if (argc > 1 && !parse_bool(argv[1], &fast_charging_allowed))
+ return EC_ERROR_PARAM1;
+
+ ccprintf("fastcharge %s\n", fast_charging_allowed ? "on" : "off");
+
+ return EC_SUCCESS;
+}
+DECLARE_CONSOLE_COMMAND(fastcharge, command_fastcharge,
+ "[on|off]",
+ "Get or set fast charging profile",
+ NULL);
+
+#endif /* CONFIG_CHARGER_PROFILE_OVERRIDE */
diff --git a/board/glados/board.h b/board/glados/board.h
index 603f55f694..95f0572500 100644
--- a/board/glados/board.h
+++ b/board/glados/board.h
@@ -30,6 +30,7 @@
#define CONFIG_CHARGER_ISL9237
#define CONFIG_CHARGER_ILIM_PIN_DISABLED
#define CONFIG_CHARGER_INPUT_CURRENT 512
+#define CONFIG_CHARGER_PROFILE_OVERRIDE
#define CONFIG_CHARGER_SENSE_RESISTOR 10
#define CONFIG_CHARGER_SENSE_RESISTOR_AC 20