diff options
Diffstat (limited to 'common')
-rw-r--r-- | common/usbc/build.mk | 1 | ||||
-rw-r--r-- | common/usbc/usb_pd_console.c | 163 |
2 files changed, 164 insertions, 0 deletions
diff --git a/common/usbc/build.mk b/common/usbc/build.mk index f8f6f5aa33..3b29d5d9ad 100644 --- a/common/usbc/build.mk +++ b/common/usbc/build.mk @@ -28,6 +28,7 @@ ifneq ($(CONFIG_USB_PE_SM),) all-obj-$(CONFIG_USB_VPD)+=$(_usbc_dir)usb_pe_ctvpd_sm.o all-obj-$(CONFIG_USB_CTVPD)+=$(_usbc_dir)usb_pe_ctvpd_sm.o all-obj-$(CONFIG_USB_DRP_ACC_TRYSRC)+=$(_usbc_dir)usb_pe_drp_sm.o +all-obj-$(CONFIG_CMD_PD)+=$(_usbc_dir)usb_pd_console.o endif # CONFIG_USB_PE_SM endif # CONFIG_USB_PD_TCPMV2 diff --git a/common/usbc/usb_pd_console.c b/common/usbc/usb_pd_console.c new file mode 100644 index 0000000000..ba2b6efeb9 --- /dev/null +++ b/common/usbc/usb_pd_console.c @@ -0,0 +1,163 @@ +/* Copyright 2020 The Chromium OS Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "common.h" +#include "console.h" +#include "usb_common.h" +#include "usb_pe_sm.h" +#include "usb_tc_sm.h" +#include "usb_pd.h" +#include "util.h" + +test_export_static int command_pd(int argc, char **argv) +{ + int port; + char *e; + + if (argc < 2) + return EC_ERROR_PARAM_COUNT; + else if (IS_ENABLED(CONFIG_USB_PD_TRY_SRC) && + !strcasecmp(argv[1], "trysrc")) { + enum try_src_override_t ov = tc_get_try_src_override(); + + if (argc >= 3) { + ov = strtoi(argv[2], &e, 10); + if (*e || ov > TRY_SRC_NO_OVERRIDE) + return EC_ERROR_PARAM3; + tc_try_src_override(ov); + } + + if (ov == TRY_SRC_NO_OVERRIDE) + ccprintf("Try.SRC System controlled\n"); + else + ccprintf("Try.SRC Forced %s\n", ov ? "ON" : "OFF"); + + return EC_SUCCESS; + } + + /* command: pd <port> <subcmd> [args] */ + port = strtoi(argv[1], &e, 10); + if (argc < 3) + return EC_ERROR_PARAM_COUNT; + + if (*e || port >= CONFIG_USB_PD_PORT_MAX_COUNT) + return EC_ERROR_PARAM2; + + if (IS_ENABLED(CONFIG_USB_PD_DUAL_ROLE)) { + if (!strcasecmp(argv[2], "tx")) { + pe_dpm_request(port, DPM_REQUEST_SNK_STARTUP); + } else if (!strcasecmp(argv[2], "charger")) { + pe_dpm_request(port, DPM_REQUEST_SRC_STARTUP); + } else if (!strcasecmp(argv[2], "dev")) { + int max_volt; + + if (argc >= 4) { + max_volt = strtoi(argv[3], &e, 10) * 1000; + if (*e) + return EC_ERROR_PARAM3; + } else { + max_volt = pd_get_max_voltage(); + } + pd_request_source_voltage(port, max_volt); + pe_dpm_request(port, DPM_REQUEST_NEW_POWER_LEVEL); + ccprintf("max req: %dmV\n", max_volt); + } else if (!strcasecmp(argv[2], "disable")) { + pd_comm_enable(port, 0); + ccprintf("Port C%d disable\n", port); + return EC_SUCCESS; + } else if (!strcasecmp(argv[2], "enable")) { + pd_comm_enable(port, 1); + ccprintf("Port C%d enabled\n", port); + return EC_SUCCESS; + } else if (!strcasecmp(argv[2], "hard")) { + pe_dpm_request(port, DPM_REQUEST_HARD_RESET_SEND); + } else if (!strcasecmp(argv[2], "soft")) { + pe_dpm_request(port, DPM_REQUEST_SOFT_RESET_SEND); + } else if (!strcasecmp(argv[2], "swap")) { + if (argc < 4) + return EC_ERROR_PARAM_COUNT; + + if (!strcasecmp(argv[3], "power")) + pe_dpm_request(port, DPM_REQUEST_PR_SWAP); + else if (!strcasecmp(argv[3], "data")) + pe_dpm_request(port, DPM_REQUEST_DR_SWAP); + else if (IS_ENABLED(CONFIG_USBC_VCONN_SWAP) && + !strcasecmp(argv[3], "vconn")) + pe_dpm_request(port, DPM_REQUEST_VCONN_SWAP); + else + return EC_ERROR_PARAM3; + } else if (!strcasecmp(argv[2], "dualrole")) { + if (argc < 4) { + ccprintf("dual-role toggling: "); + switch (pd_get_dual_role(port)) { + case PD_DRP_TOGGLE_ON: + ccprintf("on\n"); + break; + case PD_DRP_TOGGLE_OFF: + ccprintf("off\n"); + break; + case PD_DRP_FREEZE: + ccprintf("freeze\n"); + break; + case PD_DRP_FORCE_SINK: + ccprintf("force sink\n"); + break; + case PD_DRP_FORCE_SOURCE: + ccprintf("force source\n"); + break; + } + } else { + if (!strcasecmp(argv[3], "on")) + pd_set_dual_role(port, + PD_DRP_TOGGLE_ON); + else if (!strcasecmp(argv[3], "off")) + pd_set_dual_role(port, + PD_DRP_TOGGLE_OFF); + else if (!strcasecmp(argv[3], "freeze")) + pd_set_dual_role(port, PD_DRP_FREEZE); + else if (!strcasecmp(argv[3], "sink")) + pd_set_dual_role(port, + PD_DRP_FORCE_SINK); + else if (!strcasecmp(argv[3], "source")) + pd_set_dual_role(port, + PD_DRP_FORCE_SOURCE); + else + return EC_ERROR_PARAM4; + } + return EC_SUCCESS; + } + } + + if (!strcasecmp(argv[2], "state")) { + ccprintf("Port C%d CC%d, %s - Role: %s-%s", + port, pd_get_polarity(port) + 1, + pd_comm_is_enabled(port) ? "Enable" : "Disable", + pd_get_power_role(port) == + PD_ROLE_SOURCE ? "SRC" : "SNK", + pd_get_data_role(port) == PD_ROLE_DFP ? "DFP" : "UFP"); + + if (IS_ENABLED(CONFIG_USBC_VCONN)) + ccprintf("%s ", tc_is_vconn_src(port) ? "-VC" : ""); + + ccprintf("TC State: %s, Flags: 0x%04x\n", + tc_get_current_state(port), + tc_get_flags(port)); + } + + return EC_SUCCESS; +} +DECLARE_CONSOLE_COMMAND(pd, command_pd, +#ifdef CONFIG_USB_PD_TRY_SRC + "trysrc [0|1|2]" +#endif + "\n\t<port> state" +#ifdef CONFIG_USB_PD_DUAL_ROLE + "|tx|charger|dev" + "\n\t<port> disable|enable|soft|hard" + "\n\t<port> dualrole [on|off|freeze|sink|source]" + "\n\t<port> swap [power|data|vconn]" +#endif /* CONFIG_USB_PD_DUAL_ROLE */ + , + "USB PD"); |