diff options
-rw-r--r-- | board/coachz/board.c | 54 | ||||
-rw-r--r-- | board/coachz/board.h | 3 |
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__ |