summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWai-Hong Tam <waihong@google.com>2020-11-16 11:42:27 -0800
committerCommit Bot <commit-bot@chromium.org>2020-11-18 23:52:14 +0000
commit1f1781f1af527edcab886fb54b540a7879291295 (patch)
treeb0d14d9e5150c7513f329dcddeb4a937cf731aa8
parent0e4740eaaac3e434120447e1913badfeca6cfa1a (diff)
downloadchrome-ec-1f1781f1af527edcab886fb54b540a7879291295.tar.gz
Coachz: Detect kickstand position and notify body proximity
Implement the kickstand hall sensor interrupts and the signal debouncing. Use the kickstand position to approach the human body proximity and update the EC_MKBP_FRONT_PROXIMITY event to kernel. BRANCH=Trogdor BUG=b:168714440 TEST=Built the image correctly. Faked the signals and checked the interrupts triggered and the proximity event updated. Change-Id: I493b87ba5d6d8a801cc9aa6e181f72bf26bcafd6 Signed-off-by: Wai-Hong Tam <waihong@google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2543112 Reviewed-by: Stephen Boyd <swboyd@chromium.org>
-rw-r--r--board/coachz/board.c54
-rw-r--r--board/coachz/board.h3
2 files changed, 56 insertions, 1 deletions
diff --git a/board/coachz/board.c b/board/coachz/board.c
index b7911214d5..1191b4566a 100644
--- a/board/coachz/board.c
+++ b/board/coachz/board.c
@@ -17,6 +17,7 @@
#include "driver/tcpm/tcpci.h"
#include "gpio.h"
#include "hooks.h"
+#include "keyboard_mkbp.h"
#include "keyboard_scan.h"
#include "lid_switch.h"
#include "pi3usb9201.h"
@@ -34,6 +35,8 @@
#define CPRINTS(format, args...) cprints(CC_USBCHARGE, format, ## args)
#define CPRINTF(format, args...) cprintf(CC_USBCHARGE, format, ## args)
+#define KS_DEBOUNCE_US (30 * MSEC) /* Debounce time for kickstand switch */
+
/* Forward declaration */
static void tcpc_alert_event(enum gpio_signal signal);
static void usb0_evt(enum gpio_signal signal);
@@ -102,9 +105,58 @@ static void board_connect_c0_sbu(enum gpio_signal s)
hook_call_deferred(&board_connect_c0_sbu_deferred_data, 0);
}
+static int debounced_ks_attached;
+static int debounced_ks_open;
+
+/**
+ * Kickstand switch initialization
+ */
+static void ks_init(void)
+{
+ debounced_ks_attached = !gpio_get_level(GPIO_KS_ATTACHED_L);
+ debounced_ks_open = gpio_get_level(GPIO_KS_OPEN);
+
+ /* Enable interrupts, now that we've initialized */
+ gpio_enable_interrupt(GPIO_KS_ATTACHED_L);
+ gpio_enable_interrupt(GPIO_KS_OPEN);
+}
+DECLARE_HOOK(HOOK_INIT, ks_init, HOOK_PRIO_INIT_SWITCH);
+
+/**
+ * Handle debounced kickstand switch changing state.
+ */
+static void ks_change_deferred(void)
+{
+ const int ks_attached = !gpio_get_level(GPIO_KS_ATTACHED_L);
+ const int ks_open = gpio_get_level(GPIO_KS_OPEN);
+ int proximity_detected;
+
+ /* If the switches haven't changed, nothing to do */
+ if (ks_attached == debounced_ks_attached &&
+ ks_open == debounced_ks_open)
+ return;
+
+ /*
+ * A heuristic method to use the kickstand position to approach
+ * the human body proximity.
+ */
+ proximity_detected = !(ks_attached && ks_open);
+ CPRINTS("ks %s %s -> proximity %s",
+ ks_attached ? "attached" : "detached",
+ ks_open ? "open" : "close",
+ proximity_detected ? "on" : "off");
+
+ debounced_ks_attached = ks_attached;
+ debounced_ks_open = ks_open;
+
+ mkbp_update_switches(EC_MKBP_FRONT_PROXIMITY, proximity_detected);
+}
+DECLARE_DEFERRED(ks_change_deferred);
+
static void ks_interrupt(enum gpio_signal s)
{
- /* TODO(b/168714440): Implement the interrupt */
+ /* Reset kickstand debounce time */
+ hook_call_deferred(&ks_change_deferred_data, KS_DEBOUNCE_US);
}
/* I2C port map */
diff --git a/board/coachz/board.h b/board/coachz/board.h
index 8d37c669f7..072ff42a04 100644
--- a/board/coachz/board.h
+++ b/board/coachz/board.h
@@ -44,12 +44,15 @@
#define CONFIG_TABLET_MODE
#define CONFIG_TABLET_MODE_SWITCH
#define CONFIG_GMR_TABLET_MODE
+#define CONFIG_FRONT_PROXIMITY_SWITCH
/* GPIO alias */
#define GPIO_AC_PRESENT GPIO_CHG_ACOK_OD
#define GPIO_WP_L GPIO_EC_FLASH_WP_ODL
#define GPIO_PMIC_RESIN_L GPIO_PM845_RESIN_L
#define GMR_TABLET_MODE_GPIO_L GPIO_LID_360_L
+#define GPIO_KS_ATTACHED_L GPIO_LID_INT_N_HALL1
+#define GPIO_KS_OPEN GPIO_LID_INT_N_HALL2
#ifndef __ASSEMBLER__