diff options
author | Shawn Nematbakhsh <shawnn@chromium.org> | 2014-11-19 15:58:30 -0800 |
---|---|---|
committer | chrome-internal-fetch <chrome-internal-fetch@google.com> | 2014-11-20 02:55:41 +0000 |
commit | b3bf2a61a385bf9aee3b231b1a0051d9ea349811 (patch) | |
tree | 5cad03b32da38ea1140253fc3b1724026e20c2d7 | |
parent | d5803a02693f72a80da64193a729a71ac585df6b (diff) | |
download | chrome-ec-b3bf2a61a385bf9aee3b231b1a0051d9ea349811.tar.gz |
charge_manager: Add PD_CHARGE_PORT_OVERRIDE host command
Add host command to set charge port override.
BUG=chrome-os-partner:32003
BRANCH=Samus
TEST=Manual on Samus. Insert PD charger in port1 and BC1.2 charger in
port0.
./ectool --name=cros_pd chargeoverride 0 --> Charges from port 0
./ectool --name=cros_pd chargeoverride off --> Charges from port 1
./ectool --name=cros_pd chargeoverride dontcharge --> No charge port
./ectool --name=cros_pd chargeoverride 1 --> Charges from port 1
./ectool --name=cros_pd chargeoverride 2 --> Correctly returns error
Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org>
Change-Id: Ib35f797a4a24e96fd2e3c008ace3fd6291b89d25
Reviewed-on: https://chromium-review.googlesource.com/230910
Reviewed-by: Alec Berg <alecaberg@chromium.org>
-rw-r--r-- | common/charge_manager.c | 34 | ||||
-rw-r--r-- | include/charge_manager.h | 7 | ||||
-rw-r--r-- | include/ec_commands.h | 13 | ||||
-rw-r--r-- | test/charge_manager.c | 8 | ||||
-rw-r--r-- | util/ectool.c | 36 |
5 files changed, 89 insertions, 9 deletions
diff --git a/common/charge_manager.c b/common/charge_manager.c index 7e80ca02f4..ba0afd5958 100644 --- a/common/charge_manager.c +++ b/common/charge_manager.c @@ -348,7 +348,30 @@ DECLARE_HOST_COMMAND(EC_CMD_USB_PD_POWER_INFO, EC_VER_MASK(0)); #endif /* TEST_CHARGE_MANAGER */ -static int command_charge_override(int argc, char **argv) +static int hc_charge_port_override(struct host_cmd_handler_args *args) +{ + const struct ec_params_charge_port_override *p = args->params; + const int16_t override_port = p->override_port; + + if (override_port < OVERRIDE_DONT_CHARGE || + override_port >= PD_PORT_COUNT) + return EC_RES_INVALID_PARAM; + + if (override_port >= 0 && pd_get_role(override_port) != PD_ROLE_SINK) + /* + * TODO(crosbug.com/p/31195): Switch dual-role ports + * from source to sink. + */ + return EC_RES_ERROR; + + charge_manager_set_override(override_port); + return EC_RES_SUCCESS; +} +DECLARE_HOST_COMMAND(EC_CMD_PD_CHARGE_PORT_OVERRIDE, + hc_charge_port_override, + EC_VER_MASK(0)); + +static int command_charge_port_override(int argc, char **argv) { int port = OVERRIDE_OFF; char *e; @@ -359,11 +382,18 @@ static int command_charge_override(int argc, char **argv) return EC_ERROR_PARAM1; } + if (port >= 0 && pd_get_role(override_port) != PD_ROLE_SINK) + /* + * TODO(crosbug.com/p/31195): Switch dual-role ports + * from source to sink. + */ + return EC_ERROR_PARAM1; + charge_manager_set_override(port); ccprintf("Set override: %d\n", port); return EC_SUCCESS; } -DECLARE_CONSOLE_COMMAND(chargeoverride, command_charge_override, +DECLARE_CONSOLE_COMMAND(chgoverride, command_charge_port_override, "[port | -1 | -2]", "Force charging from a given port (-1 = off, -2 = disable charging)", NULL); diff --git a/include/charge_manager.h b/include/charge_manager.h index d1b16cb7f3..be6ed6f859 100644 --- a/include/charge_manager.h +++ b/include/charge_manager.h @@ -15,13 +15,6 @@ #define CHARGE_CURRENT_UNINITIALIZED -1 #define CHARGE_VOLTAGE_UNINITIALIZED -1 -/* Port override settings */ -enum { - OVERRIDE_DONT_CHARGE = -2, - OVERRIDE_OFF = -1, - /* [0, PD_PORT_COUNT): Port# */ -}; - #define POWER(charge_port) ((charge_port.current) * (charge_port.voltage)) /* Charge tasks report available current and voltage */ diff --git a/include/ec_commands.h b/include/ec_commands.h index 630b837f90..416e4a83bf 100644 --- a/include/ec_commands.h +++ b/include/ec_commands.h @@ -2805,6 +2805,19 @@ struct ec_params_usb_pd_discovery_entry { uint8_t ptype; /* product type (hub,periph,cable,ama) */ } __packed; +/* Override default charge behavior */ +#define EC_CMD_PD_CHARGE_PORT_OVERRIDE 0x114 + +/* Negative port parameters have special meaning */ +enum usb_pd_override_ports { + OVERRIDE_DONT_CHARGE = -2, + OVERRIDE_OFF = -1, + /* [0, PD_PORT_COUNT): Port# */ +}; + +struct ec_params_charge_port_override { + int16_t override_port; /* Override port# */ +} __packed; #endif /* !__ACPI__ */ /*****************************************************************************/ diff --git a/test/charge_manager.c b/test/charge_manager.c index 52f6552da5..6c05d8e0b6 100644 --- a/test/charge_manager.c +++ b/test/charge_manager.c @@ -6,8 +6,11 @@ */ #include "charge_manager.h" +#include "common.h" +#include "ec_commands.h" #include "test_util.h" #include "timer.h" +#include "usb_pd.h" #include "usb_pd_config.h" #include "util.h" @@ -75,6 +78,11 @@ int pd_get_partner_dualrole_capable(int port) return dual_role_capable[port]; } +int pd_get_role(int port) +{ + return PD_ROLE_SINK; +} + static void wait_for_charge_manager_refresh(void) { msleep(CHARGE_MANAGER_SLEEP_MS); diff --git a/util/ectool.c b/util/ectool.c index 0222720d00..9901358b5d 100644 --- a/util/ectool.c +++ b/util/ectool.c @@ -60,6 +60,8 @@ const char help_str[] = " Set the maximum battery charging current\n" " chargecontrol\n" " Force the battery to stop charging or discharge\n" + " chargeoverride\n" + " Overrides charge port selection logic\n" " chargestate\n" " Handle commands related to charge state v2 (and later)\n" " chipinfo\n" @@ -5159,6 +5161,39 @@ int cmd_force_lid_open(int argc, char *argv[]) return 0; } +int cmd_charge_port_override(int argc, char *argv[]) +{ + struct ec_params_charge_port_override p; + char *e; + int rv; + + if (argc < 2) { + fprintf(stderr, "Usage: %s <port# | dontcharge | off>\n", + argv[0]); + return -1; + } + + if (!strcasecmp(argv[1], "dontcharge")) + p.override_port = OVERRIDE_DONT_CHARGE; + else if (!strcasecmp(argv[1], "off")) + p.override_port = OVERRIDE_OFF; + else { + p.override_port = strtol(argv[1], &e, 0); + if (e && *e) { + fprintf(stderr, "Bad parameter.\n"); + return -1; + } + } + + rv = ec_command(EC_CMD_PD_CHARGE_PORT_OVERRIDE, 0, &p, sizeof(p), + NULL, 0); + if (rv < 0) + return rv; + + printf("Override port set to %d\n", p.override_port); + return 0; +} + /* NULL-terminated list of commands */ const struct command commands[] = { {"extpwrcurrentlimit", cmd_ext_power_current_limit}, @@ -5170,6 +5205,7 @@ const struct command commands[] = { {"boardversion", cmd_board_version}, {"chargecurrentlimit", cmd_charge_current_limit}, {"chargecontrol", cmd_charge_control}, + {"chargeoverride", cmd_charge_port_override}, {"chargestate", cmd_charge_state}, {"chipinfo", cmd_chipinfo}, {"cmdversions", cmd_cmdversions}, |