diff options
author | Bill Richardson <wfrichar@chromium.org> | 2014-04-04 09:10:14 -0700 |
---|---|---|
committer | chrome-internal-fetch <chrome-internal-fetch@google.com> | 2014-04-05 01:42:21 +0000 |
commit | f06ad7e2ab4fa1a03c2e48a8bca3fdf2abbdffa9 (patch) | |
tree | 96cbbda28b09d2ac48199ae39ad91c2c8fd47eb0 /common | |
parent | 3e1db94ea03e43c37a165a5dd2f1693a54dbfefd (diff) | |
download | chrome-ec-f06ad7e2ab4fa1a03c2e48a8bca3fdf2abbdffa9.tar.gz |
Add host command to control charge state v2
This replaces the obsolete and temporary (ha!) EC_CMD_CHARGE_DUMP host
command with EC_CMD_CHARGE_STATE. This is used to monitor and adjust the new
charge state implementation, including any board-specific customizations.
This command is a single catch-all command with multiple subcommands
(similar to EC_CMD_LIGHTBAR_CMD) so that we don't have to keep adding new
top-level host commands just to support incremental changes.
BUG=chrome-os-partner:23776
BRANCH=ToT
TEST=manual
From the AP, try these commands:
ectool chargestate show
ectool chargestate param
ectool chargestate param <NUM>
ectool chargestate param <NUM> <VALUE>
Watch the EC console and use its "chg" command to verify the effects of
setting various params.
Note: the Samus-specific fast-charging profile override is param 0x10000.
You can check it with the EC console "fastcharge" command.
Change-Id: Iad2f773a085bc25c05073b3eed9866f122ae9d78
Signed-off-by: Bill Richardson <wfrichar@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/193305
Reviewed-by: Randall Spangler <rspangler@chromium.org>
Diffstat (limited to 'common')
-rw-r--r-- | common/charge_state_v1.c | 17 | ||||
-rw-r--r-- | common/charge_state_v2.c | 112 |
2 files changed, 108 insertions, 21 deletions
diff --git a/common/charge_state_v1.c b/common/charge_state_v1.c index d08aa2430b..1de56e34fa 100644 --- a/common/charge_state_v1.c +++ b/common/charge_state_v1.c @@ -979,23 +979,6 @@ static int charge_command_charge_control(struct host_cmd_handler_args *args) 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) -{ - char *dest = (char *)args->response; - - if (system_is_locked()) - return EC_RES_ACCESS_DENIED; - - ASSERT(sizeof(task_ctx) <= args->response_max); - - memcpy(dest, &task_ctx, sizeof(task_ctx)); - args->response_size = sizeof(task_ctx); - - return EC_RES_SUCCESS; -} -DECLARE_HOST_COMMAND(EC_CMD_CHARGE_DUMP, charge_command_dump, - EC_VER_MASK(0)); - static void reset_current_limit(void) { user_current_limit = -1; diff --git a/common/charge_state_v2.c b/common/charge_state_v2.c index f357187de8..6cd376bf16 100644 --- a/common/charge_state_v2.c +++ b/common/charge_state_v2.c @@ -271,11 +271,11 @@ static void show_charging_progress(void) /* * Ask the charger for some voltage and current. If either value is 0, - * charging is disabled; otherwise it's enabled. + * charging is disabled; otherwise it's enabled. Negative values are ignored. */ static int charge_request(int voltage, int current) { - int r1, r2; + int r1 = EC_SUCCESS, r2 = EC_SUCCESS; /* TODO(crosbug.com/p/27640): should we call charger_set_mode() too? */ if (!voltage || !current) @@ -283,11 +283,13 @@ static int charge_request(int voltage, int current) CPRINTF("[%T %s(%dmV, %dmA)]\n", __func__, voltage, current); - r1 = charger_set_voltage(voltage); + if (voltage > 0) + r1 = charger_set_voltage(voltage); if (r1 != EC_SUCCESS) problem(PR_SET_VOLTAGE, r1); - r2 = charger_set_current(current); + if (current > 0) + r2 = charger_set_current(current); if (r2 != EC_SUCCESS) problem(PR_SET_CURRENT, r2); @@ -743,6 +745,108 @@ static int charge_command_current_limit(struct host_cmd_handler_args *args) DECLARE_HOST_COMMAND(EC_CMD_CHARGE_CURRENT_LIMIT, charge_command_current_limit, EC_VER_MASK(0)); +static int charge_command_charge_state(struct host_cmd_handler_args *args) +{ + const struct ec_params_charge_state *in = args->params; + struct ec_response_charge_state *out = args->response; + uint32_t val; + int rv = EC_RES_SUCCESS; + + switch (in->cmd) { + + case CHARGE_STATE_CMD_GET_STATE: + out->get_state.ac = curr.ac; + out->get_state.chg_voltage = curr.chg.voltage; + out->get_state.chg_current = curr.chg.current; + out->get_state.chg_input_current = curr.chg.input_current; + out->get_state.batt_state_of_charge = curr.batt.state_of_charge; + args->response_size = sizeof(out->get_state); + break; + + case CHARGE_STATE_CMD_GET_PARAM: + val = 0; +#ifdef CONFIG_CHARGER_PROFILE_OVERRIDE + /* custom profile params */ + if (in->get_param.param >= CS_PARAM_CUSTOM_PROFILE_MIN && + in->get_param.param <= CS_PARAM_CUSTOM_PROFILE_MAX) { + rv = charger_profile_override_get_param( + in->get_param.param, &val); + } else +#endif + /* standard params */ + switch (in->get_param.param) { + case CS_PARAM_CHG_VOLTAGE: + val = curr.chg.voltage; + break; + case CS_PARAM_CHG_CURRENT: + val = curr.chg.current; + break; + case CS_PARAM_CHG_INPUT_CURRENT: + val = curr.chg.input_current; + break; + case CS_PARAM_CHG_STATUS: + val = curr.chg.status; + break; + case CS_PARAM_CHG_OPTION: + val = curr.chg.option; + break; + default: + rv = EC_RES_INVALID_PARAM; + } + + /* got something */ + out->get_param.value = val; + args->response_size = sizeof(out->get_param); + break; + + case CHARGE_STATE_CMD_SET_PARAM: + val = in->set_param.value; +#ifdef CONFIG_CHARGER_PROFILE_OVERRIDE + /* custom profile params */ + if (in->set_param.param >= CS_PARAM_CUSTOM_PROFILE_MIN && + in->set_param.param <= CS_PARAM_CUSTOM_PROFILE_MAX) { + rv = charger_profile_override_set_param( + in->set_param.param, val); + } else +#endif + switch (in->set_param.param) { + case CS_PARAM_CHG_VOLTAGE: + if (charge_request(val, -1)) + rv = EC_RES_ERROR; + break; + case CS_PARAM_CHG_CURRENT: + if (charge_request(-1, val)) + rv = EC_RES_ERROR; + break; + case CS_PARAM_CHG_INPUT_CURRENT: + if (charger_set_input_current(val)) + rv = EC_RES_ERROR; + break; + case CS_PARAM_CHG_STATUS: + /* Can't set this */ + rv = EC_RES_ACCESS_DENIED; + break; + case CS_PARAM_CHG_OPTION: + if (charger_set_option(val)) + rv = EC_RES_ERROR; + break; + default: + rv = EC_RES_INVALID_PARAM; + + } + break; + + default: + CPRINTF("[%T EC_CMD_CHARGE_STATE: bad cmd 0x%x]\n", in->cmd); + rv = EC_RES_INVALID_PARAM; + } + + return rv; +} + +DECLARE_HOST_COMMAND(EC_CMD_CHARGE_STATE, charge_command_charge_state, + EC_VER_MASK(0)); + /*****************************************************************************/ /* Console commands */ |