diff options
author | Shawn Nematbakhsh <shawnn@chromium.org> | 2016-06-22 17:55:38 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2016-06-24 17:23:14 -0700 |
commit | 203063609b52f4125ee91c474cf5f58178572050 (patch) | |
tree | cf8560d8304a59b558efca9eb90649019b7dbba4 /util | |
parent | 3bc0223b48a73a9fcc70cdbec886f22dd6c35cd3 (diff) | |
download | chrome-ec-203063609b52f4125ee91c474cf5f58178572050.tar.gz |
usb_mux: Add support for host-controlled 'virtual' USB mux
For designs where the host SOC is responsible for setting the USB-C SS
mux, the EC must track the desired mux state and inform the host when
the desired state changes. Then, the host must ask the EC for the new
desired state and set the mux accordingly.
BUG=chrome-os-partner:52639
BRANCH=None
TEST=Manual on gru with subsequent commit.
Attach USB dongle in port 1 and DP dongle in port 0, then verify `ectool
usbpdmuxinfo` output:
Port 0: DP
Port 1: USB
Flip DP dongle and verify output changes:
Port 0: DP INV
Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org>
Change-Id: I6a99ce93a76c3197f9195cfaa25c5217d09aeb75
Reviewed-on: https://chromium-review.googlesource.com/355281
Commit-Ready: Shawn N <shawnn@chromium.org>
Tested-by: Shawn N <shawnn@chromium.org>
Reviewed-by: Shawn N <shawnn@chromium.org>
Diffstat (limited to 'util')
-rw-r--r-- | util/ectool.c | 43 |
1 files changed, 42 insertions, 1 deletions
diff --git a/util/ectool.c b/util/ectool.c index 4b83f3fc04..07bd5adeb9 100644 --- a/util/ectool.c +++ b/util/ectool.c @@ -162,7 +162,7 @@ const char help_str[] = " port80read\n" " Print history of port 80 write\n" " powerinfo\n" - " Prints power-related information\n" + " Prints power-related information\n" " protoinfo\n" " Prints EC host protocol information\n" " pstoreinfo\n" @@ -223,6 +223,8 @@ const char help_str[] = "[toggle|toggle-off|sink|source] [none|usb|dp|dock] " "[dr_swap|pr_swap|vconn_swap]>\n" " Control USB PD/type-C\n" + " usbpdmuxinfo\n" + " Get USB-C SS mux info\n" " usbpdpower\n" " Get USB PD power information\n" " version\n" @@ -469,6 +471,8 @@ static const char * const ec_feature_names[] = { [EC_FEATURE_USB_PD] = "USB Cros Power Delievery", [EC_FEATURE_USB_MUX] = "USB Multiplexer", [EC_FEATURE_MOTION_SENSE_FIFO] = "FIFO for Motion Sensors events", + [EC_FEATURE_VSTORE] = "Temporary secure vstore", + [EC_FEATURE_USBC_SS_MUX_VIRTUAL] = "Host-controlled USB-C SS mux", }; int cmd_inventory(int argc, char *argv[]) @@ -4232,6 +4236,42 @@ static void print_pd_power_info(struct ec_response_usb_pd_power_info *r) printf("\n"); } +int cmd_usb_pd_mux_info(int argc, char *argv[]) +{ + struct ec_params_usb_pd_mux_info p; + struct ec_response_usb_pd_mux_info r; + int num_ports, rv, i; + + rv = ec_command(EC_CMD_USB_PD_PORTS, 0, NULL, 0, + ec_inbuf, ec_max_insize); + if (rv < 0) + return rv; + num_ports = ((struct ec_response_usb_pd_ports *)ec_inbuf)->num_ports; + + for (i = 0; i < num_ports; i++) { + p.port = i; + rv = ec_command(EC_CMD_USB_PD_MUX_INFO, 0, + &p, sizeof(p), + &r, sizeof(r)); + if (rv < 0) + return rv; + + printf("Port %d: ", i); + if (r.flags & USB_PD_MUX_USB_ENABLED) + printf("USB "); + if (r.flags & USB_PD_MUX_DP_ENABLED) + printf("DP "); + if (!(r.flags & (USB_PD_MUX_DP_ENABLED | + USB_PD_MUX_USB_ENABLED))) + printf("OPEN "); + if (r.flags & USB_PD_MUX_POLARITY_INVERTED) + printf("INV "); + printf("\n"); + } + + return 0; +} + int cmd_usb_pd_power(int argc, char *argv[]) { struct ec_params_usb_pd_power_info p; @@ -6865,6 +6905,7 @@ const struct command commands[] = { {"usbchargemode", cmd_usb_charge_set_mode}, {"usbmux", cmd_usb_mux}, {"usbpd", cmd_usb_pd}, + {"usbpdmuxinfo", cmd_usb_pd_mux_info}, {"usbpdpower", cmd_usb_pd_power}, {"version", cmd_version}, {"wireless", cmd_wireless}, |