summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTing Shen <phoenixshen@google.com>2019-04-29 16:54:29 +0800
committerchrome-bot <chrome-bot@chromium.org>2019-05-02 16:12:26 -0700
commit00f889bfcf324197f9469febc696bae5983c4775 (patch)
treec2bcc0fff838a74cf2c9cd6d2a05be644057d1d1
parentc2129b3bd9b84f294a68774927038c00eda16c0a (diff)
downloadchrome-ec-00f889bfcf324197f9469febc696bae5983c4775.tar.gz
kukui: implement pogo adc interrupt
enable/disable pogo power supply when POGO_ADC_INT_L detected. BUG=b:131389131 TEST=make BRANCH=None Change-Id: I875b8b65c3077d2e7aeca312f244d178917e634b Signed-off-by: Ting Shen <phoenixshen@google.com> Reviewed-on: https://chromium-review.googlesource.com/1585485 Commit-Ready: Ting Shen <phoenixshen@chromium.org> Tested-by: Ting Shen <phoenixshen@chromium.org> Reviewed-by: Yilun Lin <yllin@chromium.org> Reviewed-by: Ting Shen <phoenixshen@chromium.org>
-rw-r--r--board/kukui/base_detect_krane.c86
-rw-r--r--board/kukui/board.c10
-rw-r--r--board/kukui/board.h1
-rw-r--r--board/kukui/build.mk1
-rw-r--r--board/kukui/gpio.inc6
5 files changed, 100 insertions, 4 deletions
diff --git a/board/kukui/base_detect_krane.c b/board/kukui/base_detect_krane.c
new file mode 100644
index 0000000000..b39375860d
--- /dev/null
+++ b/board/kukui/base_detect_krane.c
@@ -0,0 +1,86 @@
+/* Copyright 2019 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "adc.h"
+#include "board.h"
+#include "gpio.h"
+#include "hooks.h"
+#include "timer.h"
+
+/* Krane base detection code */
+
+/* Base detection and debouncing */
+#define BASE_DETECT_DEBOUNCE_US (20 * MSEC)
+
+/*
+ * If the base status is unclear (i.e. not within expected ranges, read
+ * the ADC value again every 500ms.
+ */
+#define BASE_DETECT_RETRY_US (500 * MSEC)
+
+/**
+ * ADC value to indicate device is attached to a keyboard.
+ * 3.3V, 10K + 1K ohm => 0.3V, +10% margin.
+ */
+#define KEYBOARD_DETECT_MIN_MV 270
+#define KEYBOARD_DETECT_MAX_MV 330
+
+/**
+ * Minimum ADC value to indicate device is attached to a dock, or disconnected.
+ * 3.3V, 10K + 100K ohm => 3V, +10% margin.
+ */
+#define DOCK_DETECT_MIN_MV 2700
+
+static uint64_t base_detect_debounce_time;
+
+static void base_detect_deferred(void);
+DECLARE_DEFERRED(base_detect_deferred);
+
+static void base_detect_deferred(void)
+{
+ uint64_t time_now = get_time().val;
+ int v;
+
+ if (base_detect_debounce_time > time_now) {
+ hook_call_deferred(&base_detect_deferred_data,
+ base_detect_debounce_time - time_now);
+ return;
+ }
+
+ v = adc_read_channel(ADC_POGO_ADC_INT_L);
+ if (v == ADC_READ_ERROR)
+ return;
+
+ if (v >= KEYBOARD_DETECT_MIN_MV && v <= KEYBOARD_DETECT_MAX_MV) {
+ gpio_set_level(GPIO_EN_PP3300_POGO, 1);
+ return;
+ }
+
+ if (v >= DOCK_DETECT_MIN_MV) {
+ gpio_set_level(GPIO_EN_PP3300_POGO, 0);
+ return;
+ }
+
+ /* Unclear base status, schedule again in a while. */
+ hook_call_deferred(&base_detect_deferred_data, BASE_DETECT_RETRY_US);
+}
+
+void pogo_adc_interrupt(enum gpio_signal signal)
+{
+ uint64_t time_now = get_time().val;
+
+ if (base_detect_debounce_time <= time_now) {
+ hook_call_deferred(&base_detect_deferred_data,
+ BASE_DETECT_DEBOUNCE_US);
+ }
+
+ base_detect_debounce_time = time_now + BASE_DETECT_DEBOUNCE_US;
+}
+
+static void base_init(void)
+{
+ hook_call_deferred(&base_detect_deferred_data, 0);
+}
+DECLARE_HOOK(HOOK_INIT, base_init, HOOK_PRIO_DEFAULT + 1);
diff --git a/board/kukui/board.c b/board/kukui/board.c
index 46e387ae62..166ea32fe1 100644
--- a/board/kukui/board.c
+++ b/board/kukui/board.c
@@ -204,6 +204,13 @@ int pd_snk_is_vbus_provided(int port)
return rt946x_is_vbus_ready();
}
+#ifdef BOARD_KUKUI
+/* dummy interrupt function for kukui */
+void pogo_adc_interrupt(enum gpio_signal signal)
+{
+}
+#endif
+
static void board_init(void)
{
/* If the reset cause is external, pulse PMIC force reset. */
@@ -235,6 +242,9 @@ static void board_init(void)
/* Enable gauge interrupt from max17055 */
gpio_enable_interrupt(GPIO_GAUGE_INT_ODL);
+
+ /* Enable pogo interrupt */
+ gpio_enable_interrupt(GPIO_POGO_ADC_INT_L);
}
DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT);
diff --git a/board/kukui/board.h b/board/kukui/board.h
index 3eff3b3d9e..01b91d5c29 100644
--- a/board/kukui/board.h
+++ b/board/kukui/board.h
@@ -242,6 +242,7 @@ void emmc_cmd_interrupt(enum gpio_signal signal);
void board_reset_pd_mcu(void);
int board_get_version(void);
int board_is_sourcing_vbus(int port);
+void pogo_adc_interrupt(enum gpio_signal signal);
#endif /* !__ASSEMBLER__ */
diff --git a/board/kukui/build.mk b/board/kukui/build.mk
index 02ef585861..5c408de94a 100644
--- a/board/kukui/build.mk
+++ b/board/kukui/build.mk
@@ -13,5 +13,6 @@ CHIP_VARIANT:=stm32f09x
board-y=battery.o board.o usb_pd_policy.o led.o
board-$(CONFIG_BOOTBLOCK)+=emmc.o
+board-$(BOARD_KRANE)+=base_detect_krane.o
$(out)/RO/board/$(BOARD)/emmc.o: $(out)/bootblock_data.h
diff --git a/board/kukui/gpio.inc b/board/kukui/gpio.inc
index 2581810d68..1b5333fbeb 100644
--- a/board/kukui/gpio.inc
+++ b/board/kukui/gpio.inc
@@ -43,10 +43,8 @@ GPIO_INT(HALL_INT_L, PIN(C, 5), GPIO_INT_FALLING,
hall_interrupt)
GPIO_INT(GAUGE_INT_ODL, PIN(C, 9), GPIO_INT_FALLING | GPIO_PULL_UP,
gauge_interrupt)
-
-/* Interrupts not implemented yet */
-/* TODO(b:122993147): It's also an analog input. */
-GPIO(POGO_ADC_INT_L, PIN(A, 6), GPIO_INPUT)
+GPIO_INT(POGO_ADC_INT_L, PIN(A, 6), GPIO_INT_BOTH | GPIO_ANALOG,
+ pogo_adc_interrupt)
/* Reset pins */
GPIO(AP_SYS_RST_L, PIN(C, 11), GPIO_OUT_LOW)