summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVic Yang <victoryang@chromium.org>2014-11-13 15:16:56 -0800
committerchrome-internal-fetch <chrome-internal-fetch@google.com>2014-12-29 17:45:27 +0000
commitff91ba5bb1cdddfbf0892855f0d8de4c3190ce66 (patch)
treee47bcf6c65035600c579dc96074ea5fe8a7c8b6c
parent73bbc9eda8bbdfa190e3fdde16a852dd2755276c (diff)
downloadchrome-ec-ff91ba5bb1cdddfbf0892855f0d8de4c3190ce66.tar.gz
Plankton: add console command to simulate cable unplug
For factory testing, we need a way to simulate unplugging type-C cable. To do so, we disable VBUS output and pull-up/pull-down on CC lines on Plankton, so that the CC lines become floating. BRANCH=None BUG=chrome-os-partner:32163 TEST=Connect Plankton to Ryu. Try 'fake_disconnect' as SRC/SNK. Change-Id: I73a7355e078b6aed4b7d281d480e0aedbc8c2db0 Signed-off-by: Vic Yang <victoryang@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/229662 Reviewed-by: Pin-chih Lin <johnylin@chromium.org> Tested-by: Pin-chih Lin <johnylin@chromium.org> Reviewed-by: Alec Berg <alecaberg@chromium.org>
-rw-r--r--board/plankton/board.c121
-rw-r--r--board/plankton/board.h12
-rw-r--r--board/plankton/usb_pd_config.h34
3 files changed, 139 insertions, 28 deletions
diff --git a/board/plankton/board.c b/board/plankton/board.c
index de836dfc0d..6ab987be95 100644
--- a/board/plankton/board.c
+++ b/board/plankton/board.c
@@ -26,6 +26,10 @@
static enum gpio_signal button_pressed;
+static int fake_pd_disconnected;
+static int fake_pd_host_mode;
+static int fake_pd_disconnect_duration_ms;
+
enum usbc_action {
USBC_ACT_5V_TO_DUT,
USBC_ACT_12V_TO_DUT,
@@ -259,3 +263,120 @@ static void board_init_usb_hub(void)
hook_call_deferred(board_usb_hub_reset_no_return, 500 * MSEC);
}
DECLARE_HOOK(HOOK_INIT, board_init_usb_hub, HOOK_PRIO_DEFAULT);
+
+void board_pd_set_host_mode(int enable)
+{
+ cprintf(CC_USBPD, "Host mode: %d\n", enable);
+
+ if (board_pd_fake_disconnected()) {
+ board_update_fake_adc_value(enable);
+ return;
+ }
+
+ if (enable) {
+ /* Source mode, disable charging */
+ gpio_set_level(GPIO_USBC_CHARGE_EN, 0);
+ /* High Z for no pull-down resistor on CC1 */
+ gpio_set_flags_by_mask(GPIO_A, (1 << 9), GPIO_INPUT);
+ /* Set pull-up resistor on CC1 */
+ gpio_set_flags_by_mask(GPIO_A, (1 << 2), GPIO_OUT_HIGH);
+ /* High Z for no pull-down resistor on CC2 */
+ gpio_set_flags_by_mask(GPIO_B, (1 << 7), GPIO_INPUT);
+ /* Set pull-up resistor on CC2 */
+ gpio_set_flags_by_mask(GPIO_B, (1 << 6), GPIO_OUT_HIGH);
+ } else {
+ /* Device mode, disable VBUS */
+ gpio_set_level(GPIO_VBUS_CHARGER_EN, 0);
+ gpio_set_level(GPIO_USBC_VSEL_0, 0);
+ gpio_set_level(GPIO_USBC_VSEL_1, 0);
+ /* High Z for no pull-up resistor on CC1 */
+ gpio_set_flags_by_mask(GPIO_A, (1 << 2), GPIO_INPUT);
+ /* Set pull-down resistor on CC1 */
+ gpio_set_flags_by_mask(GPIO_A, (1 << 9), GPIO_OUT_LOW);
+ /* High Z for no pull-up resistor on CC2 */
+ gpio_set_flags_by_mask(GPIO_B, (1 << 6), GPIO_INPUT);
+ /* Set pull-down resistor on CC2 */
+ gpio_set_flags_by_mask(GPIO_B, (1 << 7), GPIO_OUT_LOW);
+ /* Set charge enable */
+ gpio_set_level(GPIO_USBC_CHARGE_EN, 1);
+ }
+}
+
+int board_pd_fake_disconnected(void)
+{
+ return fake_pd_disconnected;
+}
+
+int board_fake_pd_adc_read(void)
+{
+ if (fake_pd_host_mode)
+ return 3000; /* mV */
+ else
+ return 0; /* mV */
+}
+
+void board_update_fake_adc_value(int host_mode)
+{
+ fake_pd_host_mode = host_mode;
+}
+
+static void fake_disconnect_end(void)
+{
+ fake_pd_disconnected = 0;
+ board_pd_set_host_mode(fake_pd_host_mode);
+}
+DECLARE_DEFERRED(fake_disconnect_end);
+
+static void fake_disconnect_start(void)
+{
+ /* Record the current host mode */
+ fake_pd_host_mode = !gpio_get_level(GPIO_USBC_CHARGE_EN);
+ /* Disable VBUS */
+ gpio_set_level(GPIO_VBUS_CHARGER_EN, 0);
+ gpio_set_level(GPIO_USBC_VSEL_0, 0);
+ gpio_set_level(GPIO_USBC_VSEL_1, 0);
+ /* High Z for no pull-up resistor on CC1 */
+ gpio_set_flags_by_mask(GPIO_A, (1 << 2), GPIO_INPUT);
+ /* High Z for no pull-up resistor on CC2 */
+ gpio_set_flags_by_mask(GPIO_B, (1 << 6), GPIO_INPUT);
+ /* High Z for no pull-down resistor on CC1 */
+ gpio_set_flags_by_mask(GPIO_A, (1 << 9), GPIO_INPUT);
+ /* High Z for no pull-down resistor on CC2 */
+ gpio_set_flags_by_mask(GPIO_B, (1 << 7), GPIO_INPUT);
+
+ fake_pd_disconnected = 1;
+
+ hook_call_deferred(fake_disconnect_end,
+ fake_pd_disconnect_duration_ms * MSEC);
+}
+DECLARE_DEFERRED(fake_disconnect_start);
+
+static int cmd_fake_disconnect(int argc, char *argv[])
+{
+ int delay_ms, duration_ms;
+ char *e;
+
+ if (argc < 3)
+ return EC_ERROR_PARAM_COUNT;
+
+ delay_ms = strtoi(argv[1], &e, 0);
+ if (*e || delay_ms < 0)
+ return EC_ERROR_PARAM1;
+ duration_ms = strtoi(argv[2], &e, 0);
+ if (*e || duration_ms < 0)
+ return EC_ERROR_PARAM2;
+
+ /* Cancel any pending function calls */
+ hook_call_deferred(fake_disconnect_start, -1);
+ hook_call_deferred(fake_disconnect_end, -1);
+
+ fake_pd_disconnect_duration_ms = duration_ms;
+ hook_call_deferred(fake_disconnect_start, delay_ms * MSEC);
+
+ ccprintf("Fake disconnect for %d ms starting in %d ms.\n",
+ duration_ms, delay_ms);
+
+ return EC_SUCCESS;
+}
+DECLARE_CONSOLE_COMMAND(fake_disconnect, cmd_fake_disconnect,
+ "<delay_ms> <duration_ms>", NULL, NULL);
diff --git a/board/plankton/board.h b/board/plankton/board.h
index 50abc6faab..a2accc8058 100644
--- a/board/plankton/board.h
+++ b/board/plankton/board.h
@@ -67,6 +67,18 @@ void board_set_source_cap(enum board_src_cap cap);
/* Reset USB hub if USB hub is switched to type-C port */
void board_maybe_reset_usb_hub(void);
+/* Whether faking PD disconnected or not */
+int board_pd_fake_disconnected(void);
+
+/* Get fake ADC reading */
+int board_fake_pd_adc_read(void);
+
+/* Set fake PD pull-up/pull-down */
+void board_update_fake_adc_value(int host_mode);
+
+/* Set pull-up/pull-down on CC lines */
+void board_pd_set_host_mode(int enable);
+
#endif /* !__ASSEMBLER__ */
#endif /* __BOARD_H */
diff --git a/board/plankton/usb_pd_config.h b/board/plankton/usb_pd_config.h
index d3eb0429b7..af0a0e07b3 100644
--- a/board/plankton/usb_pd_config.h
+++ b/board/plankton/usb_pd_config.h
@@ -8,6 +8,8 @@
#ifndef __USB_PD_CONFIG_H
#define __USB_PD_CONFIG_H
+#include "board.h"
+
/* USB-PD configuration */
#define PD_PORT_COUNT 1
#define PORT_TO_TASK_ID(port) TASK_ID_PD
@@ -124,38 +126,14 @@ static inline void pd_tx_init(void)
static inline void pd_set_host_mode(int port, int enable)
{
- ccprintf("Host mode: %d\n", enable);
- if (enable) {
- /* Source mode, disable charging */
- gpio_set_level(GPIO_USBC_CHARGE_EN, 0);
- /* High Z for no pull-down resistor on CC1 */
- gpio_set_flags_by_mask(GPIO_A, (1 << 9), GPIO_INPUT);
- /* Set pull-up resistor on CC1 */
- gpio_set_flags_by_mask(GPIO_A, (1 << 2), GPIO_OUT_HIGH);
- /* High Z for no pull-down resistor on CC2 */
- gpio_set_flags_by_mask(GPIO_B, (1 << 7), GPIO_INPUT);
- /* Set pull-up resistor on CC2 */
- gpio_set_flags_by_mask(GPIO_B, (1 << 6), GPIO_OUT_HIGH);
- } else {
- /* Device mode, disable VBUS */
- gpio_set_level(GPIO_VBUS_CHARGER_EN, 0);
- gpio_set_level(GPIO_USBC_VSEL_0, 0);
- gpio_set_level(GPIO_USBC_VSEL_1, 0);
- /* High Z for no pull-up resistor on CC1 */
- gpio_set_flags_by_mask(GPIO_A, (1 << 2), GPIO_INPUT);
- /* Set pull-down resistor on CC1 */
- gpio_set_flags_by_mask(GPIO_A, (1 << 9), GPIO_OUT_LOW);
- /* High Z for no pull-up resistor on CC2 */
- gpio_set_flags_by_mask(GPIO_B, (1 << 6), GPIO_INPUT);
- /* Set pull-down resistor on CC2 */
- gpio_set_flags_by_mask(GPIO_B, (1 << 7), GPIO_OUT_LOW);
- /* Set charge enable */
- gpio_set_level(GPIO_USBC_CHARGE_EN, 1);
- }
+ board_pd_set_host_mode(enable);
}
static inline int pd_adc_read(int port, int cc)
{
+ if (board_pd_fake_disconnected())
+ return board_fake_pd_adc_read();
+
if (cc == 0)
return adc_read_channel(ADC_CH_CC1_PD);
else