diff options
author | Ting Shen <phoenixshen@google.com> | 2019-04-29 16:54:29 +0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2019-05-02 16:12:26 -0700 |
commit | 00f889bfcf324197f9469febc696bae5983c4775 (patch) | |
tree | c2bcc0fff838a74cf2c9cd6d2a05be644057d1d1 /board | |
parent | c2129b3bd9b84f294a68774927038c00eda16c0a (diff) | |
download | chrome-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>
Diffstat (limited to 'board')
-rw-r--r-- | board/kukui/base_detect_krane.c | 86 | ||||
-rw-r--r-- | board/kukui/board.c | 10 | ||||
-rw-r--r-- | board/kukui/board.h | 1 | ||||
-rw-r--r-- | board/kukui/build.mk | 1 | ||||
-rw-r--r-- | board/kukui/gpio.inc | 6 |
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) |