summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWai-Hong Tam <waihong@google.com>2019-06-28 14:59:26 -0700
committerCommit Bot <commit-bot@chromium.org>2019-07-20 03:17:02 +0000
commit7d29ac01ea9c3a6ac3aba2dcace88ca43e2d8201 (patch)
treee6bb1b53de087448944cc0f850d1a6dd4afa46e0
parentb1d81401eebb4444123cacac08e88ef6e38ee58d (diff)
downloadchrome-ec-7d29ac01ea9c3a6ac3aba2dcace88ca43e2d8201.tar.gz
servo_v4: Support sink roles with PD comm enabled
For the normal lab use, emulating a sink has no PD comm, like a passive hub. For the PD FAFT use, we need to validate some PD behavior, should support sink roles with PD comm enabled. Two new roles "pdsnk" and "pdsnkdts" are introduced. BRANCH=servo BUG=b:134700685 TEST=Typed "cc pdsnk" or "cc pdsnkdts" can transit the DUT port to the PD state "SNK_READY", instead "SNK_DISCOVERY". Change-Id: If6a7c39cd296986b8b28de1c1fbe66ee8438c709 Signed-off-by: Wai-Hong Tam <waihong@google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1682920 Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
-rw-r--r--board/servo_v4/usb_pd_config.h1
-rw-r--r--board/servo_v4/usb_pd_policy.c26
2 files changed, 25 insertions, 2 deletions
diff --git a/board/servo_v4/usb_pd_config.h b/board/servo_v4/usb_pd_config.h
index 0d306771ba..9f17c94cce 100644
--- a/board/servo_v4/usb_pd_config.h
+++ b/board/servo_v4/usb_pd_config.h
@@ -60,6 +60,7 @@
#define CC_DISABLE_DTS (1 << 1) /* Apply resistors to single or both CC? */
#define CC_ALLOW_SRC (1 << 2) /* Allow charge through by policy? */
#define CC_ENABLE_DRP (1 << 3) /* Enable dual-role port */
+#define CC_SNK_WITH_PD (1 << 4) /* Force enabling PD comm for sink role */
/* TX uses SPI1 on PB3-4 for CHG port, SPI2 on PB 13-14 for DUT port */
#define SPI_REGS(p) ((p) ? STM32_SPI2_REGS : STM32_SPI1_REGS)
diff --git a/board/servo_v4/usb_pd_policy.c b/board/servo_v4/usb_pd_policy.c
index ec127c734f..b4746628f9 100644
--- a/board/servo_v4/usb_pd_policy.c
+++ b/board/servo_v4/usb_pd_policy.c
@@ -39,6 +39,9 @@
CC_ENABLE_DRP)
#define CONFIG_SNK(c) CONFIG_SET_CLEAR(c, \
CC_DISABLE_DTS, \
+ CC_ALLOW_SRC | CC_ENABLE_DRP | CC_SNK_WITH_PD)
+#define CONFIG_PDSNK(c) CONFIG_SET_CLEAR(c, \
+ CC_DISABLE_DTS | CC_SNK_WITH_PD, \
CC_ALLOW_SRC | CC_ENABLE_DRP)
#define CONFIG_DRP(c) CONFIG_SET_CLEAR(c, \
CC_DISABLE_DTS | CC_ALLOW_SRC | CC_ENABLE_DRP, \
@@ -48,6 +51,10 @@
CC_ENABLE_DRP | CC_DISABLE_DTS)
#define CONFIG_SNKDTS(c) CONFIG_SET_CLEAR(c, \
0, \
+ CC_ALLOW_SRC | CC_ENABLE_DRP | \
+ CC_DISABLE_DTS | CC_SNK_WITH_PD)
+#define CONFIG_PDSNKDTS(c) CONFIG_SET_CLEAR(c, \
+ CC_SNK_WITH_PD, \
CC_ALLOW_SRC | CC_ENABLE_DRP | CC_DISABLE_DTS)
#define CONFIG_DRPDTS(c) CONFIG_SET_CLEAR(c, \
CC_ALLOW_SRC | CC_ENABLE_DRP, \
@@ -794,7 +801,17 @@ static void do_cc(int cc_config_new)
*/
if (dualrole != PD_DRP_TOGGLE_ON)
pd_set_host_mode(DUT, chargeable);
- pd_comm_enable(DUT, chargeable);
+
+ /*
+ * For the normal lab use, emulating a sink has no PD
+ * comm, like a passive hub. For the PD FAFT use, we
+ * need to validate some PD behavior, so a flag
+ * CC_SNK_WITH_PD to force enabling PD comm.
+ */
+ if (cc_config & CC_SNK_WITH_PD)
+ pd_comm_enable(DUT, 1);
+ else
+ pd_comm_enable(DUT, chargeable);
}
}
}
@@ -818,12 +835,16 @@ static int command_cc(int argc, char **argv)
cc_config_new = CONFIG_SRC(cc_config_new);
else if (!strcasecmp(argv[1], "snk"))
cc_config_new = CONFIG_SNK(cc_config_new);
+ else if (!strcasecmp(argv[1], "pdsnk"))
+ cc_config_new = CONFIG_PDSNK(cc_config_new);
else if (!strcasecmp(argv[1], "drp"))
cc_config_new = CONFIG_DRP(cc_config_new);
else if (!strcasecmp(argv[1], "srcdts"))
cc_config_new = CONFIG_SRCDTS(cc_config_new);
else if (!strcasecmp(argv[1], "snkdts"))
cc_config_new = CONFIG_SNKDTS(cc_config_new);
+ else if (!strcasecmp(argv[1], "pdsnkdts"))
+ cc_config_new = CONFIG_PDSNKDTS(cc_config_new);
else if (!strcasecmp(argv[1], "drpdts"))
cc_config_new = CONFIG_DRPDTS(cc_config_new);
else
@@ -836,7 +857,8 @@ static int command_cc(int argc, char **argv)
return EC_SUCCESS;
}
DECLARE_CONSOLE_COMMAND(cc, command_cc,
- "[off|on|src|snk|drp|srcdts|snkdts|drpdts]",
+ "[off|on|src|snk|pdsnk|drp|srcdts|snkdts|pdsnkdts|"
+ "drpdts]",
"Servo_v4 DTS and CHG mode");
static void fake_disconnect_end(void)