From 7f1c49ab4be3c662a488d2c4e9acceef2c904465 Mon Sep 17 00:00:00 2001 From: Dave Parker Date: Mon, 1 Jul 2013 14:52:27 -0700 Subject: Add ectool discharge command to Falco and Peppy. Expands and renames ectool 'chargeforceidle' command to 'chargecontrol'. Board-specific calls are needed to enable and disable the discharge while on AC power state. BUG=chrome-os-partner:20506 BRANCH=falco,peppy TEST=Run ectool chargecontrol command with each option (normal, idle, discharge) on Falco and Peppy. Verifiy battery is discharging in discharge mode via EC console 'battery' command. Change-Id: I7ac2b18b4f143bf6abc1e0bb878ad21a99f52100 Signed-off-by: Dave Parker Reviewed-on: https://gerrit.chromium.org/gerrit/60689 Reviewed-by: Vic Yang Reviewed-by: Randall Spangler --- board/falco/board.c | 10 +++++++++ board/falco/board.h | 4 ++++ board/peppy/board.c | 12 +++++++++++ board/peppy/board.h | 4 ++++ common/charge_state.c | 53 ++++++++++++++++++++++++++--------------------- common/charger_bq24738.c | 17 +++++++++++++++ include/charger_bq24738.h | 4 +++- include/ec_commands.h | 17 +++++++++++---- util/ectool.c | 40 +++++++++++++++++++++++------------ 9 files changed, 119 insertions(+), 42 deletions(-) diff --git a/board/falco/board.c b/board/falco/board.c index 4748cc415b..745c4e6d57 100644 --- a/board/falco/board.c +++ b/board/falco/board.c @@ -6,6 +6,8 @@ #include "adc.h" #include "backlight.h" +#include "board.h" +#include "charger_bq24738.h" #include "chip_temp_sensor.h" #include "chipset_haswell.h" #include "chipset_x86_common.h" @@ -222,3 +224,11 @@ int board_g781_has_power(void) { return gpio_get_level(GPIO_PP3300_DX_EN); } + +/** + * Discharge battery when on AC power for factory test. + */ +int board_discharge_on_ac(int enable) +{ + return charger_discharge_on_ac(enable); +} diff --git a/board/falco/board.h b/board/falco/board.h index 7a9e8ce580..76182ed59e 100644 --- a/board/falco/board.h +++ b/board/falco/board.h @@ -25,6 +25,7 @@ #ifdef HAS_TASK_CHIPSET #define CONFIG_CHIPSET_HASWELL #endif +#define CONFIG_CMD_DISCHARGE_ON_AC #define CONFIG_CUSTOM_KEYSCAN #define CONFIG_EXTPOWER_GPIO #ifdef HAS_TASK_KEYPROTO @@ -219,6 +220,9 @@ int board_g781_has_power(void); #define WIRELESS_GPIO_WWAN GPIO_PP3300_LTE_EN #define WIRELESS_GPIO_WLAN_POWER GPIO_PP3300_WLAN_EN +/* Discharge battery when on AC power for factory test. */ +int board_discharge_on_ac(int enable); + #endif /* !__ASSEMBLER__ */ #endif /* __BOARD_H */ diff --git a/board/peppy/board.c b/board/peppy/board.c index 8e7ed2e88c..86ee193ab0 100644 --- a/board/peppy/board.c +++ b/board/peppy/board.c @@ -216,3 +216,15 @@ int board_g781_has_power(void) { return gpio_get_level(GPIO_PP3300_DX_EN); } + +/** + * Discharge battery when on AC power for factory test. + */ +int board_discharge_on_ac(int enable) +{ + if (enable) + gpio_set_level(GPIO_CHARGE_L, 1); + else + gpio_set_level(GPIO_CHARGE_L, 0); + return EC_SUCCESS; +} diff --git a/board/peppy/board.h b/board/peppy/board.h index 6651aa8961..6b2be7703b 100644 --- a/board/peppy/board.h +++ b/board/peppy/board.h @@ -24,6 +24,7 @@ #ifdef HAS_TASK_CHIPSET #define CONFIG_CHIPSET_HASWELL #endif +#define CONFIG_CMD_DISCHARGE_ON_AC #define CONFIG_CUSTOM_KEYSCAN #define CONFIG_EXTPOWER_GPIO #ifdef HAS_TASK_KEYPROTO @@ -221,6 +222,9 @@ int board_g781_has_power(void); #define WIRELESS_GPIO_WWAN GPIO_PP3300_LTE_EN #define WIRELESS_GPIO_WLAN_POWER GPIO_PP3300_WLAN_EN +/* Discharge battery when on AC power for factory test. */ +int board_discharge_on_ac(int enable); + #endif /* !__ASSEMBLER__ */ #endif /* __BOARD_H */ diff --git a/common/charge_state.c b/common/charge_state.c index 02c556a54e..61b17a2193 100644 --- a/common/charge_state.c +++ b/common/charge_state.c @@ -7,6 +7,7 @@ #include "battery.h" #include "battery_pack.h" +#include "board.h" #include "charge_state.h" #include "charger.h" #include "chipset.h" @@ -575,22 +576,18 @@ int charge_want_shutdown(void) charge_get_percent() < BATTERY_LEVEL_SHUTDOWN; } -static int enter_force_idle_mode(void) +static int charge_force_idle(int enable) { - /* - * Force-idle state is only meaningful if external power is present. - * If it's not present we can't charge anyway... - */ - if (!(charge_get_flags() & CHARGE_FLAG_EXTERNAL_POWER)) - return EC_ERROR_UNKNOWN; - state_machine_force_idle = 1; - charger_post_init(); - return EC_SUCCESS; -} - -static int exit_force_idle_mode(void) -{ - state_machine_force_idle = 0; + if (enable) { + /* + * Force-idle state is only meaningful if external power is + * present. If it's not present we can't charge anyway... + */ + if (!(charge_get_flags() & CHARGE_FLAG_EXTERNAL_POWER)) + return EC_ERROR_UNKNOWN; + charger_post_init(); + } + state_machine_force_idle = enable; return EC_SUCCESS; } @@ -820,25 +817,33 @@ DECLARE_HOOK(HOOK_CHIPSET_SHUTDOWN, charge_shutdown, HOOK_PRIO_LAST); /*****************************************************************************/ /* Host commands */ -static int charge_command_force_idle(struct host_cmd_handler_args *args) +static int charge_command_charge_control(struct host_cmd_handler_args *args) { - const struct ec_params_force_idle *p = args->params; + const struct ec_params_charge_control *p = args->params; int rv; if (system_is_locked()) return EC_RES_ACCESS_DENIED; - if (p->enabled) - rv = enter_force_idle_mode(); - else - rv = exit_force_idle_mode(); + rv = charge_force_idle(p->mode != CHARGE_CONTROL_NORMAL); + if (rv != EC_SUCCESS) + return rv; +#ifdef CONFIG_CMD_DISCHARGE_ON_AC + rv = board_discharge_on_ac(p->mode == CHARGE_CONTROL_DISCHARGE); if (rv != EC_SUCCESS) - return EC_RES_ERROR; + return rv; +#endif /* CONFIG_CMD_DISCHARGE_ON_AC */ + return EC_RES_SUCCESS; } -DECLARE_HOST_COMMAND(EC_CMD_CHARGE_FORCE_IDLE, charge_command_force_idle, - EC_VER_MASK(0)); +/* + * TODO(crbug.com/239197) : Adding both versions to the version mask is a + * temporary workaround for a problem in the cros_ec driver. Drop + * EC_VER_MASK(0) once cros_ec driver can send the correct version. + */ +DECLARE_HOST_COMMAND(EC_CMD_CHARGE_CONTROL, charge_command_charge_control, + EC_VER_MASK(0) | EC_VER_MASK(1)); static int charge_command_dump(struct host_cmd_handler_args *args) { diff --git a/common/charger_bq24738.c b/common/charger_bq24738.c index 1bcbf22f1d..7fc8501fce 100644 --- a/common/charger_bq24738.c +++ b/common/charger_bq24738.c @@ -189,3 +189,20 @@ int charger_post_init(void) rv = charger_set_input_current(CONFIG_CHARGER_INPUT_CURRENT); return rv; } + +int charger_discharge_on_ac(int enable) +{ + int rv; + int option; + + rv = charger_get_option(&option); + if (rv) + return rv; + + if (enable) + rv = charger_set_option(option | OPTION_LEARN_ENABLE); + else + rv = charger_set_option(option & ~OPTION_LEARN_ENABLE); + + return rv; +} diff --git a/include/charger_bq24738.h b/include/charger_bq24738.h index 09336c9cb3..402b801a0c 100644 --- a/include/charger_bq24738.h +++ b/include/charger_bq24738.h @@ -54,5 +54,7 @@ #define ACPRES_DEGLITCH_150MS (0 << 15) #define ACPRES_DEGLITCH_1300MS_DEFAULT (1 << 15) -#endif /* __CROS_EC_CHARGER_BQ24738_H */ +/* Discharge battery when on AC power. */ +int charger_discharge_on_ac(int enable); +#endif /* __CROS_EC_CHARGER_BQ24738_H */ diff --git a/include/ec_commands.h b/include/ec_commands.h index f725b0b784..b9df4898b5 100644 --- a/include/ec_commands.h +++ b/include/ec_commands.h @@ -1396,11 +1396,20 @@ struct ec_params_i2c_write { /*****************************************************************************/ /* Charge state commands. Only available when flash write protect unlocked. */ -/* Force charge state machine to stop in idle mode */ -#define EC_CMD_CHARGE_FORCE_IDLE 0x96 +/* Force charge state machine to stop charging the battery or force it to + * discharge the battery. + */ +#define EC_CMD_CHARGE_CONTROL 0x96 +#define EC_VER_CHARGE_CONTROL 1 -struct ec_params_force_idle { - uint8_t enabled; +enum ec_charge_control_mode { + CHARGE_CONTROL_NORMAL = 0, + CHARGE_CONTROL_IDLE, + CHARGE_CONTROL_DISCHARGE, +}; + +struct ec_params_charge_control { + uint32_t mode; /* enum charge_control_mode */ } __packed; /*****************************************************************************/ diff --git a/util/ectool.c b/util/ectool.c index b68b5007a3..60633e7aae 100644 --- a/util/ectool.c +++ b/util/ectool.c @@ -40,8 +40,8 @@ const char help_str[] = " Set the maximum battery charging current\n" " chargedump\n" " Dump the context of charge state machine\n" - " chargeforceidle\n" - " Force charge state machine to stop in idle mode\n" + " chargecontrol\n" + " Force the battery to stop charging or discharge\n" " chipinfo\n" " Prints chip info\n" " cmdversions \n" @@ -2375,33 +2375,47 @@ int cmd_charge_current_limit(int argc, char *argv[]) } -int cmd_charge_force_idle(int argc, char *argv[]) +int cmd_charge_control(int argc, char *argv[]) { - struct ec_params_force_idle p; + struct ec_params_charge_control p; int rv; - char *e; if (argc != 2) { - fprintf(stderr, "Usage: %s <0|1>\n", argv[0]); + fprintf(stderr, "Usage: %s \n", + argv[0]); return -1; } - p.enabled = strtol(argv[1], &e, 0); - if (e && *e) { + if (!strcasecmp(argv[1], "normal")) { + p.mode = CHARGE_CONTROL_NORMAL; + } else if (!strcasecmp(argv[1], "idle")) { + p.mode = CHARGE_CONTROL_IDLE; + } else if (!strcasecmp(argv[1], "discharge")) { + p.mode = CHARGE_CONTROL_DISCHARGE; + } else { fprintf(stderr, "Bad value.\n"); return -1; } - rv = ec_command(EC_CMD_CHARGE_FORCE_IDLE, 0, &p, sizeof(p), NULL, 0); + rv = ec_command(EC_CMD_CHARGE_CONTROL, 1, &p, sizeof(p), NULL, 0); if (rv < 0) { fprintf(stderr, "Is AC connected?\n"); return rv; } - if (p.enabled) - printf("Charge state machine force idle.\n"); - else + switch (p.mode) { + case CHARGE_CONTROL_NORMAL: printf("Charge state machine normal mode.\n"); + break; + case CHARGE_CONTROL_IDLE: + printf("Charge state machine force idle.\n"); + break; + case CHARGE_CONTROL_DISCHARGE: + printf("Charge state machine force discharge.\n"); + break; + default: + break; + } return 0; } @@ -3097,7 +3111,7 @@ const struct command commands[] = { {"batterycutoff", cmd_battery_cut_off}, {"chargecurrentlimit", cmd_charge_current_limit}, {"chargedump", cmd_charge_dump}, - {"chargeforceidle", cmd_charge_force_idle}, + {"chargecontrol", cmd_charge_control}, {"chipinfo", cmd_chipinfo}, {"cmdversions", cmd_cmdversions}, {"console", cmd_console}, -- cgit v1.2.1