diff options
author | Sam Hurst <shurst@google.com> | 2018-09-13 09:27:08 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2019-04-08 22:30:19 -0700 |
commit | 0fe6147a9d8d9feef5049aa6c6c4a6ad30d12b26 (patch) | |
tree | 05d4509bcfe68a248ec3fa58168f3de2536c2d9c /common/usb_pd_tcpc.c | |
parent | e097feb8b2db20cd2435a483517356defa222db1 (diff) | |
download | chrome-ec-0fe6147a9d8d9feef5049aa6c6c4a6ad30d12b26.tar.gz |
chocodile_vpdmcu: Firmware for chocodile mcu
Implement Chocodile Charge-Through Vconn Powered firmware for mcu
using new Type-C/PD State machine stack.
BUG=b:115626873
BRANCH=none
TEST=manual
Charge-Through was tested on an Atlas running a DRP USB-C/PD state
machine with CTUnattached.SNK and CTAttached.SNK states.
Signed-off-by: Sam Hurst <shurst@chromium.org>
Change-Id: I847f1bcd2fc3ce41e66edd133a10c943d5e8c819
Reviewed-on: https://chromium-review.googlesource.com/1225250
Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com>
Tested-by: Sam Hurst <shurst@google.com>
Reviewed-by: Stefan Reinauer <reinauer@google.com>
Diffstat (limited to 'common/usb_pd_tcpc.c')
-rw-r--r-- | common/usb_pd_tcpc.c | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/common/usb_pd_tcpc.c b/common/usb_pd_tcpc.c index 83a1569223..2bdadcec7e 100644 --- a/common/usb_pd_tcpc.c +++ b/common/usb_pd_tcpc.c @@ -343,11 +343,19 @@ int prepare_message(int port, uint16_t header, uint8_t cnt, int off, i; /* 64-bit preamble */ off = pd_write_preamble(port); +#if defined(CONFIG_USB_TYPEC_VPD) || defined(CONFIG_USB_TYPEC_CTVPD) + /* Start Of Packet Prime: 2x Sync-1 + 2x Sync-3 */ + off = pd_write_sym(port, off, BMC(PD_SYNC1)); + off = pd_write_sym(port, off, BMC(PD_SYNC1)); + off = pd_write_sym(port, off, BMC(PD_SYNC3)); + off = pd_write_sym(port, off, BMC(PD_SYNC3)); +#else /* Start Of Packet: 3x Sync-1 + 1x Sync-2 */ off = pd_write_sym(port, off, BMC(PD_SYNC1)); off = pd_write_sym(port, off, BMC(PD_SYNC1)); off = pd_write_sym(port, off, BMC(PD_SYNC1)); off = pd_write_sym(port, off, BMC(PD_SYNC2)); +#endif /* header */ off = encode_short(port, off, header); @@ -682,6 +690,17 @@ int pd_analyze_rx(int port, uint32_t *payload) /* Find the Start Of Packet sequence */ while (bit > 0) { bit = pd_dequeue_bits(port, bit, 20, &val); +#if defined(CONFIG_USB_TYPEC_VPD) || defined(CONFIG_USB_TYPEC_CTVPD) + if (val == PD_SOP_PRIME) { + break; + } else if (val == PD_SOP) { + CPRINTF("SOP\n"); + return PD_RX_ERR_UNSUPPORTED_SOP; + } else if (val == PD_SOP_PRIME_PRIME) { + CPRINTF("SOP''\n"); + return PD_RX_ERR_UNSUPPORTED_SOP; + } +#else /* CONFIG_USB_TYPEC_VPD || CONFIG_USB_TYPEC_CTVPD */ #ifdef CONFIG_USB_PD_DECODE_SOP if (val == PD_SOP || val == PD_SOP_PRIME || val == PD_SOP_PRIME_PRIME) @@ -696,7 +715,8 @@ int pd_analyze_rx(int port, uint32_t *payload) CPRINTF("SOP''\n"); return PD_RX_ERR_UNSUPPORTED_SOP; } -#endif +#endif /* CONFIG_USB_PD_DECODE_SOP */ +#endif /* CONFIG_USB_TYPEC_VPD || CONFIG_USB_TYPEC_CTVPD */ } if (bit < 0) { #ifdef CONFIG_USB_PD_DECODE_SOP @@ -872,7 +892,11 @@ int tcpc_run(int port, int evt) /* outgoing packet ? */ if ((evt & PD_EVENT_TX) && pd[port].rx_enabled) { switch (pd[port].tx_type) { +#if defined(CONFIG_USB_TYPEC_VPD) || defined(CONFIG_USB_TYPEC_CTVPD) + case TCPC_TX_SOP_PRIME: +#else case TCPC_TX_SOP: +#endif res = send_validate_message(port, pd[port].tx_head, pd[port].tx_data); @@ -938,7 +962,7 @@ int tcpc_run(int port, int evt) #endif } -#ifndef CONFIG_USB_POWER_DELIVERY +#if !defined(CONFIG_USB_POWER_DELIVERY) && !defined(CONFIG_USB_SM_FRAMEWORK) void pd_task(void *u) { int port = TASK_ID_TO_PD_PORT(task_get_current()); |