diff options
author | Vic Yang <victoryang@chromium.org> | 2014-11-13 15:16:56 -0800 |
---|---|---|
committer | chrome-internal-fetch <chrome-internal-fetch@google.com> | 2014-12-29 17:45:27 +0000 |
commit | ff91ba5bb1cdddfbf0892855f0d8de4c3190ce66 (patch) | |
tree | e47bcf6c65035600c579dc96074ea5fe8a7c8b6c /board/plankton | |
parent | 73bbc9eda8bbdfa190e3fdde16a852dd2755276c (diff) | |
download | chrome-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>
Diffstat (limited to 'board/plankton')
-rw-r--r-- | board/plankton/board.c | 121 | ||||
-rw-r--r-- | board/plankton/board.h | 12 | ||||
-rw-r--r-- | board/plankton/usb_pd_config.h | 34 |
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 |