summaryrefslogtreecommitdiff
path: root/board/metaknight/board.c
diff options
context:
space:
mode:
Diffstat (limited to 'board/metaknight/board.c')
-rw-r--r--board/metaknight/board.c52
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)