summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTodd Broch <tbroch@chromium.org>2014-10-01 18:49:50 -0700
committerchrome-internal-fetch <chrome-internal-fetch@google.com>2014-10-11 02:22:28 +0000
commit8a6c72022f1a43fe8288eed2e1a5b94400ca4b1f (patch)
tree66bb4c18e1bd6fee90b21df243d04585156be134
parent44e4f7cfe7953198091cfd5e39bf339a770138dc (diff)
downloadchrome-ec-8a6c72022f1a43fe8288eed2e1a5b94400ca4b1f.tar.gz
pd: Enable alternate mode support for DP.
Change effects: 1. samus_pd: Acts as initiator of SVDM discovery once its reaches source ready and upon identifying UFP with display port alternate mode enters that mode. 2. hoho: Acts as responder for SVDM discovery providing its identity, svids and svid capabilities which are display port only. If asked to enter display port alternate mode it does. 3. fruitpie: Acts a initiator with mock display port mode. BRANCH=none BUG=chrome-os-partner:30645 TEST=manual, Plug hoho into samus_pd - see dpout - from console > typec 0 Port C0: CC1 451 mV CC2 111 mV (polarity:CC1) Superspeed DP1 Change-Id: I1a76767353a69baeceffa3e79c37dcea77b8337d Signed-off-by: Todd Broch <tbroch@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/221354 Reviewed-by: Alec Berg <alecaberg@chromium.org> Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
-rw-r--r--board/fruitpie/board.h2
-rw-r--r--board/fruitpie/usb_pd_policy.c21
-rw-r--r--board/hoho/usb_pd_policy.c4
-rw-r--r--board/samus_pd/board.h2
-rw-r--r--board/samus_pd/usb_pd_policy.c41
-rw-r--r--common/usb_pd_policy.c10
-rw-r--r--include/usb_pd.h10
7 files changed, 67 insertions, 23 deletions
diff --git a/board/fruitpie/board.h b/board/fruitpie/board.h
index d20606ebbb..72549bc557 100644
--- a/board/fruitpie/board.h
+++ b/board/fruitpie/board.h
@@ -21,9 +21,9 @@
#define CONFIG_USB_MS
#define CONFIG_USB_MS_BUFFER_SIZE SPI_FLASH_MAX_WRITE_SIZE
#define CONFIG_USB_POWER_DELIVERY
-#define CONFIG_USB_PD_CUSTOM_VDM
#define CONFIG_USB_PD_ALT_MODE
#define CONFIG_USB_PD_ALT_MODE_DFP
+#define CONFIG_USB_PD_CUSTOM_VDM
#define CONFIG_USB_PD_DUAL_ROLE
#define CONFIG_USB_PD_INTERNAL_COMP
#define CONFIG_USBC_SS_MUX
diff --git a/board/fruitpie/usb_pd_policy.c b/board/fruitpie/usb_pd_policy.c
index 0c87d66f63..216bc1bb18 100644
--- a/board/fruitpie/usb_pd_policy.c
+++ b/board/fruitpie/usb_pd_policy.c
@@ -186,20 +186,20 @@ int pd_vdm(int port, int cnt, uint32_t *payload, uint32_t **rpayload)
return pd_custom_vdm(port, cnt, payload, rpayload);
}
-static void svdm_enter_dp_mode(uint32_t mode_caps)
+static void svdm_enter_dp_mode(int port, uint32_t mode_caps)
{
ccprintf("Entering mode w/ vdo = %08x\n", mode_caps);
}
-static void svdm_exit_dp_mode(void)
+static void svdm_exit_dp_mode(int port)
{
ccprintf("Exiting mode\n");
/* return to safe config */
}
-static struct svdm_amode_data supported_modes[] = {
+const struct svdm_amode_fx supported_modes[] = {
{
- .svid = 0xff01,
+ .svid = USB_SID_DISPLAYPORT,
.enter = &svdm_enter_dp_mode,
.exit = &svdm_exit_dp_mode,
},
@@ -208,20 +208,17 @@ static struct svdm_amode_data supported_modes[] = {
void pd_dfp_choose_modes(struct pd_policy *pe)
{
int i, j;
- struct svdm_amode_data *modep;
- pe->amode_cnt = sizeof(supported_modes) / sizeof(struct
- svdm_amode_data);
- pe->amodes = modep = supported_modes;
+ pe->amode_cnt = ARRAY_SIZE(supported_modes);
+ pe->amodes->fx = supported_modes;
for (i = 0; i < pe->amode_cnt; i++) {
for (j = 0; j < pe->svid_cnt; j++) {
- if (pe->svids[j].svid == modep->svid) {
+ if (pe->svids[j].svid == pe->amodes->fx[i].svid) {
/* TODO(tbroch) need more elaborate mode
resolution */
- modep->mode_caps = &pe->svids[j].mode_vdo[0];
- modep->amode = dfp_amode1;
+ pe->amodes[i].mode_caps = pe->svids[j].mode_vdo;
+ pe->amodes[i].amode = dfp_amode1;
break;
}
}
- modep++;
}
}
diff --git a/board/hoho/usb_pd_policy.c b/board/hoho/usb_pd_policy.c
index 19881ac782..20097e80c1 100644
--- a/board/hoho/usb_pd_policy.c
+++ b/board/hoho/usb_pd_policy.c
@@ -188,9 +188,9 @@ static int pd_custom_vdm(int port, int cnt, uint32_t *payload,
rsize = 7;
break;
default:
- /* Unknown : do not answer */
- return 0;
+ rsize = 0;
}
+
ccprintf("%T] DONE\n");
/* respond (positively) to the request */
payload[0] |= VDO_SRC_RESPONDER;
diff --git a/board/samus_pd/board.h b/board/samus_pd/board.h
index a666af34b4..e986375635 100644
--- a/board/samus_pd/board.h
+++ b/board/samus_pd/board.h
@@ -27,6 +27,8 @@
#define CONFIG_STM_HWTIMER32
#undef CONFIG_TASK_PROFILING
#define CONFIG_USB_POWER_DELIVERY
+#define CONFIG_USB_PD_ALT_MODE
+#define CONFIG_USB_PD_ALT_MODE_DFP
#undef CONFIG_USB_PD_COMM_ENABLED
#define CONFIG_USB_PD_COMM_ENABLED 0
#define CONFIG_USB_PD_CUSTOM_VDM
diff --git a/board/samus_pd/usb_pd_policy.c b/board/samus_pd/usb_pd_policy.c
index 7b7237059b..dce1407ec3 100644
--- a/board/samus_pd/usb_pd_policy.c
+++ b/board/samus_pd/usb_pd_policy.c
@@ -158,6 +158,12 @@ static void pd_send_host_event(void)
}
/* ----------------- Vendor Defined Messages ------------------ */
+const struct svdm_response svdm_rsp = {
+ .identity = NULL,
+ .svids = NULL,
+ .modes = NULL,
+};
+
static int pd_custom_vdm(int port, int cnt, uint32_t *payload,
uint32_t **rpayload)
{
@@ -208,6 +214,41 @@ int pd_vdm(int port, int cnt, uint32_t *payload, uint32_t **rpayload)
return pd_custom_vdm(port, cnt, payload, rpayload);
}
+static void svdm_enter_dp_mode(int port, uint32_t mode_caps)
+{
+ board_set_usb_mux(port, TYPEC_MUX_DP, pd_get_polarity(port));
+}
+
+static void svdm_exit_dp_mode(int port)
+{
+ board_set_usb_mux(port, TYPEC_MUX_NONE, pd_get_polarity(port));
+}
+
+const struct svdm_amode_fx supported_modes[] = {
+ {
+ .svid = USB_SID_DISPLAYPORT,
+ .enter = &svdm_enter_dp_mode,
+ .exit = &svdm_exit_dp_mode,
+ },
+};
+
+void pd_dfp_choose_modes(struct pd_policy *pe)
+{
+ int i, j;
+ pe->amode_cnt = ARRAY_SIZE(supported_modes);
+ pe->amodes->fx = supported_modes;
+ for (i = 0; i < pe->amode_cnt; i++) {
+ for (j = 0; j < pe->svid_cnt; j++) {
+ if (pe->svids[j].svid == pe->amodes->fx[i].svid) {
+ /* TODO(tbroch) need more elaborate mode
+ resolution */
+ pe->amodes[i].mode_caps = pe->svids[j].mode_vdo;
+ pe->amodes[i].amode = dfp_amode1;
+ break;
+ }
+ }
+ }
+}
/****************************************************************************/
/* Console commands */
static int command_ec_int(int argc, char **argv)
diff --git a/common/usb_pd_policy.c b/common/usb_pd_policy.c
index 2042b474a7..b7e072775d 100644
--- a/common/usb_pd_policy.c
+++ b/common/usb_pd_policy.c
@@ -106,8 +106,8 @@ static int dfp_enter_modes(int port, uint32_t *payload)
if (modep->amode == dfp_amode_none)
return 0;
- modep->enter(*modep->mode_caps);
- payload[0] = VDO(modep->svid, 1,
+ modep->fx->enter(port, *modep->mode_caps);
+ payload[0] = VDO(modep->fx->svid, 1,
CMD_ENTER_MODE |
VDO_OPOS(modep->amode));
pe[port].amode_idx++;
@@ -124,8 +124,8 @@ int pd_exit_modes(int port, uint32_t *payload)
if (modep->amode == dfp_amode_none)
return 1;
- modep->exit();
- payload[0] = VDO(modep->svid, 1,
+ modep->fx->exit(port);
+ payload[0] = VDO(modep->fx->svid, 1,
CMD_EXIT_MODE |
VDO_OPOS(modep->amode));
pe[port].amode_idx++;
@@ -146,7 +146,7 @@ static void dump_pe(int port)
}
for (i = 0; i < pe[port].amode_cnt; i++) {
ccprintf("MODE[%d]: svid:%04x mode:%d caps:%08x\n", i,
- modep->svid, modep->amode, *modep->mode_caps);
+ modep->fx->svid, modep->amode, *modep->mode_caps);
modep++;
}
}
diff --git a/include/usb_pd.h b/include/usb_pd.h
index 895e4d3cc6..d96ca9b1fd 100644
--- a/include/usb_pd.h
+++ b/include/usb_pd.h
@@ -134,12 +134,16 @@ struct svdm_svid_data {
uint32_t mode_vdo[PDO_MODES];
};
-struct svdm_amode_data {
+struct svdm_amode_fx {
uint16_t svid;
+ void (*enter)(int port, uint32_t mode_caps);
+ void (*exit)(int port);
+};
+
+struct svdm_amode_data {
+ const struct svdm_amode_fx *fx;
enum dfp_amode amode;
uint32_t *mode_caps;
- void (*enter)(uint32_t mode_caps);
- void (*exit)(void);
};
/* Policy structure for driving alternate mode */