diff options
Diffstat (limited to 'board/metaknight/board.c')
-rw-r--r-- | board/metaknight/board.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/board/metaknight/board.c b/board/metaknight/board.c index 2910c366ed..1d199ed6fc 100644 --- a/board/metaknight/board.c +++ b/board/metaknight/board.c @@ -45,6 +45,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] = { GPIO_EN_USB_A0_VBUS, @@ -592,6 +597,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) |