2020-02-18 12:29:20 +00:00
// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD
2019-11-27 12:08:44 +00:00
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
# pragma once
# include "soc/touch_sensor_caps.h"
# include "sdkconfig.h"
2020-02-18 12:29:20 +00:00
# include "esp_attr.h"
2019-11-27 12:08:44 +00:00
2020-01-28 22:31:14 +00:00
/** Touch pad channel */
2019-11-27 12:08:44 +00:00
typedef enum {
TOUCH_PAD_NUM0 = 0 , /*!< Touch pad channel 0 is GPIO4(ESP32) */
TOUCH_PAD_NUM1 , /*!< Touch pad channel 1 is GPIO0(ESP32) / GPIO1(ESP32-S2) */
TOUCH_PAD_NUM2 , /*!< Touch pad channel 2 is GPIO2(ESP32) / GPIO2(ESP32-S2) */
TOUCH_PAD_NUM3 , /*!< Touch pad channel 3 is GPIO15(ESP32) / GPIO3(ESP32-S2) */
TOUCH_PAD_NUM4 , /*!< Touch pad channel 4 is GPIO13(ESP32) / GPIO4(ESP32-S2) */
TOUCH_PAD_NUM5 , /*!< Touch pad channel 5 is GPIO12(ESP32) / GPIO5(ESP32-S2) */
TOUCH_PAD_NUM6 , /*!< Touch pad channel 6 is GPIO14(ESP32) / GPIO6(ESP32-S2) */
TOUCH_PAD_NUM7 , /*!< Touch pad channel 7 is GPIO27(ESP32) / GPIO7(ESP32-S2) */
TOUCH_PAD_NUM8 , /*!< Touch pad channel 8 is GPIO33(ESP32) / GPIO8(ESP32-S2) */
TOUCH_PAD_NUM9 , /*!< Touch pad channel 9 is GPIO32(ESP32) / GPIO9(ESP32-S2) */
# if SOC_TOUCH_SENSOR_NUM > 10
TOUCH_PAD_NUM10 , /*!< Touch channel 10 is GPIO10(ESP32-S2) */
TOUCH_PAD_NUM11 , /*!< Touch channel 11 is GPIO11(ESP32-S2) */
TOUCH_PAD_NUM12 , /*!< Touch channel 12 is GPIO12(ESP32-S2) */
TOUCH_PAD_NUM13 , /*!< Touch channel 13 is GPIO13(ESP32-S2) */
TOUCH_PAD_NUM14 , /*!< Touch channel 14 is GPIO14(ESP32-S2) */
# endif
TOUCH_PAD_MAX ,
} touch_pad_t ;
2020-01-28 22:31:14 +00:00
/** Touch sensor high reference voltage */
2019-11-27 12:08:44 +00:00
typedef enum {
TOUCH_HVOLT_KEEP = - 1 , /*!<Touch sensor high reference voltage, no change */
TOUCH_HVOLT_2V4 = 0 , /*!<Touch sensor high reference voltage, 2.4V */
TOUCH_HVOLT_2V5 , /*!<Touch sensor high reference voltage, 2.5V */
TOUCH_HVOLT_2V6 , /*!<Touch sensor high reference voltage, 2.6V */
TOUCH_HVOLT_2V7 , /*!<Touch sensor high reference voltage, 2.7V */
TOUCH_HVOLT_MAX ,
} touch_high_volt_t ;
2020-01-28 22:31:14 +00:00
/** Touch sensor low reference voltage */
2019-11-27 12:08:44 +00:00
typedef enum {
TOUCH_LVOLT_KEEP = - 1 , /*!<Touch sensor low reference voltage, no change */
TOUCH_LVOLT_0V5 = 0 , /*!<Touch sensor low reference voltage, 0.5V */
TOUCH_LVOLT_0V6 , /*!<Touch sensor low reference voltage, 0.6V */
TOUCH_LVOLT_0V7 , /*!<Touch sensor low reference voltage, 0.7V */
TOUCH_LVOLT_0V8 , /*!<Touch sensor low reference voltage, 0.8V */
TOUCH_LVOLT_MAX ,
} touch_low_volt_t ;
2020-01-28 22:31:14 +00:00
/** Touch sensor high reference voltage attenuation */
2019-11-27 12:08:44 +00:00
typedef enum {
TOUCH_HVOLT_ATTEN_KEEP = - 1 , /*!<Touch sensor high reference voltage attenuation, no change */
TOUCH_HVOLT_ATTEN_1V5 = 0 , /*!<Touch sensor high reference voltage attenuation, 1.5V attenuation */
TOUCH_HVOLT_ATTEN_1V , /*!<Touch sensor high reference voltage attenuation, 1.0V attenuation */
TOUCH_HVOLT_ATTEN_0V5 , /*!<Touch sensor high reference voltage attenuation, 0.5V attenuation */
TOUCH_HVOLT_ATTEN_0V , /*!<Touch sensor high reference voltage attenuation, 0V attenuation */
TOUCH_HVOLT_ATTEN_MAX ,
} touch_volt_atten_t ;
2020-01-28 22:31:14 +00:00
/** Touch sensor charge/discharge speed */
2019-11-27 12:08:44 +00:00
typedef enum {
TOUCH_PAD_SLOPE_0 = 0 , /*!<Touch sensor charge / discharge speed, always zero */
TOUCH_PAD_SLOPE_1 = 1 , /*!<Touch sensor charge / discharge speed, slowest */
TOUCH_PAD_SLOPE_2 = 2 , /*!<Touch sensor charge / discharge speed */
TOUCH_PAD_SLOPE_3 = 3 , /*!<Touch sensor charge / discharge speed */
TOUCH_PAD_SLOPE_4 = 4 , /*!<Touch sensor charge / discharge speed */
TOUCH_PAD_SLOPE_5 = 5 , /*!<Touch sensor charge / discharge speed */
TOUCH_PAD_SLOPE_6 = 6 , /*!<Touch sensor charge / discharge speed */
TOUCH_PAD_SLOPE_7 = 7 , /*!<Touch sensor charge / discharge speed, fast */
TOUCH_PAD_SLOPE_MAX ,
} touch_cnt_slope_t ;
2020-01-28 22:31:14 +00:00
/** Touch sensor initial charge level */
2019-11-27 12:08:44 +00:00
typedef enum {
TOUCH_PAD_TIE_OPT_LOW = 0 , /*!<Initial level of charging voltage, low level */
TOUCH_PAD_TIE_OPT_HIGH = 1 , /*!<Initial level of charging voltage, high level */
TOUCH_PAD_TIE_OPT_MAX ,
} touch_tie_opt_t ;
2020-01-28 22:31:14 +00:00
/** Touch sensor FSM mode */
2019-11-27 12:08:44 +00:00
typedef enum {
TOUCH_FSM_MODE_TIMER = 0 , /*!<To start touch FSM by timer */
TOUCH_FSM_MODE_SW , /*!<To start touch FSM by software trigger */
TOUCH_FSM_MODE_MAX ,
} touch_fsm_mode_t ;
/**** ESP32 Only *****/
typedef enum {
TOUCH_TRIGGER_BELOW = 0 , /*!<Touch interrupt will happen if counter value is less than threshold.*/
TOUCH_TRIGGER_ABOVE = 1 , /*!<Touch interrupt will happen if counter value is larger than threshold.*/
TOUCH_TRIGGER_MAX ,
} touch_trigger_mode_t ;
typedef enum {
TOUCH_TRIGGER_SOURCE_BOTH = 0 , /*!< wakeup interrupt is generated if both SET1 and SET2 are "touched"*/
TOUCH_TRIGGER_SOURCE_SET1 = 1 , /*!< wakeup interrupt is generated if SET1 is "touched"*/
TOUCH_TRIGGER_SOURCE_MAX ,
} touch_trigger_src_t ;
/********************************/
# define TOUCH_PAD_SLOPE_DEFAULT (TOUCH_PAD_SLOPE_7)
# define TOUCH_PAD_TIE_OPT_DEFAULT (TOUCH_PAD_TIE_OPT_LOW)
# define TOUCH_PAD_BIT_MASK_MAX (SOC_TOUCH_SENSOR_BIT_MASK_MAX)
# define TOUCH_PAD_HIGH_VOLTAGE_THRESHOLD (TOUCH_HVOLT_2V7)
# define TOUCH_PAD_LOW_VOLTAGE_THRESHOLD (TOUCH_LVOLT_0V5)
# define TOUCH_PAD_ATTEN_VOLTAGE_THRESHOLD (TOUCH_HVOLT_ATTEN_0V5)
2020-02-18 12:29:20 +00:00
# define TOUCH_PAD_IDLE_CH_CONNECT_DEFAULT (TOUCH_PAD_CONN_GND)
2019-11-27 12:08:44 +00:00
# define TOUCH_PAD_THRESHOLD_MAX (SOC_TOUCH_PAD_THRESHOLD_MAX) /*!<If set touch threshold max value, The touch sensor can't be in touched status */
# ifdef CONFIG_IDF_TARGET_ESP32
# define TOUCH_PAD_SLEEP_CYCLE_DEFAULT (0x1000) /*!<The timer frequency is RTC_SLOW_CLK (can be 150k or 32k depending on the options), max value is 0xffff */
# define TOUCH_PAD_MEASURE_CYCLE_DEFAULT (0x7fff) /*!<The timer frequency is 8Mhz, the max value is 0x7fff */
# define TOUCH_FSM_MODE_DEFAULT (TOUCH_FSM_MODE_SW) /*!<The touch FSM my be started by the software or timer */
# define TOUCH_TRIGGER_MODE_DEFAULT (TOUCH_TRIGGER_BELOW) /*!<Interrupts can be triggered if sensor value gets below or above threshold */
# define TOUCH_TRIGGER_SOURCE_DEFAULT (TOUCH_TRIGGER_SOURCE_SET1) /*!<The wakeup trigger source can be SET1 or both SET1 and SET2 */
2020-01-17 03:47:08 +00:00
# elif CONFIG_IDF_TARGET_ESP32S2
2019-11-27 12:08:44 +00:00
/**
* Excessive total time will slow down the touch response .
* Too small measurement time will not be sampled enough , resulting in inaccurate measurements .
*
* @ note The greater the duty cycle of the measurement time , the more system power is consumed .
*/
# define TOUCH_PAD_SLEEP_CYCLE_DEFAULT (0xf) / *!<The number of sleep cycle in each measure process of touch channels.
The timer frequency is RTC_SLOW_CLK ( can be 150 k or 32 k depending on the options ) .
Range : 0 ~ 0xffff */
# define TOUCH_PAD_MEASURE_CYCLE_DEFAULT (500) / *!<The times of charge and discharge in each measure process of touch channels.
The timer frequency is 8 Mhz .
Recommended typical value : Modify this value to make the measurement time around 1 ms .
Range : 0 ~ 0xffff */
# endif // CONFIG_IDF_TARGET_ESP32
2020-01-17 03:47:08 +00:00
# ifdef CONFIG_IDF_TARGET_ESP32S2
2019-11-27 12:08:44 +00:00
typedef enum {
2020-02-18 12:29:20 +00:00
TOUCH_PAD_INTR_MASK_DONE = BIT ( 0 ) , /*!<Measurement done for one of the enabled channels. */
TOUCH_PAD_INTR_MASK_ACTIVE = BIT ( 1 ) , /*!<Active for one of the enabled channels. */
TOUCH_PAD_INTR_MASK_INACTIVE = BIT ( 2 ) , /*!<Inactive for one of the enabled channels. */
TOUCH_PAD_INTR_MASK_SCAN_DONE = BIT ( 3 ) , /*!<Measurement done for all the enabled channels. */
TOUCH_PAD_INTR_MASK_TIMEOUT = BIT ( 4 ) , /*!<Timeout for one of the enabled channels. */
2019-11-27 12:08:44 +00:00
TOUCH_PAD_INTR_MASK_MAX
2020-02-18 12:29:20 +00:00
# define TOUCH_PAD_INTR_MASK_ALL (TOUCH_PAD_INTR_MASK_TIMEOUT \
| TOUCH_PAD_INTR_MASK_SCAN_DONE \
| TOUCH_PAD_INTR_MASK_INACTIVE \
| TOUCH_PAD_INTR_MASK_ACTIVE \
| TOUCH_PAD_INTR_MASK_DONE ) /*!<All touch interrupt type enable. */
2019-11-27 12:08:44 +00:00
} touch_pad_intr_mask_t ;
2020-02-18 12:29:20 +00:00
FLAG_ATTR ( touch_pad_intr_mask_t )
2019-11-27 12:08:44 +00:00
typedef enum {
TOUCH_PAD_DENOISE_BIT12 = 0 , /*!<Denoise range is 12bit */
TOUCH_PAD_DENOISE_BIT10 = 1 , /*!<Denoise range is 10bit */
TOUCH_PAD_DENOISE_BIT8 = 2 , /*!<Denoise range is 8bit */
TOUCH_PAD_DENOISE_BIT4 = 3 , /*!<Denoise range is 4bit */
TOUCH_PAD_DENOISE_MAX
} touch_pad_denoise_grade_t ;
typedef enum {
2020-02-18 12:29:20 +00:00
TOUCH_PAD_DENOISE_CAP_L0 = 0 , /*!<Denoise channel internal reference capacitance is 5pf */
TOUCH_PAD_DENOISE_CAP_L1 = 1 , /*!<Denoise channel internal reference capacitance is 6.4pf */
TOUCH_PAD_DENOISE_CAP_L2 = 2 , /*!<Denoise channel internal reference capacitance is 7.8pf */
TOUCH_PAD_DENOISE_CAP_L3 = 3 , /*!<Denoise channel internal reference capacitance is 9.2pf */
TOUCH_PAD_DENOISE_CAP_L4 = 4 , /*!<Denoise channel internal reference capacitance is 10.6pf */
TOUCH_PAD_DENOISE_CAP_L5 = 5 , /*!<Denoise channel internal reference capacitance is 12.0pf */
TOUCH_PAD_DENOISE_CAP_L6 = 6 , /*!<Denoise channel internal reference capacitance is 13.4pf */
TOUCH_PAD_DENOISE_CAP_L7 = 7 , /*!<Denoise channel internal reference capacitance is 14.8pf */
TOUCH_PAD_DENOISE_CAP_MAX = 8
2019-11-27 12:08:44 +00:00
} touch_pad_denoise_cap_t ;
2020-01-28 22:31:14 +00:00
/** Touch sensor denoise configuration */
2019-11-27 12:08:44 +00:00
typedef struct touch_pad_denoise {
touch_pad_denoise_grade_t grade ; /*!<Select denoise range of denoise channel.
Determined by measuring the noise amplitude of the denoise channel . */
touch_pad_denoise_cap_t cap_level ; /*!<Select internal reference capacitance of denoise channel.
2020-02-18 12:29:20 +00:00
Ensure that the denoise readings are closest to the readings of the channel being measured .
Use ` touch_pad_denoise_read_data ` to get the reading of denoise channel .
2019-11-27 12:08:44 +00:00
The equivalent capacitance of the shielded channel can be calculated
from the reading of denoise channel . */
} touch_pad_denoise_t ;
typedef enum {
TOUCH_PAD_SHIELD_DRV_L0 = 0 , /*!<The max equivalent capacitance in shield channel is 40pf */
TOUCH_PAD_SHIELD_DRV_L1 , /*!<The max equivalent capacitance in shield channel is 80pf */
TOUCH_PAD_SHIELD_DRV_L2 , /*!<The max equivalent capacitance in shield channel is 120pf */
TOUCH_PAD_SHIELD_DRV_L3 , /*!<The max equivalent capacitance in shield channel is 160pf */
TOUCH_PAD_SHIELD_DRV_L4 , /*!<The max equivalent capacitance in shield channel is 200pf */
TOUCH_PAD_SHIELD_DRV_L5 , /*!<The max equivalent capacitance in shield channel is 240pf */
TOUCH_PAD_SHIELD_DRV_L6 , /*!<The max equivalent capacitance in shield channel is 280pf */
TOUCH_PAD_SHIELD_DRV_L7 , /*!<The max equivalent capacitance in shield channel is 320pf */
TOUCH_PAD_SHIELD_DRV_MAX
} touch_pad_shield_driver_t ;
2020-01-28 22:31:14 +00:00
/** Touch sensor waterproof configuration */
2019-11-27 12:08:44 +00:00
typedef struct touch_pad_waterproof {
touch_pad_t guard_ring_pad ; /*!<Waterproof. Select touch channel use for guard pad */
2020-02-18 12:29:20 +00:00
touch_pad_shield_driver_t shield_driver ; /*!<Waterproof. Select max equivalent capacitance for shield pad
2019-11-27 12:08:44 +00:00
Config the Touch14 to the touch sensor and compare the measured
reading to the Touch0 reading to estimate the equivalent capacitance . */
} touch_pad_waterproof_t ;
2020-01-28 22:31:14 +00:00
/** Touch sensor proximity detection configuration */
2019-11-27 12:08:44 +00:00
# define TOUCH_PROXIMITY_MEAS_NUM_MAX (0xFF)
2020-01-28 22:31:14 +00:00
/** Touch channel idle state configuration */
2019-11-27 12:08:44 +00:00
typedef enum {
2020-01-28 22:31:14 +00:00
TOUCH_PAD_CONN_HIGHZ = 0 , /*!<Idle status of touch channel is high resistance state */
TOUCH_PAD_CONN_GND = 1 , /*!<Idle status of touch channel is ground connection */
2019-11-27 12:08:44 +00:00
TOUCH_PAD_CONN_MAX
} touch_pad_conn_type_t ;
2020-02-18 12:29:20 +00:00
/**
* @ brief Touch channel IIR filter coefficient configuration .
* @ note On ESP32S2 . There is an error in the IIR calculation . The magnitude of the error is twice the filter coefficient .
* So please select a smaller filter coefficient on the basis of meeting the filtering requirements .
* Recommended filter coefficient selection ` IIR_16 ` .
*/
2019-11-27 12:08:44 +00:00
typedef enum {
2020-02-18 12:29:20 +00:00
TOUCH_PAD_FILTER_IIR_4 = 0 , /*!<The filter mode is first-order IIR filter. The coefficient is 4. */
TOUCH_PAD_FILTER_IIR_8 , /*!<The filter mode is first-order IIR filter. The coefficient is 8. */
TOUCH_PAD_FILTER_IIR_16 , /*!<The filter mode is first-order IIR filter. The coefficient is 16 (Typical value). */
TOUCH_PAD_FILTER_IIR_32 , /*!<The filter mode is first-order IIR filter. The coefficient is 32. */
TOUCH_PAD_FILTER_IIR_64 , /*!<The filter mode is first-order IIR filter. The coefficient is 64. */
TOUCH_PAD_FILTER_IIR_128 , /*!<The filter mode is first-order IIR filter. The coefficient is 128. */
TOUCH_PAD_FILTER_IIR_256 , /*!<The filter mode is first-order IIR filter. The coefficient is 256. */
2019-11-27 12:08:44 +00:00
TOUCH_PAD_FILTER_JITTER , /*!<The filter mode is jitter filter */
TOUCH_PAD_FILTER_MAX
} touch_filter_mode_t ;
2020-02-18 12:29:20 +00:00
/**
* @ brief Level of filter applied on the original data against large noise interference .
* @ note On ESP32S2 . There is an error in the IIR calculation . The magnitude of the error is twice the filter coefficient .
* So please select a smaller filter coefficient on the basis of meeting the filtering requirements .
* Recommended filter coefficient selection ` IIR_2 ` .
*/
typedef enum {
TOUCH_PAD_SMOOTH_OFF = 0 , /*!<No filtering of raw data. */
TOUCH_PAD_SMOOTH_IIR_2 = 1 , /*!<Filter the raw data. The coefficient is 2 (Typical value). */
TOUCH_PAD_SMOOTH_IIR_4 = 2 , /*!<Filter the raw data. The coefficient is 4. */
TOUCH_PAD_SMOOTH_IIR_8 = 3 , /*!<Filter the raw data. The coefficient is 8. */
TOUCH_PAD_SMOOTH_MAX ,
} touch_smooth_mode_t ;
2020-01-28 22:31:14 +00:00
/** Touch sensor filter configuration */
2019-11-27 12:08:44 +00:00
typedef struct touch_filter_config {
touch_filter_mode_t mode ; /*!<Set filter mode. The input to the filter is raw data and the output is the baseline value.
Larger filter coefficients increase the stability of the baseline . */
2020-02-18 12:29:20 +00:00
uint32_t debounce_cnt ; /*!<Set debounce count, such as `n`. If the measured values continue to exceed
the threshold for ` n + 1 ` times , the touch sensor state changes .
2019-11-27 12:08:44 +00:00
Range : 0 ~ 7 */
2020-02-18 12:29:20 +00:00
uint32_t hysteresis_thr ; /*!<Hysteresis threshold coefficient. hysteresis = hysteresis coefficient * touch threshold.
2019-11-27 12:08:44 +00:00
If ( raw data - baseline ) > ( touch threshold + hysteresis ) , the touch channel be touched .
If ( raw data - baseline ) < ( touch threshold - hysteresis ) , the touch channel be released .
2020-02-18 12:29:20 +00:00
Range : 0 ~ 3. The coefficient is 0 : 4 / 32 ; 1 : 3 / 32 ; 2 : 2 / 32 ; 3 : OFF */
uint32_t noise_thr ; /*!<Noise threshold coefficient. noise = noise coefficient * touch threshold.
2019-11-27 12:08:44 +00:00
If ( raw data - baseline ) > ( noise ) , the baseline stop updating .
If ( raw data - baseline ) < ( noise ) , the baseline start updating .
2020-02-18 12:29:20 +00:00
Range : 0 ~ 3. The coefficient is 0 : 4 / 8 ; 1 : 3 / 8 ; 2 : 2 / 8 ; 3 : 1 ; */
uint32_t noise_neg_thr ; /*!<Negative noise threshold coefficient. negative noise = noise coefficient * touch threshold.
2019-11-27 12:08:44 +00:00
If ( baseline - raw data ) > ( negative noise ) , the baseline restart reset process ( refer to ` baseline_reset ` ) .
If ( baseline - raw data ) < ( negative noise ) , the baseline stop reset process ( refer to ` baseline_reset ` ) .
2020-02-18 12:29:20 +00:00
Range : 0 ~ 3. The coefficient is 0 : 4 / 8 ; 1 : 3 / 8 ; 2 : 2 / 8 ; 3 : 1 / 8 ; */
uint32_t neg_noise_limit ; /*!<Set the cumulative number of baseline reset processes. such as `n`. If the measured values continue to exceed
the negative noise threshold for ` n + 1 ` times , the baseline reset to raw data .
2019-11-27 12:08:44 +00:00
Range : 0 ~ 15 */
2020-02-18 12:29:20 +00:00
uint32_t jitter_step ; /*!<Set jitter filter step size. Range: 0 ~ 15 */
touch_smooth_mode_t smh_lvl ; /*!<Level of filter applied on the original data against large noise interference. */
2019-11-27 12:08:44 +00:00
# define TOUCH_DEBOUNCE_CNT_MAX (7)
# define TOUCH_HYSTERESIS_THR_MAX (3)
# define TOUCH_NOISE_THR_MAX (3)
# define TOUCH_NOISE_NEG_THR_MAX (3)
# define TOUCH_NEG_NOISE_CNT_LIMIT (15)
# define TOUCH_JITTER_STEP_MAX (15)
} touch_filter_config_t ;
2020-01-28 22:31:14 +00:00
/** Touch sensor channel sleep configuration */
2019-11-27 12:08:44 +00:00
typedef struct {
touch_pad_t touch_num ; /*!<Set touch channel number for sleep pad.
Only one touch sensor channel is supported in deep sleep mode . */
bool en_proximity ; /*!<enable proximity function for sleep pad */
} touch_pad_sleep_channel_t ;
2020-01-28 22:31:14 +00:00
# endif // CONFIG_IDF_TARGET_ESP32S2