From f5b7b3242349aeabe55779541f34133681a96193 Mon Sep 17 00:00:00 2001 From: Todd Broch Date: Mon, 8 Sep 2014 17:18:42 -0700 Subject: samus: enhance usbpd host command to return port status. CL provides some useful information similar to the EC console command 'pd state ' when host command 'usbpd ' is sent from host with no additional arguments. Also added a few build asserts for role & mux strings. BRANCH=none BUG=chrome-os-partner:31690 TEST=manual ectool --interface=lpc --dev=1 usbpd 1 Port C1 is enabled. Role:SNK Polarity:CC1 State:6 # has zinger attached ectool --interface=lpc --dev=1 usbpd 0 Port C0 is enabled. Role:SNK Polarity:CC1 State:2 Change-Id: Id44eb7bf6a6fcfa888a0008a2249601967c50bcc Signed-off-by: Todd Broch Reviewed-on: https://chromium-review.googlesource.com/217138 Reviewed-by: Alec Berg --- common/usb_pd_protocol.c | 7 ++++++- include/ec_commands.h | 9 +++++++++ util/ectool.c | 20 ++++++++++++++++---- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/common/usb_pd_protocol.c b/common/usb_pd_protocol.c index 55f17a0eb0..161a851519 100644 --- a/common/usb_pd_protocol.c +++ b/common/usb_pd_protocol.c @@ -1879,6 +1879,7 @@ DECLARE_CONSOLE_COMMAND(typec, command_typec, static int hc_usb_pd_control(struct host_cmd_handler_args *args) { const struct ec_params_usb_pd_control *p = args->params; + struct ec_response_usb_pd_control *r = args->response; if (p->role != USB_PD_CTRL_ROLE_NO_CHANGE) { enum pd_dual_role_states role; @@ -1924,7 +1925,11 @@ static int hc_usb_pd_control(struct host_cmd_handler_args *args) board_set_usb_mux(p->port, mux, pd_get_polarity(p->port)); } #endif /* CONFIG_USBC_SS_MUX */ - + r->enabled = pd_comm_enabled; + r->role = pd[p->port].role; + r->polarity = pd[p->port].polarity; + r->state = pd[p->port].task_state; + args->response_size = sizeof(*r); return EC_RES_SUCCESS; } DECLARE_HOST_COMMAND(EC_CMD_USB_PD_CONTROL, diff --git a/include/ec_commands.h b/include/ec_commands.h index 6cbfe4fd4c..4428648511 100644 --- a/include/ec_commands.h +++ b/include/ec_commands.h @@ -2591,6 +2591,7 @@ enum usb_pd_control_role { USB_PD_CTRL_ROLE_TOGGLE_OFF = 2, USB_PD_CTRL_ROLE_FORCE_SINK = 3, USB_PD_CTRL_ROLE_FORCE_SOURCE = 4, + USB_PD_CTRL_ROLE_COUNT }; enum usb_pd_control_mux { @@ -2600,6 +2601,7 @@ enum usb_pd_control_mux { USB_PD_CTRL_MUX_DP = 3, USB_PD_CTRL_MUX_DOCK = 4, USB_PD_CTRL_MUX_AUTO = 5, + USB_PD_CTRL_MUX_COUNT }; struct ec_params_usb_pd_control { @@ -2608,6 +2610,13 @@ struct ec_params_usb_pd_control { uint8_t mux; } __packed; +struct ec_response_usb_pd_control { + uint8_t enabled; + uint8_t role; + uint8_t polarity; + uint8_t state; +} __packed; + /* Write USB-PD device FW */ #define EC_CMD_USB_PD_FW_UPDATE 0x110 diff --git a/util/ectool.c b/util/ectool.c index 822a418260..e816a7828b 100644 --- a/util/ectool.c +++ b/util/ectool.c @@ -23,6 +23,7 @@ #include "misc_util.h" #include "panic.h" #include "sha1.h" +#include "usb_pd.h" /* Command line options */ enum { @@ -2621,17 +2622,21 @@ int cmd_usb_mux(int argc, char *argv[]) int cmd_usb_pd(int argc, char *argv[]) { const char *role_str[] = {"", "toggle", "toggle-off", "sink", "source"}; - const char *mux_str[] = {"", "none", "usb", "dp", "dock"}; + const char *mux_str[] = {"", "none", "usb", "dp", "dock", "auto"}; struct ec_params_usb_pd_control p; + struct ec_response_usb_pd_control *r = + (struct ec_response_usb_pd_control *)ec_inbuf; int rv, i, j; int option_ok; char *e; + BUILD_ASSERT(ARRAY_SIZE(role_str) == USB_PD_CTRL_ROLE_COUNT); + BUILD_ASSERT(ARRAY_SIZE(mux_str) == USB_PD_CTRL_MUX_COUNT); p.role = USB_PD_CTRL_ROLE_NO_CHANGE; p.mux = USB_PD_CTRL_MUX_NO_CHANGE; - if (argc <= 2) { - fprintf(stderr, "No option specified.\n"); + if (argc < 2) { + fprintf(stderr, "No port specified.\n"); return -1; } @@ -2688,7 +2693,14 @@ int cmd_usb_pd(int argc, char *argv[]) } } - rv = ec_command(EC_CMD_USB_PD_CONTROL, 0, &p, sizeof(p), NULL, 0); + rv = ec_command(EC_CMD_USB_PD_CONTROL, 0, &p, sizeof(p), + ec_inbuf, ec_max_insize); + + if ((rv >= 0) && (argc == 2)) + printf("Port C%d is %sabled, Role:%s Polarity:CC%d State:%d\n", + p.port, (r->enabled) ? "en" : "dis", + r->role == PD_ROLE_SOURCE ? "SRC" : "SNK", + r->polarity + 1, r->state); return (rv < 0 ? rv : 0); } -- cgit v1.2.1