From 4d7e27892ec3a079dd3bb6f15a1074e3e9a95e0c Mon Sep 17 00:00:00 2001 From: Ben Chen Date: Thu, 24 Sep 2020 19:44:20 +0800 Subject: magolor: press volume up/down by ADC Hook function Add Vol +- volume up/down by ADC HOOK function BUG=b:167319238 BRANCH=master TEST=Press Vol+- button function work. Change-Id: I43b597db399aaa588d10a0dfd586208e5714c532 Signed-off-by: Ben Chen Signed-off-by: Aseda Aboagye Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2402498 Tested-by: Aseda Aboagye Reviewed-by: Diana Z Commit-Queue: Aseda Aboagye --- board/magolor/board.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++ board/magolor/board.h | 7 ++++++- board/magolor/gpio.inc | 4 ++-- 3 files changed, 60 insertions(+), 3 deletions(-) diff --git a/board/magolor/board.c b/board/magolor/board.c index c2e510af1b..d173c25716 100644 --- a/board/magolor/board.c +++ b/board/magolor/board.c @@ -47,6 +47,11 @@ #define CPRINTS(format, args...) cprints(CC_USBCHARGE, format, ## args) #define CPRINTF(format, args...) cprintf(CC_USBCHARGE, format, ## args) +#define ADC_VOL_UP_MASK BIT(0) +#define ADC_VOL_DOWN_MASK BIT(1) + +static uint8_t new_adc_key_state; + /******************************************************************************/ /* USB-A Configuration */ const int usb_port_enable[USB_PORT_COUNT] = { @@ -559,6 +564,53 @@ uint16_t tcpc_get_alert_status(void) return status; } +int adc_to_physical_value(enum gpio_signal gpio) +{ + if (gpio == GPIO_VOLUME_UP_L) + return !!(new_adc_key_state & ADC_VOL_UP_MASK); + else if (gpio == GPIO_VOLUME_DOWN_L) + return !!(new_adc_key_state & ADC_VOL_DOWN_MASK); + + CPRINTS("Not a volume up or down key"); + return 0; +} + +int button_is_adc_detected(enum gpio_signal gpio) +{ + return (gpio == GPIO_VOLUME_DOWN_L) || (gpio == GPIO_VOLUME_UP_L); +} + +static void adc_vol_key_press_check(void) +{ + int volt = adc_read_channel(ADC_SUB_ANALOG); + static uint8_t old_adc_key_state; + uint8_t adc_key_state_change; + + if (volt > 2400 && volt < 2490) { + /* volume-up is pressed */ + new_adc_key_state = ADC_VOL_UP_MASK; + } else if (volt > 2600 && volt < 2690) { + /* volume-down is pressed */ + new_adc_key_state = ADC_VOL_DOWN_MASK; + } else if (volt < 2290) { + /* both volumn-up and volume-down are pressed */ + new_adc_key_state = ADC_VOL_UP_MASK | ADC_VOL_DOWN_MASK; + } else if (volt > 2700) { + /* both volumn-up and volume-down are released */ + new_adc_key_state = 0; + } + if (new_adc_key_state != old_adc_key_state) { + adc_key_state_change = old_adc_key_state ^ new_adc_key_state; + if (adc_key_state_change && ADC_VOL_UP_MASK) + button_interrupt(GPIO_VOLUME_UP_L); + if (adc_key_state_change && ADC_VOL_DOWN_MASK) + button_interrupt(GPIO_VOLUME_DOWN_L); + + old_adc_key_state = new_adc_key_state; + } +} +DECLARE_HOOK(HOOK_TICK, adc_vol_key_press_check, HOOK_PRIO_DEFAULT); + #ifndef TEST_BUILD /* This callback disables keyboard when convertibles are fully open */ void lid_angle_peripheral_enable(int enable) diff --git a/board/magolor/board.h b/board/magolor/board.h index fb51ea08a3..2fb9f30908 100644 --- a/board/magolor/board.h +++ b/board/magolor/board.h @@ -124,6 +124,12 @@ #define CONFIG_MKBP_EVENT #define CONFIG_MKBP_USE_GPIO +/* Volume Button feature */ +#define CONFIG_ADC_BUTTONS +#define CONFIG_VOLUME_BUTTONS +#define GPIO_VOLUME_UP_L GPIO_VOLUP_BTN_ODL +#define GPIO_VOLUME_DOWN_L GPIO_VOLDN_BTN_ODL + #ifndef __ASSEMBLER__ #include "gpio_signal.h" @@ -168,6 +174,5 @@ enum battery_type { }; int board_is_sourcing_vbus(int port); - #endif /* !__ASSEMBLER__ */ #endif /* __CROS_EC_BOARD_H */ diff --git a/board/magolor/gpio.inc b/board/magolor/gpio.inc index 42593db13b..68861fa7f7 100644 --- a/board/magolor/gpio.inc +++ b/board/magolor/gpio.inc @@ -30,8 +30,6 @@ GPIO_INT(SUB_USB_C1_INT_ODL, PIN(F, 5), GPIO_INT_FALLING | GPIO_PULL_UP, sub_us /* Button interrupts */ GPIO_INT(H1_EC_PWR_BTN_ODL, PIN(0, 1), GPIO_INT_BOTH | GPIO_PULL_UP, power_button_interrupt) -GPIO_INT(VOLDN_BTN_ODL, PIN(4, 0), GPIO_INT_BOTH | GPIO_PULL_UP, button_interrupt) -GPIO_INT(VOLUP_BTN_ODL, PIN(7, 3), GPIO_INT_BOTH | GPIO_PULL_UP, button_interrupt) /* Other interrupts */ GPIO_INT(LID_OPEN, PIN(D, 2), GPIO_INT_BOTH, lid_interrupt) @@ -107,6 +105,8 @@ GPIO(EN_USB_A1_VBUS, PIN(F, 2), GPIO_OUT_LOW) /* Enable A1 5V Charging */ UNIMPLEMENTED(AC_PRESENT) UNIMPLEMENTED(PG_EC_DSW_PWROK) UNIMPLEMENTED(PG_EC_ALL_SYS_PWRGD) +UNIMPLEMENTED(VOLDN_BTN_ODL) +UNIMPLEMENTED(VOLUP_BTN_ODL) /* Alternate Functions */ /* ADC */ -- cgit v1.2.1