pd: Remove ACCESSORY states

According to the USB-C spec, when a debug accessory is identified, we may
optionally establish USB PD communication over CC. Some DTS partners
(eg. servo_v4) expect us to speak PD, so let's make it so. There is no
need for special ACCESSORY states, these do not exist in the PD spec.

BRANCH=servo
BUG=chromium:737755,b:65837068
TEST=On scarlet, attach servo_v4 and verify scarlet charges. Also verify
EC and cr50 consoles are available through servo_v4.

Change-Id: I59d1ca50b4766509eccf38562cdf926578138585
Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/693294
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-12 08:21:41 -07:00
committed by chrome-bot
parent 7c2c5a9dc3
commit 251212fb9d
17 changed files with 56 additions and 145 deletions

View File

@@ -76,7 +76,6 @@
#define CONFIG_TABLET_MODE
/* USB PD config */
#define CONFIG_CASE_CLOSED_DEBUG_EXTERNAL
#define CONFIG_CMD_PD_CONTROL
#define CONFIG_USB_PD_ALT_MODE
#define CONFIG_USB_PD_ALT_MODE_DFP

View File

@@ -28,7 +28,6 @@
#define CONFIG_BOARD_VERSION
#define CONFIG_BOARD_SPECIFIC_VERSION
#define CONFIG_BUTTON_COUNT 2
#define CONFIG_CASE_CLOSED_DEBUG_EXTERNAL
#define CONFIG_DEVICE_EVENT
#define CONFIG_DPTF
#define CONFIG_DPTF_DEVICE_ORIENTATION

View File

@@ -25,7 +25,6 @@
#define CONFIG_LED_COMMON
#define CONFIG_KEYBOARD_PROTOCOL_MKBP
#define CONFIG_MKBP_USE_HOST_EVENT
#define CONFIG_CASE_CLOSED_DEBUG_EXTERNAL
#define CONFIG_DPTF
#define CONFIG_FLASH_SIZE 0x80000
#define CONFIG_FPU

View File

@@ -57,7 +57,6 @@
#define GPIO_USB_CTL1 GPIO_USB_A_CHARGE_EN_L
/* USB PD config */
#define CONFIG_CASE_CLOSED_DEBUG_EXTERNAL
#define CONFIG_CMD_PD_CONTROL
#define CONFIG_USB_PD_ALT_MODE
#define CONFIG_USB_PD_ALT_MODE_DFP

View File

@@ -115,7 +115,6 @@
#define CONFIG_TABLET_MODE_SWITCH
/* USB PD config */
#define CONFIG_CASE_CLOSED_DEBUG_EXTERNAL
#define CONFIG_CHARGE_MANAGER
#define CONFIG_CHARGE_RAMP_SW
#define CONFIG_USB_POWER_DELIVERY

View File

@@ -104,7 +104,6 @@
#define CONFIG_ACCEL_FORCE_MODE_MASK (1 << LID_ACCEL)
/* USB PD config */
#define CONFIG_CASE_CLOSED_DEBUG_EXTERNAL
#define CONFIG_CHARGE_MANAGER
#define CONFIG_USB_POWER_DELIVERY
#define CONFIG_USB_PD_ALT_MODE

View File

@@ -21,7 +21,6 @@
#define CONFIG_BOARD_SPECIFIC_VERSION
#define CONFIG_BUTTON_COUNT 2
#define CONFIG_BUTTON_RECOVERY
#define CONFIG_CASE_CLOSED_DEBUG_EXTERNAL
#define CONFIG_DPTF
#define CONFIG_EMULATED_SYSRQ
#define CONFIG_FLASH_SIZE 0x80000

View File

@@ -76,7 +76,6 @@
#define CONFIG_TABLET_MODE
/* USB PD config */
#define CONFIG_CASE_CLOSED_DEBUG_EXTERNAL
#define CONFIG_CMD_PD_CONTROL
#define CONFIG_USB_PD_ALT_MODE
#define CONFIG_USB_PD_ALT_MODE_DFP

View File

@@ -64,7 +64,6 @@
#define GPIO_USB_CTL1 GPIO_EN_PP5000
/* USB PD config */
#define CONFIG_CASE_CLOSED_DEBUG_EXTERNAL
#define CONFIG_USB_MUX_PI3USB30532
#define CONFIG_USB_MUX_PS8740
#define CONFIG_CMD_PD_CONTROL

View File

@@ -94,7 +94,6 @@
#define CONFIG_ACCEL_FORCE_MODE_MASK (1 << LID_BARO)
/* USB PD config */
#define CONFIG_CASE_CLOSED_DEBUG_EXTERNAL
#define CONFIG_CHARGE_MANAGER
#define CONFIG_USB_POWER_DELIVERY
#define CONFIG_USB_PD_ALT_MODE

View File

@@ -6,7 +6,6 @@
#include "adc.h"
#include "adc_chip.h"
#include "case_closed_debug.h"
#include "common.h"
#include "console.h"
#include "ec_version.h"
@@ -395,9 +394,9 @@ static void check_for_disconnect(void)
ccd_keepalive_enabled = 0;
}
void ccd_set_mode(enum ccd_mode new_mode)
void ccd_enable(int enable)
{
if (new_mode == CCD_MODE_ENABLED) {
if (enable) {
/*
* Unfortunately the polarity detect is designed for real plug
* events, and only accurately detects pre-connect idle. If
@@ -414,7 +413,7 @@ void ccd_set_mode(enum ccd_mode new_mode)
/* Allow some time following turning on of VBUS */
hook_call_deferred(&ccd_measure_sbu_data,
PD_POWER_SUPPLY_TURN_ON_DELAY);
} else if (new_mode == CCD_MODE_DISABLED) {
} else {
/* We are not connected to anything */
/* Disable ccd_measure_sbu deferred call always */

View File

@@ -90,7 +90,6 @@
#define CONFIG_CHARGE_MANAGER
#define CONFIG_USB_POWER_DELIVERY
#define CONFIG_USB_PD_DTS
#define CONFIG_CMD_PD
#define CONFIG_USB_PD_DUAL_ROLE
#define CONFIG_USB_PD_DYNAMIC_SRC_CAP
@@ -219,5 +218,11 @@ int pd_set_rp_rd(int port, int cc_pull, int rp_value);
*/
int board_get_version(void);
/**
* Enable or disable CCD
*
* @param enable Enable CCD if true, otherwise disable
*/
void ccd_enable(int enable);
#endif /* !__ASSEMBLER__ */
#endif /* __CROS_EC_BOARD_H */

View File

@@ -409,6 +409,10 @@ int pd_set_power_supply_ready(int port)
vbus[DUT].mv = 5000;
vbus[DUT].ma = 500;
/* Enable CCD, if debuggable TS attached */
if (pd_ts_dts_plugged(DUT))
ccd_enable(1);
return EC_SUCCESS; /* we are ready */
}
@@ -418,6 +422,8 @@ void pd_power_supply_reset(int port)
if (port == CHG)
return;
ccd_enable(0);
/* Disable VBUS */
gpio_set_level(GPIO_DUT_CHG_EN, 0);
/* Set default VBUS source to Host */

View File

@@ -5,7 +5,6 @@
#include "battery.h"
#include "board.h"
#include "case_closed_debug.h"
#include "charge_manager.h"
#include "charge_state.h"
#include "chipset.h"
@@ -110,8 +109,6 @@ static struct pd_protocol {
uint8_t power_role;
/* current port data role (DFP or UFP) */
uint8_t data_role;
/* port flags, see PD_FLAGS_* */
uint16_t flags;
/* 3-bit rolling message ID counter */
uint8_t msg_id;
/* Port polarity : 0 => CC1 is CC line, 1 => CC2 is CC line */
@@ -124,6 +121,8 @@ static struct pd_protocol {
uint8_t req_suspend_state;
/* The state to go to after timeout */
enum pd_states timeout_state;
/* port flags, see PD_FLAGS_* */
uint32_t flags;
/* Timeout for the current state. Set to 0 for no timeout. */
uint64_t timeout;
/* Time for source recovery after hard reset */
@@ -170,12 +169,12 @@ static const char * const pd_state_names[] = {
"DISABLED", "SUSPENDED",
#ifdef CONFIG_USB_PD_DUAL_ROLE
"SNK_DISCONNECTED", "SNK_DISCONNECTED_DEBOUNCE",
"SNK_ACCESSORY", "SNK_HARD_RESET_RECOVER",
"SNK_HARD_RESET_RECOVER",
"SNK_DISCOVERY", "SNK_REQUESTED", "SNK_TRANSITION", "SNK_READY",
"SNK_SWAP_INIT", "SNK_SWAP_SNK_DISABLE",
"SNK_SWAP_SRC_DISABLE", "SNK_SWAP_STANDBY", "SNK_SWAP_COMPLETE",
#endif /* CONFIG_USB_PD_DUAL_ROLE */
"SRC_DISCONNECTED", "SRC_DISCONNECTED_DEBOUNCE", "SRC_ACCESSORY",
"SRC_DISCONNECTED", "SRC_DISCONNECTED_DEBOUNCE",
"SRC_HARD_RESET_RECOVER", "SRC_STARTUP",
"SRC_DISCOVERY", "SRC_NEGOCIATE", "SRC_ACCEPTED", "SRC_POWERED",
"SRC_TRANSITION", "SRC_READY", "SRC_GET_SNK_CAP", "DR_SWAP",
@@ -240,6 +239,15 @@ int pd_is_connected(int port)
pd[port].task_state != PD_STATE_SRC_DISCONNECTED_DEBOUNCE);
}
/*
* Return true if partner port is a DTS or TS capable of entering debug
* mode (eg. is presenting Rp/Rp or Rd/Rd).
*/
int pd_ts_dts_plugged(int port)
{
return pd[port].flags & PD_FLAGS_TS_DTS_PARTNER;
}
#ifdef CONFIG_USB_PD_DUAL_ROLE
void pd_vbus_low(int port)
{
@@ -254,17 +262,6 @@ static inline int pd_is_vbus_present(int port)
return pd_snk_is_vbus_provided(port);
#endif
}
static int pd_debug_acc_plugged(int port)
{
#ifdef CONFIG_CASE_CLOSED_DEBUG_EXTERNAL
return pd[port].task_state == PD_STATE_SRC_ACCESSORY ||
pd[port].task_state == PD_STATE_SNK_ACCESSORY;
#else
/* Debug accessories not supported */
return 0;
#endif
}
#endif
static inline void set_state(int port, enum pd_states next_state)
@@ -1381,7 +1378,7 @@ void pd_update_dual_role_config(int port)
* disconnected state).
*/
if (pd[port].power_role == PD_ROLE_SOURCE &&
((drp_state == PD_DRP_FORCE_SINK && !pd_debug_acc_plugged(port)) ||
((drp_state == PD_DRP_FORCE_SINK && !pd_ts_dts_plugged(port)) ||
(drp_state == PD_DRP_TOGGLE_OFF
&& pd[port].task_state == PD_STATE_SRC_DISCONNECTED))) {
pd[port].power_role = PD_ROLE_SINK;
@@ -1907,13 +1904,18 @@ void pd_task(void *u)
/* Debounce complete */
/* UFP is attached */
if (new_cc_state == PD_CC_UFP_ATTACHED) {
pd[port].polarity = (cc2 == TYPEC_CC_VOLT_RD);
if (new_cc_state == PD_CC_UFP_ATTACHED ||
new_cc_state == PD_CC_DEBUG_ACC) {
pd[port].polarity = (cc1 != TYPEC_CC_VOLT_RD);
tcpm_set_polarity(port, pd[port].polarity);
/* initial data role for source is DFP */
pd_set_data_role(port, PD_ROLE_DFP);
if (new_cc_state == PD_CC_DEBUG_ACC)
pd[port].flags |=
PD_FLAGS_TS_DTS_PARTNER;
#ifndef CONFIG_USBC_BACKWARDS_COMPATIBLE_DFP
/* Enable VBUS */
if (pd_set_power_supply_ready(port)) {
@@ -1940,60 +1942,10 @@ void pd_task(void *u)
timeout = 5*MSEC;
set_state(port, PD_STATE_SRC_STARTUP);
}
/* Accessory is attached */
else if (new_cc_state == PD_CC_AUDIO_ACC ||
new_cc_state == PD_CC_DEBUG_ACC) {
#ifdef CONFIG_USBC_BACKWARDS_COMPATIBLE_DFP
/* Remove VBUS */
pd_power_supply_reset(port);
#endif
/* Set the USB muxes and the default USB role */
pd_set_data_role(port, CONFIG_USB_PD_DEBUG_DR);
#ifdef CONFIG_USB_PD_DTS
if (new_cc_state == PD_CC_DEBUG_ACC) {
ccd_set_mode(system_is_locked() ?
CCD_MODE_PARTIAL :
CCD_MODE_ENABLED);
/* Enable Vbus */
pd_set_power_supply_ready(port);
/* Captive cable, CC1 always */
pd[port].polarity = 0;
tcpm_set_polarity(port, 0);
/* Enable TCPC RX */
if (pd_comm_is_enabled(port))
tcpm_set_rx_enable(port, 1);
pd[port].flags |=
PD_FLAGS_CHECK_DR_ROLE;
hard_reset_count = 0;
timeout = 10*MSEC;
set_state(port, PD_STATE_SRC_STARTUP);
break;
}
#endif
set_state(port, PD_STATE_SRC_ACCESSORY);
}
break;
case PD_STATE_SRC_ACCESSORY:
/* Combined audio / debug accessory state */
timeout = 100*MSEC;
tcpm_get_cc(port, &cc1, &cc2);
/* If accessory becomes detached */
if ((pd[port].cc_state == PD_CC_AUDIO_ACC &&
(cc1 != TYPEC_CC_VOLT_RA ||
cc2 != TYPEC_CC_VOLT_RA)) ||
(pd[port].cc_state == PD_CC_DEBUG_ACC &&
(cc1 != TYPEC_CC_VOLT_RD ||
cc2 != TYPEC_CC_VOLT_RD))) {
set_state(port, PD_STATE_SRC_DISCONNECTED);
#ifdef CONFIG_USB_PD_DTS
ccd_set_mode(CCD_MODE_DISABLED);
#endif
timeout = 10*MSEC;
}
/*
* AUDIO_ACC will remain in this state indefinitely
* until disconnect.
*/
break;
case PD_STATE_SRC_HARD_RESET_RECOVER:
/* Do not continue until hard reset recovery time */
@@ -2454,32 +2406,20 @@ void pd_task(void *u)
tcpm_set_rx_enable(port, 1);
/* DFP is attached */
if (new_cc_state == PD_CC_DFP_ATTACHED) {
if (new_cc_state == PD_CC_DFP_ATTACHED ||
new_cc_state == PD_CC_DEBUG_ACC) {
pd[port].flags |= PD_FLAGS_CHECK_PR_ROLE |
PD_FLAGS_CHECK_DR_ROLE |
PD_FLAGS_CHECK_IDENTITY;
if (new_cc_state == PD_CC_DEBUG_ACC)
pd[port].flags |=
PD_FLAGS_TS_DTS_PARTNER;
set_state(port, PD_STATE_SNK_DISCOVERY);
timeout = 10*MSEC;
hook_call_deferred(
&pd_usb_billboard_deferred_data,
PD_T_AME);
}
#ifdef CONFIG_CASE_CLOSED_DEBUG_EXTERNAL
else if (new_cc_state == PD_CC_DEBUG_ACC)
set_state(port, PD_STATE_SNK_ACCESSORY);
break;
case PD_STATE_SNK_ACCESSORY:
/* debug accessory state */
timeout = 100*MSEC;
tcpm_get_cc(port, &cc1, &cc2);
/* If accessory becomes detached */
if (!cc_is_rp(cc1) || !cc_is_rp(cc2)) {
set_state(port, PD_STATE_SNK_DISCONNECTED);
timeout = 10*MSEC;
}
#endif
break;
case PD_STATE_SNK_HARD_RESET_RECOVER:
if (pd[port].last_state != pd[port].task_state)
@@ -3025,9 +2965,6 @@ void pd_task(void *u)
set_state(port, PD_STATE_SRC_DISCONNECTED);
/* Debouncing */
timeout = 10*MSEC;
#ifdef CONFIG_USB_PD_DTS
ccd_set_mode(CCD_MODE_DISABLED);
#endif
#ifdef CONFIG_USB_PD_DUAL_ROLE
/*
* If Try.SRC is configured, then ATTACHED_SRC

View File

@@ -7,34 +7,6 @@
#ifndef __CROS_EC_CASE_CLOSED_DEBUG_H
#define __CROS_EC_CASE_CLOSED_DEBUG_H
enum ccd_mode {
/*
* The disabled mode tri-states the DP and DN lines.
*/
CCD_MODE_DISABLED,
/*
* The partial mode allows some CCD functionality and is to be set
* when the device is write protected and a CCD cable is detected.
* This mode gives access to the APs console.
*/
CCD_MODE_PARTIAL,
/*
* The fully enabled mode is used in factory and test lab
* configurations where it is acceptable to be able to reflash the
* device over CCD.
*/
CCD_MODE_ENABLED,
CCD_MODE_COUNT,
};
/*
* Set current CCD mode, this function is idempotent.
*/
void ccd_set_mode(enum ccd_mode new_mode);
/**
* Return non-zero if the CCD external interface is enabled.
*/

View File

@@ -410,8 +410,6 @@
*/
#undef CONFIG_DEDICATED_RECOVERY_BUTTON
/* The case close debug (CCD) feature is provided by an external chip. */
#undef CONFIG_CASE_CLOSED_DEBUG_EXTERNAL
/* Support V1 CCD configuration */
#undef CONFIG_CASE_CLOSED_DEBUG_V1
/* Allow unsafe debugging functionality in V1 configuration */
@@ -2509,9 +2507,6 @@
*/
#undef CONFIG_USB_PD_DISCHARGE_TCPC
/* Define if this board is acting as a Debug Test System (DTS) */
#undef CONFIG_USB_PD_DTS
/* Define if this board can act as a dual-role PD port (source and sink) */
#undef CONFIG_USB_PD_DUAL_ROLE

View File

@@ -639,7 +639,6 @@ enum pd_states {
#ifdef CONFIG_USB_PD_DUAL_ROLE
PD_STATE_SNK_DISCONNECTED,
PD_STATE_SNK_DISCONNECTED_DEBOUNCE,
PD_STATE_SNK_ACCESSORY,
PD_STATE_SNK_HARD_RESET_RECOVER,
PD_STATE_SNK_DISCOVERY,
PD_STATE_SNK_REQUESTED,
@@ -655,7 +654,6 @@ enum pd_states {
PD_STATE_SRC_DISCONNECTED,
PD_STATE_SRC_DISCONNECTED_DEBOUNCE,
PD_STATE_SRC_ACCESSORY,
PD_STATE_SRC_HARD_RESET_RECOVER,
PD_STATE_SRC_STARTUP,
PD_STATE_SRC_DISCOVERY,
@@ -711,6 +709,7 @@ enum pd_states {
#define PD_FLAGS_TRY_SRC (1 << 13)/* Try.SRC states are active */
#define PD_FLAGS_PARTNER_USB_COMM (1 << 14)/* port partner is USB comms */
#define PD_FLAGS_UPDATE_SRC_CAPS (1 << 15)/* send new source capabilities */
#define PD_FLAGS_TS_DTS_PARTNER (1 << 16)/* partner has rp/rp or rd/rd */
/* Flags to clear on a disconnect */
#define PD_FLAGS_RESET_ON_DISCONNECT_MASK (PD_FLAGS_PARTNER_DR_POWER | \
PD_FLAGS_PARTNER_DR_DATA | \
@@ -725,8 +724,8 @@ enum pd_states {
PD_FLAGS_VCONN_ON | \
PD_FLAGS_TRY_SRC | \
PD_FLAGS_PARTNER_USB_COMM | \
PD_FLAGS_UPDATE_SRC_CAPS)
PD_FLAGS_UPDATE_SRC_CAPS | \
PD_FLAGS_TS_DTS_PARTNER)
enum pd_cc_states {
PD_CC_NONE,
@@ -1613,6 +1612,14 @@ void pd_prepare_reset(void);
*/
void pd_set_new_power_request(int port);
/**
* Return true if partner port is a DTS or TS capable of entering debug
* mode (eg. is presenting Rp/Rp or Rd/Rd).
*
* @param port USB-C port number
*/
int pd_ts_dts_plugged(int port);
/* ----- Logging ----- */
#ifdef CONFIG_USB_PD_LOGGING
/**