diff --git a/boards/xtensa/esp32/esp32-lyrat/Kconfig b/boards/xtensa/esp32/esp32-lyrat/Kconfig index 9b6396e3ea..d62ffffc8b 100644 --- a/boards/xtensa/esp32/esp32-lyrat/Kconfig +++ b/boards/xtensa/esp32/esp32-lyrat/Kconfig @@ -5,4 +5,18 @@ if ARCH_BOARD_ESP32_LYRAT +config ESP32_TOUCH + bool "Touch Pads" + default n + ---help--- + Enable ESP32 touch pad support. + +config ESP32_TOUCH_FILTER + bool "Touch Pad IIR Filter" + select ESP32_RT_TIMER + default n + depends on ESP32_TOUCH + ---help--- + Enable infinite impulse response filter for the touch pads. + endif # ARCH_BOARD_ESP32_LYRAT diff --git a/boards/xtensa/esp32/esp32-lyrat/configs/buttons/defconfig b/boards/xtensa/esp32/esp32-lyrat/configs/buttons/defconfig index 400e422b3c..1ac0e1e917 100644 --- a/boards/xtensa/esp32/esp32-lyrat/configs/buttons/defconfig +++ b/boards/xtensa/esp32/esp32-lyrat/configs/buttons/defconfig @@ -23,6 +23,8 @@ CONFIG_ARCH_XTENSA=y CONFIG_BOARD_LOOPSPERMSEC=16717 CONFIG_BUILTIN=y CONFIG_ESP32_GPIO_IRQ=y +CONFIG_ESP32_TOUCH=y +CONFIG_ESP32_TOUCH_FILTER=y CONFIG_ESP32_UART0=y CONFIG_EXAMPLES_BUTTONS=y CONFIG_FS_PROCFS=y diff --git a/boards/xtensa/esp32/esp32-lyrat/include/board.h b/boards/xtensa/esp32/esp32-lyrat/include/board.h index 1b6adadfb7..08609dc963 100644 --- a/boards/xtensa/esp32/esp32-lyrat/include/board.h +++ b/boards/xtensa/esp32/esp32-lyrat/include/board.h @@ -43,14 +43,24 @@ /* Button definitions *******************************************************/ -/* Board supports six buttons (2 push buttons and 4 touch buttons). */ +#define BUTTON_BTN1 0 /* BUTTON_REC */ +#define BUTTON_BTN1_BIT (1 << BUTTON_BTN1) +#define BUTTON_BTN2 1 /* BUTTON_MODE */ +#define BUTTON_BTN2_BIT (1 << BUTTON_BTN2) -#define BUTTON_BTN1 0 -#define BUTTON_BTN2 1 -#define NUM_BUTTONS 2 - -#define BUTTON_BTN1_BIT (1 << BUTTON_BTN1) -#define BUTTON_BTN2_BIT (1 << BUTTON_BTN2) +#ifdef CONFIG_ESP32_TOUCH +# define BUTTON_BTN3 2 /* TOUCHPAD_PLAY */ +# define BUTTON_BTN3_BIT (1 << BUTTON_BTN3) +# define BUTTON_BTN4 3 /* TOUCHPAD_SET */ +# define BUTTON_BTN4_BIT (1 << BUTTON_BTN4) +# define BUTTON_BTN5 4 /* TOUCHPAD_VOLM */ +# define BUTTON_BTN5_BIT (1 << BUTTON_BTN5) +# define BUTTON_BTN6 5 /* TOUCHPAD_VOLP */ +# define BUTTON_BTN6_BIT (1 << BUTTON_BTN6) +# define NUM_BUTTONS 6 +#else +# define NUM_BUTTONS 2 +#endif /* GPIO definitions *********************************************************/ diff --git a/boards/xtensa/esp32/esp32-lyrat/src/esp32-lyrat.h b/boards/xtensa/esp32/esp32-lyrat/src/esp32-lyrat.h index a55896d1c0..0f3687ef91 100644 --- a/boards/xtensa/esp32/esp32-lyrat/src/esp32-lyrat.h +++ b/boards/xtensa/esp32/esp32-lyrat/src/esp32-lyrat.h @@ -51,8 +51,12 @@ * driver to avoid conflict with the remaining peripherals. */ -#define BUTTON_REC 36 -#define BUTTON_MODE 39 +#define BUTTON_REC 36 +#define BUTTON_MODE 39 +#define BUTTON_PLAY_TP_CHANNEL 8 +#define BUTTON_SET_TP_CHANNEL 9 +#define BUTTON_VOLM_TP_CHANNEL 4 +#define BUTTON_VOLP_TP_CHANNEL 7 /* TIMERS */ diff --git a/boards/xtensa/esp32/esp32-lyrat/src/esp32_buttons.c b/boards/xtensa/esp32/esp32-lyrat/src/esp32_buttons.c index b18fa98405..6bd1a1b3a9 100644 --- a/boards/xtensa/esp32/esp32-lyrat/src/esp32_buttons.c +++ b/boards/xtensa/esp32/esp32-lyrat/src/esp32_buttons.c @@ -37,6 +37,7 @@ #include #include "esp32_gpio.h" +#include "esp32_touch.h" #include "esp32-lyrat.h" @@ -48,14 +49,77 @@ # define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) #endif +#define TOUCHPAD_REFH (TOUCH_HVOLT_2V7) +#define TOUCHPAD_REFL (TOUCH_LVOLT_0V5) +#define TOUCHPAD_ATTEN (TOUCH_HVOLT_ATTEN_1V) +#define TOUCHPAD_SLOPE (TOUCH_SLOPE_7) +#define TOUCHPAD_TIE_OPT (TOUCH_TIE_OPT_LOW) +#define TOUCHPAD_FSM_MODE (TOUCH_FSM_MODE_SW) +#define TOUCHPAD_INTR_THR (450) +#define TOUCHPAD_LOGIC_THR (450) +#define TOUCHPAD_FILTER_PERIOD (10) + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +typedef struct +{ + bool is_touchpad; + union + { + int channel; + int gpio; + }; +} button_type_t; + /**************************************************************************** * Private Data ****************************************************************************/ -static const int g_buttons[] = +#ifdef CONFIG_ESP32_TOUCH +static const struct touch_config_s tp_config = { - BUTTON_REC, - BUTTON_MODE + .refh = TOUCHPAD_REFH, + .refl = TOUCHPAD_REFL, + .atten = TOUCHPAD_ATTEN, + .slope = TOUCHPAD_SLOPE, + .tie_opt = TOUCHPAD_TIE_OPT, + .fsm_mode = TOUCHPAD_FSM_MODE, + .interrupt_threshold = TOUCHPAD_INTR_THR, + .logic_threshold = TOUCHPAD_LOGIC_THR, + .filter_period = TOUCHPAD_FILTER_PERIOD +}; +#endif + +static const button_type_t g_buttons[] = +{ + { + .is_touchpad = false, + .gpio = BUTTON_REC + }, + { + .is_touchpad = false, + .gpio = BUTTON_MODE + }, +#ifdef CONFIG_ESP32_TOUCH + { + .is_touchpad = true, + .channel = BUTTON_PLAY_TP_CHANNEL + }, + { + .is_touchpad = true, + .channel = BUTTON_SET_TP_CHANNEL + }, + { + .is_touchpad = true, + .channel = BUTTON_VOLM_TP_CHANNEL + }, + { + .is_touchpad = true, + .channel = BUTTON_VOLP_TP_CHANNEL + }, +#endif }; /**************************************************************************** @@ -77,6 +141,12 @@ uint32_t board_button_initialize(void) { /* GPIOs 36 and 39 do not support PULLUP/PULLDOWN */ +#ifdef CONFIG_ESP32_TOUCH + esp32_configtouch(BUTTON_PLAY_TP_CHANNEL, tp_config); + esp32_configtouch(BUTTON_SET_TP_CHANNEL, tp_config); + esp32_configtouch(BUTTON_VOLM_TP_CHANNEL, tp_config); + esp32_configtouch(BUTTON_VOLP_TP_CHANNEL, tp_config); +#endif esp32_configgpio(BUTTON_MODE, INPUT_FUNCTION_3); esp32_configgpio(BUTTON_REC, INPUT_FUNCTION_3); return NUM_BUTTONS; @@ -96,20 +166,39 @@ uint32_t board_button_initialize(void) uint32_t board_buttons(void) { uint8_t ret = 0; - int n = 0; + bool b0; + bool b1; + int n; for (uint8_t btn_id = 0; btn_id < ARRAY_SIZE(g_buttons); btn_id++) { iinfo("Reading button %d\n", btn_id); - const int button_gpio = g_buttons[btn_id]; - bool b0 = esp32_gpioread(button_gpio); + const button_type_t button_info = g_buttons[btn_id]; + + if (button_info.is_touchpad) + { + b0 = esp32_touchread(button_info.channel); + } + else + { + b0 = esp32_gpioread(button_info.gpio); + } + + n = 0; for (int i = 0; i < 10; i++) { - up_mdelay(1); /* TODO */ + up_mdelay(1); - bool b1 = esp32_gpioread(button_gpio); + if (button_info.is_touchpad) + { + b1 = esp32_touchread(button_info.channel); + } + else + { + b1 = esp32_gpioread(button_info.gpio); + } if (b0 == b1) { @@ -159,7 +248,15 @@ int board_button_irq(int id, xcpt_t irqhandler, void *arg) DEBUGASSERT(id < ARRAY_SIZE(g_buttons)); int ret; - int pin = g_buttons[id]; + button_type_t button_info = g_buttons[id]; + + if (button_info.is_touchpad) + { + iwarn("Touch pad interrupts not yet implemented\n"); + return OK; + } + + int pin = button_info.gpio; int irq = ESP32_PIN2IRQ(pin); if (NULL != irqhandler)