summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWai-Hong Tam <waihong@google.com>2019-06-14 13:38:01 -0700
committerCommit Bot <commit-bot@chromium.org>2019-06-18 23:17:54 +0000
commit4907ad28a3f70ee964189834cdbcfe285b1a7369 (patch)
tree3a7d6621ac464ab566f7d3fdf850c27f202af6ad
parent604e42d766c7e903db7b9c9f752a18697744875a (diff)
downloadchrome-ec-4907ad28a3f70ee964189834cdbcfe285b1a7369.tar.gz
servo_v4: Enable VBUS detection interrupts to wake PD tasks fast enough
It fixes a hard reset issue. After a hard reset, the PD state goes to SNK_HARD_RESET_RECOVER state and waits for the VBUS "off" and then back "on" again. When the VBUS goes back to "on", it then transits to SNK_DISCOVERY state that replies the Source_Cap message. In order to make the VBUS detection fast enough, these interrupts are needed to wake the PD tasks up; otherwise, it missed the Source_Cap message BUG=b:134701032 BRANCH=servo TEST=Made servo v4 as sink and issued Hard_Reset on either DUT or servo. 2019-06-14 13:55:04 > cc snk 2019-06-14 13:55:06 cc: on 2019-06-14 13:55:06 dts mode: off 2019-06-14 13:55:06 chg mode: off 2019-06-14 13:55:06 chg allowed: off 2019-06-14 13:55:06 > C1 st3 SNK_DISCONNECTED_DEBOUNCE 2019-06-14 13:55:06 C1 st5 SNK_DISCOVERY 2019-06-14 13:55:06 C1 Req [1] 5000mV 3000mA 2019-06-14 13:55:06 C1 st6 SNK_REQUESTED 2019-06-14 13:55:06 C1 st7 SNK_TRANSITION 2019-06-14 13:55:06 C1 st8 SNK_READY 2019-06-14 13:55:07 2019-06-14 13:55:07 > pd 1 hard 2019-06-14 13:55:16 C1 st34 HARD_RESET_SEND 2019-06-14 13:55:16 > C1 st35 HARD_RESET_EXECUTE 2019-06-14 13:55:16 C1 HARD RST TX 2019-06-14 13:55:16 C1 st4 SNK_HARD_RESET_RECOVER 2019-06-14 13:55:16 Repeat msg_id[0] port[1] 2019-06-14 13:55:16 Repeat msg_id[0] port[1] 2019-06-14 13:55:16 Repeat msg_id[0] port[1] 2019-06-14 13:55:16 C1 st5 SNK_DISCOVERY 2019-06-14 13:55:16 Repeat msg_id[0] port[1] 2019-06-14 13:55:16 C1 HARD RST RX 2019-06-14 13:55:16 C1 st4 SNK_HARD_RESET_RECOVER 2019-06-14 13:55:17 C1 st5 SNK_DISCOVERY 2019-06-14 13:55:17 C1 Req [1] 5000mV 3000mA 2019-06-14 13:55:17 C1 st6 SNK_REQUESTED 2019-06-14 13:55:17 C1 st7 SNK_TRANSITION 2019-06-14 13:55:18 C1 st8 SNK_READY 2019-06-14 13:55:18 C1 Req [1] 5000mV 3000mA 2019-06-14 13:55:18 C1 st6 SNK_REQUESTED 2019-06-14 13:55:18 C1 st7 SNK_TRANSITION 2019-06-14 13:55:18 C1 st8 SNK_READY Issued "pd 0 hard" on DUT: 2019-06-14 13:56:07 > C1 HARD RST RX 2019-06-14 13:56:11 C1 st4 SNK_HARD_RESET_RECOVER 2019-06-14 13:56:12 C1 st5 SNK_DISCOVERY 2019-06-14 13:56:12 C1 Req [1] 5000mV 3000mA 2019-06-14 13:56:12 C1 st6 SNK_REQUESTED 2019-06-14 13:56:12 C1 st7 SNK_TRANSITION 2019-06-14 13:56:12 C1 st8 SNK_READY Change-Id: I0cc80515df8044ec07fa6795d3723aca2a3dc0ef Signed-off-by: Wai-Hong Tam <waihong@google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1660125 Reviewed-by: Aseda Aboagye <aaboagye@chromium.org> (cherry picked from commit 67c7d647103ea88fa0957a0e9538316901828c64) Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1666352
-rw-r--r--board/servo_v4/board.c18
-rw-r--r--board/servo_v4/gpio.inc6
2 files changed, 21 insertions, 3 deletions
diff --git a/board/servo_v4/board.c b/board/servo_v4/board.c
index 656808c767..dc1ae7cea9 100644
--- a/board/servo_v4/board.c
+++ b/board/servo_v4/board.c
@@ -29,6 +29,20 @@
#include "usb-stream.h"
#include "util.h"
+/******************************************************************************
+ * GPIO interrupt handlers.
+ */
+
+static void vbus0_evt(enum gpio_signal signal)
+{
+ task_wake(TASK_ID_PD_C0);
+}
+
+static void vbus1_evt(enum gpio_signal signal)
+{
+ task_wake(TASK_ID_PD_C1);
+}
+
#include "gpio_list.h"
#define CPRINTS(format, args...) cprints(CC_SYSTEM, format, ## args)
@@ -439,6 +453,10 @@ static void board_init(void)
*/
pd_set_max_voltage(PD_MIN_MV);
+ /* Enable VBUS detection to wake PD tasks fast enough */
+ gpio_enable_interrupt(GPIO_USB_DET_PP_CHG);
+ gpio_enable_interrupt(GPIO_USB_DET_PP_DUT);
+
hook_call_deferred(&ccd_measure_sbu_data, 1000 * MSEC);
}
diff --git a/board/servo_v4/gpio.inc b/board/servo_v4/gpio.inc
index b0d8f124f1..f087c633ca 100644
--- a/board/servo_v4/gpio.inc
+++ b/board/servo_v4/gpio.inc
@@ -5,6 +5,9 @@
* found in the LICENSE file.
*/
+GPIO_INT(USB_DET_PP_CHG, PIN(C, 13), GPIO_INT_BOTH, vbus0_evt)
+GPIO_INT(USB_DET_PP_DUT, PIN(C, 12), GPIO_INT_BOTH, vbus1_evt)
+
/* Outputs */
GPIO(DUT_CHG_EN, PIN(A, 10), GPIO_OUT_LOW)
GPIO(HOST_OR_CHG_CTL, PIN(A, 13), GPIO_OUT_HIGH)
@@ -36,9 +39,6 @@ GPIO(USB_CHG_CC2_PD, PIN(A, 4), GPIO_ANALOG)
GPIO(USB_DUT_CC1_PD, PIN(A, 0), GPIO_ANALOG)
GPIO(USB_DUT_CC2_PD, PIN(A, 5), GPIO_ANALOG)
-GPIO(USB_DET_PP_DUT, PIN(C, 12), GPIO_INPUT)
-GPIO(USB_DET_PP_CHG, PIN(C, 13), GPIO_INPUT)
-
GPIO(USB_CHG_CC1_TX_DATA, PIN(B, 4), GPIO_INPUT)
GPIO(USB_CHG_CC2_TX_DATA, PIN(A, 6), GPIO_INPUT)
GPIO(USB_DUT_CC1_TX_DATA, PIN(B, 14), GPIO_INPUT)