pd: Add "freeze" dual-role policy

Add a new DRP policy to "freeze" the power role of each port, never
toggling automatically, though manual role swaps may still occur.

BUG=chromium:769895
BRANCH=servo
TEST=On servo_v4, verify DUT port stays in SRC role and POWER port
stays in SNK role while disconnected.

Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org>
Change-Id: Ibff3cd1ffaf0e884b030c231003763a57acbe02e
Reviewed-on: https://chromium-review.googlesource.com/715276
Commit-Ready: Shawn N <shawnn@chromium.org>
Tested-by: Shawn N <shawnn@chromium.org>
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
This commit is contained in:
Shawn Nematbakhsh
2017-10-11 23:18:34 -07:00
committed by chrome-bot
parent e7dfbf35a4
commit 7c2c5a9dc3
6 changed files with 25 additions and 3 deletions

View File

@@ -104,6 +104,10 @@
/* Override PD_ROLE_DEFAULT in usb_pd.h */
#define PD_ROLE_DEFAULT(port) ((port) ? PD_ROLE_SOURCE : PD_ROLE_SINK)
/* Don't automatically change roles */
#undef CONFIG_USB_PD_INITIAL_DRP_STATE
#define CONFIG_USB_PD_INITIAL_DRP_STATE PD_DRP_FREEZE
/* Variable-current Rp no connect and Ra attach macros */
#define CC_NC(port, cc, sel) (pd_tcpc_cc_nc(port, cc, sel))
#define CC_RA(port, cc, sel) (pd_tcpc_cc_ra(port, cc, sel))

View File

@@ -95,7 +95,7 @@ enum vdm_states {
#ifdef CONFIG_USB_PD_DUAL_ROLE
/* Port dual-role state */
enum pd_dual_role_states drp_state = PD_DRP_TOGGLE_OFF;
enum pd_dual_role_states drp_state = CONFIG_USB_PD_INITIAL_DRP_STATE;
/* Last received source cap */
static uint32_t pd_src_caps[CONFIG_USB_PD_PORT_COUNT][PDO_MAX_OBJECTS];
@@ -1842,7 +1842,7 @@ void pd_task(void *u)
set_state(port,
PD_STATE_SRC_DISCONNECTED_DEBOUNCE);
}
#if defined(CONFIG_USB_PD_DUAL_ROLE) && !defined(CONFIG_USB_PD_DTS)
#if defined(CONFIG_USB_PD_DUAL_ROLE)
/*
* Try.SRC state is embedded here. Wait for SNK
* detect, or if timer expires, transition to
@@ -1855,6 +1855,7 @@ void pd_task(void *u)
get_time().val >= pd[port].try_src_marker) ||
(!(pd[port].flags & PD_FLAGS_TRY_SRC) &&
drp_state != PD_DRP_FORCE_SOURCE &&
drp_state != PD_DRP_FREEZE &&
get_time().val >= next_role_swap)) {
pd[port].power_role = PD_ROLE_SINK;
set_state(port, PD_STATE_SNK_DISCONNECTED);
@@ -3338,6 +3339,9 @@ static int command_pd(int argc, char **argv)
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;
@@ -3350,6 +3354,8 @@ static int command_pd(int argc, char **argv)
pd_set_dual_role(PD_DRP_TOGGLE_ON);
else if (!strcasecmp(argv[2], "off"))
pd_set_dual_role(PD_DRP_TOGGLE_OFF);
else if (!strcasecmp(argv[2], "freeze"))
pd_set_dual_role(PD_DRP_FREEZE);
else if (!strcasecmp(argv[2], "sink"))
pd_set_dual_role(PD_DRP_FORCE_SINK);
else if (!strcasecmp(argv[2], "source"))
@@ -3557,6 +3563,7 @@ static const enum pd_dual_role_states dual_role_map[USB_PD_CTRL_ROLE_COUNT] = {
[USB_PD_CTRL_ROLE_TOGGLE_OFF] = PD_DRP_TOGGLE_OFF,
[USB_PD_CTRL_ROLE_FORCE_SINK] = PD_DRP_FORCE_SINK,
[USB_PD_CTRL_ROLE_FORCE_SOURCE] = PD_DRP_FORCE_SOURCE,
[USB_PD_CTRL_ROLE_FREEZE] = PD_DRP_FREEZE,
};
#ifdef CONFIG_USBC_SS_MUX

View File

@@ -2518,6 +2518,9 @@
/* Define if this board can used TCPC-controlled DRP toggle */
#undef CONFIG_USB_PD_DUAL_ROLE_AUTO_TOGGLE
/* Initial DRP / toggle policy */
#define CONFIG_USB_PD_INITIAL_DRP_STATE PD_DRP_TOGGLE_OFF
/*
* Define if VBUS source GPIOs (GPIO_USB_C*_5V_EN) are active-low (and named
* (..._L) rather than default active-high.

View File

@@ -3948,6 +3948,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_FREEZE = 5,
USB_PD_CTRL_ROLE_COUNT
};

View File

@@ -743,9 +743,15 @@ enum pd_cc_states {
#ifdef CONFIG_USB_PD_DUAL_ROLE
enum pd_dual_role_states {
/* While disconnected, toggle between src and sink */
PD_DRP_TOGGLE_ON,
/* Stay in src until disconnect, then stay in sink forever */
PD_DRP_TOGGLE_OFF,
/* Stay in current power role, don't switch. No auto-toggle support */
PD_DRP_FREEZE,
/* Switch to sink */
PD_DRP_FORCE_SINK,
/* Switch to source */
PD_DRP_FORCE_SOURCE,
};
/**

View File

@@ -4414,7 +4414,8 @@ 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 *role_str[] = {"", "toggle", "toggle-off", "sink", "source",
"freeze"};
const char *mux_str[] = {"", "none", "usb", "dp", "dock", "auto"};
const char *swap_str[] = {"", "dr_swap", "pr_swap", "vconn_swap"};
struct ec_params_usb_pd_control p;