summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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)