mirror of
https://github.com/espressif/esp-idf.git
synced 2025-11-26 20:53:11 +00:00
Refactor the touch sensor driver
This commit is contained in:
465
components/driver/esp32s2beta/include/touch_sensor.h
Normal file
465
components/driver/esp32s2beta/include/touch_sensor.h
Normal file
@@ -0,0 +1,465 @@
|
||||
// Copyright 2019 Espressif Systems (Shanghai) PTE LTD
|
||||
//
|
||||
// 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
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Set touch sensor FSM start
|
||||
* @note Start FSM after the touch sensor FSM mode is set.
|
||||
* @note Call this function will reset beseline of all touch channels.
|
||||
* @return
|
||||
* - ESP_OK on success
|
||||
*/
|
||||
esp_err_t touch_pad_fsm_start(void);
|
||||
|
||||
/**
|
||||
* @brief Stop touch sensor FSM.
|
||||
* @return
|
||||
* - ESP_OK on success
|
||||
*/
|
||||
esp_err_t touch_pad_fsm_stop(void);
|
||||
|
||||
/**
|
||||
* @brief Trigger a touch sensor measurement, only support in SW mode of FSM
|
||||
* @return
|
||||
* - ESP_OK on success
|
||||
*/
|
||||
esp_err_t touch_pad_sw_start(void);
|
||||
|
||||
/**
|
||||
* @brief Set touch sensor times of charge and discharge and sleep time.
|
||||
* 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.
|
||||
* @param sleep_cycle The touch sensor will sleep after each measurement.
|
||||
* sleep_cycle decide the interval between each measurement.
|
||||
* t_sleep = sleep_cycle / (RTC_SLOW_CLK frequency).
|
||||
* The approximate frequency value of RTC_SLOW_CLK can be obtained using rtc_clk_slow_freq_get_hz function.
|
||||
* @param meas_timers The times of charge and discharge in each measure process of touch channels.
|
||||
* The timer frequency is 8Mhz. Range: 0 ~ 0xffff.
|
||||
* Recommended typical value: Modify this value to make the measurement time around 1ms.
|
||||
* @return
|
||||
* - ESP_OK on success
|
||||
*/
|
||||
esp_err_t touch_pad_set_meas_time(uint16_t sleep_cycle, uint16_t meas_times);
|
||||
|
||||
/**
|
||||
* @brief Get touch sensor times of charge and discharge and sleep time
|
||||
* @param sleep_cycle Pointer to accept sleep cycle number
|
||||
* @param meas_times Pointer to accept measurement times count.
|
||||
* @return
|
||||
* - ESP_OK on success
|
||||
*/
|
||||
esp_err_t touch_pad_get_meas_time(uint16_t *sleep_cycle, uint16_t *meas_times);
|
||||
|
||||
/**
|
||||
* @brief Set connection type of touch channel in idle status.
|
||||
* When a channel is in measurement mode, other initialized channels are in idle mode.
|
||||
* The touch channel is generally adjacent to the trace, so the connection state of the idle channel
|
||||
* affects the stability and sensitivity of the test channel.
|
||||
* The `CONN_HIGHZ`(high resistance) setting increases the sensitivity of touch channels.
|
||||
* The `CONN_GND`(grounding) setting increases the stability of touch channels.
|
||||
* @param type Select idle channel connect to high resistance state or ground.
|
||||
* @return
|
||||
* - ESP_OK on success
|
||||
*/
|
||||
esp_err_t touch_pad_set_inactive_connect(touch_pad_conn_type_t type);
|
||||
|
||||
/**
|
||||
* @brief Set connection type of touch channel in idle status.
|
||||
* When a channel is in measurement mode, other initialized channels are in idle mode.
|
||||
* The touch channel is generally adjacent to the trace, so the connection state of the idle channel
|
||||
* affects the stability and sensitivity of the test channel.
|
||||
* The `CONN_HIGHZ`(high resistance) setting increases the sensitivity of touch channels.
|
||||
* The `CONN_GND`(grounding) setting increases the stability of touch channels.
|
||||
* @param type Pointer to connection type.
|
||||
* @return
|
||||
* - ESP_OK on success
|
||||
*/
|
||||
esp_err_t touch_pad_get_inactive_connect(touch_pad_conn_type_t *type);
|
||||
|
||||
/**
|
||||
* @brief Set the trigger threshold of touch sensor.
|
||||
* The threshold determines the sensitivity of the touch sensor.
|
||||
* The threshold is the original value of the trigger state minus the baseline value.
|
||||
* @note If set "TOUCH_PAD_THRESHOLD_MAX", the touch is never be trigered.
|
||||
* @param touch_num touch pad index
|
||||
* @param threshold threshold of touch sensor. Should be less than the max change value of touch.
|
||||
* @return
|
||||
* - ESP_OK on success
|
||||
*/
|
||||
esp_err_t touch_pad_set_thresh(touch_pad_t touch_num, uint32_t threshold);
|
||||
|
||||
/**
|
||||
* @brief Get touch sensor trigger threshold
|
||||
* @param touch_num touch pad index
|
||||
* @param threshold pointer to accept threshold
|
||||
* @return
|
||||
* - ESP_OK on success
|
||||
* - ESP_ERR_INVALID_ARG if argument is wrong
|
||||
*/
|
||||
esp_err_t touch_pad_get_thresh(touch_pad_t touch_num, uint32_t *threshold);
|
||||
|
||||
/**
|
||||
* @brief Register touch channel into touch sensor scan group.
|
||||
* The working mode of the touch sensor is cyclically scanned.
|
||||
* This function will set the scan bits according to the given bitmask.
|
||||
* @note If set this mask, the FSM timer should be stop firsty.
|
||||
* @note The touch sensor that in scan map, should be deinit GPIO function firstly by `touch_pad_io_init`.
|
||||
* @param enable_mask bitmask of touch sensor scan group.
|
||||
* e.g. TOUCH_PAD_NUM14 -> BIT(14)
|
||||
* @return
|
||||
* - ESP_OK on success
|
||||
*/
|
||||
esp_err_t touch_pad_set_channel_mask(uint16_t enable_mask);
|
||||
|
||||
/**
|
||||
* @brief Get the touch sensor scan group bit mask.
|
||||
* @param enable_mask Pointer to bitmask of touch sensor scan group.
|
||||
* e.g. TOUCH_PAD_NUM14 -> BIT(14)
|
||||
* @return
|
||||
* - ESP_OK on success
|
||||
*/
|
||||
esp_err_t touch_pad_get_channel_mask(uint16_t *enable_mask);
|
||||
|
||||
/**
|
||||
* @brief Clear touch channel from touch sensor scan group.
|
||||
* The working mode of the touch sensor is cyclically scanned.
|
||||
* This function will clear the scan bits according to the given bitmask.
|
||||
* @note If clear all mask, the FSM timer should be stop firsty.
|
||||
* @param enable_mask bitmask of touch sensor scan group.
|
||||
* e.g. TOUCH_PAD_NUM14 -> BIT(14)
|
||||
* @return
|
||||
* - ESP_OK on success
|
||||
*/
|
||||
esp_err_t touch_pad_clear_channel_mask(uint16_t enable_mask);
|
||||
|
||||
/**
|
||||
* @brief Configure parameter for each touch channel.
|
||||
* @note Touch num 0 is denoise channel, please use `touch_pad_denoise_enable` to set denoise function
|
||||
* @param touch_num touch pad index
|
||||
* @return
|
||||
* - ESP_OK Success
|
||||
* - ESP_ERR_INVALID_ARG if argument wrong
|
||||
* - ESP_FAIL if touch pad not initialized
|
||||
*/
|
||||
esp_err_t touch_pad_config(touch_pad_t touch_num);
|
||||
|
||||
/**
|
||||
* @brief Reset the whole of touch module.
|
||||
* @note Call this funtion after `touch_pad_fsm_stop`,
|
||||
* @return
|
||||
* - ESP_OK Success
|
||||
*/
|
||||
esp_err_t touch_pad_reset(void);
|
||||
|
||||
/**
|
||||
* @brief Check touch sensor measurement status.
|
||||
* If doing measurement, the flag will be clear.
|
||||
* If finish measurement. the flag will be set.
|
||||
* @return
|
||||
* - TRUE finish measurement
|
||||
* - FALSE doing measurement
|
||||
*/
|
||||
bool touch_pad_meas_is_done(void);
|
||||
|
||||
/**
|
||||
* @brief Get the current measure channel.
|
||||
* Touch sensor measurement is cyclic scan mode.
|
||||
* @return
|
||||
* - touch channel number
|
||||
*/
|
||||
touch_pad_t touch_pad_get_current_meas_channel(void);
|
||||
|
||||
/**
|
||||
* @brief Get the touch sensor interrupt status mask.
|
||||
* @return
|
||||
* - touch intrrupt bit
|
||||
*/
|
||||
uint32_t touch_pad_read_intr_status_mask(void);
|
||||
|
||||
/**
|
||||
* @brief Enable touch sensor interrupt by bitmask.
|
||||
* @param type interrupt type
|
||||
* @return
|
||||
* - ESP_OK on success
|
||||
*/
|
||||
esp_err_t touch_pad_intr_enable(touch_pad_intr_mask_t int_mask);
|
||||
|
||||
/**
|
||||
* @brief Disable touch sensor interrupt by bitmask.
|
||||
* @param type interrupt type
|
||||
* @return
|
||||
* - ESP_OK on success
|
||||
*/
|
||||
esp_err_t touch_pad_intr_disable(touch_pad_intr_mask_t int_mask);
|
||||
|
||||
/**
|
||||
* @brief Register touch-pad ISR.
|
||||
* The handler will be attached to the same CPU core that this function is running on.
|
||||
* @param fn Pointer to ISR handler
|
||||
* @param arg Parameter for ISR
|
||||
* @return
|
||||
* - ESP_OK Success ;
|
||||
* - ESP_ERR_INVALID_ARG GPIO error
|
||||
* - ESP_ERR_NO_MEM No memory
|
||||
*/
|
||||
esp_err_t touch_pad_isr_register(intr_handler_t fn, void* arg, touch_pad_intr_mask_t intr_mask);
|
||||
|
||||
/**
|
||||
* @brief get raw data of touch sensor.
|
||||
* @note After the initialization is complete, the "raw_data" is max value. You need to wait for a measurement
|
||||
* cycle before you can read the correct touch value.
|
||||
* @param touch_num touch pad index
|
||||
* @param raw_data pointer to accept touch sensor value
|
||||
* @return
|
||||
* - ESP_OK Success
|
||||
* - ESP_FAIL Touch channel 0 havent this parameter.
|
||||
*/
|
||||
|
||||
esp_err_t touch_pad_read_raw_data(touch_pad_t touch_num, uint32_t *raw_data);
|
||||
|
||||
/**
|
||||
* @brief get baseline of touch sensor.
|
||||
* @note After initialization, the baseline value is the maximum during the first measurement period.
|
||||
* @param touch_num touch pad index
|
||||
* @param touch_value pointer to accept touch sensor value
|
||||
* @return
|
||||
* - ESP_OK Success
|
||||
* - ESP_ERR_INVALID_ARG Touch channel 0 havent this parameter.
|
||||
*/
|
||||
esp_err_t touch_pad_filter_read_baseline(touch_pad_t touch_num, uint32_t *basedata);
|
||||
|
||||
/**
|
||||
* @brief Force reset baseline to raw data of touch sensor.
|
||||
* @param touch_num touch pad index
|
||||
* - TOUCH_PAD_MAX Reset basaline of all channels
|
||||
* @return
|
||||
* - ESP_OK Success
|
||||
*/
|
||||
esp_err_t touch_pad_filter_reset_baseline(touch_pad_t touch_num);
|
||||
|
||||
/**
|
||||
* @brief set parameter of touch sensor filter and detection algorithm.
|
||||
* For more details on the detection algorithm, please refer to the application documentation.
|
||||
* @param filter_info select filter type and threshold of detection algorithm
|
||||
* @return
|
||||
* - ESP_OK Success
|
||||
*/
|
||||
esp_err_t touch_pad_filter_set_config(touch_filter_config_t *filter_info);
|
||||
|
||||
/**
|
||||
* @brief get parameter of touch sensor filter and detection algorithm.
|
||||
* For more details on the detection algorithm, please refer to the application documentation.
|
||||
* @param filter_info select filter type and threshold of detection algorithm
|
||||
* @return
|
||||
* - ESP_OK Success
|
||||
*/
|
||||
esp_err_t touch_pad_filter_get_config(touch_filter_config_t *filter_info);
|
||||
|
||||
/**
|
||||
* @brief enable touch sensor filter for detection algorithm.
|
||||
* For more details on the detection algorithm, please refer to the application documentation.
|
||||
* @return
|
||||
* - ESP_OK Success
|
||||
*/
|
||||
esp_err_t touch_pad_filter_enable(void);
|
||||
|
||||
/**
|
||||
* @brief diaable touch sensor filter for detection algorithm.
|
||||
* For more details on the detection algorithm, please refer to the application documentation.
|
||||
* @return
|
||||
* - ESP_OK Success
|
||||
*/
|
||||
esp_err_t touch_pad_filter_disable(void);
|
||||
|
||||
/**
|
||||
* @brief set parameter of denoise pad (TOUCH_PAD_NUM0).
|
||||
* T0 is an internal channel that does not have a corresponding external GPIO.
|
||||
* T0 will work simultaneously with the measured channel Tn. Finally, the actual
|
||||
* measured value of Tn is the value after subtracting lower bits of T0.
|
||||
* This denoise function filters out interference introduced on all channels,
|
||||
* such as noise introduced by the power supply and external EMI.
|
||||
* @param denoise parameter of denoise
|
||||
* @return
|
||||
* - ESP_OK Success
|
||||
*/
|
||||
esp_err_t touch_pad_denoise_set_config(touch_pad_denoise_t *denoise);
|
||||
|
||||
/**
|
||||
* @brief get parameter of denoise pad (TOUCH_PAD_NUM0).
|
||||
* @param denoise Pointer to parameter of denoise
|
||||
* @return
|
||||
* - ESP_OK Success
|
||||
*/
|
||||
esp_err_t touch_pad_denoise_get_config(touch_pad_denoise_t *denoise);
|
||||
|
||||
/**
|
||||
* @brief enable denoise function.
|
||||
* T0 is an internal channel that does not have a corresponding external GPIO.
|
||||
* T0 will work simultaneously with the measured channel Tn. Finally, the actual
|
||||
* measured value of Tn is the value after subtracting lower bits of T0.
|
||||
* This denoise function filters out interference introduced on all channels,
|
||||
* such as noise introduced by the power supply and external EMI.
|
||||
* @return
|
||||
* - ESP_OK Success
|
||||
*/
|
||||
esp_err_t touch_pad_denoise_enable(void);
|
||||
|
||||
/**
|
||||
* @brief disable denoise function.
|
||||
* @return
|
||||
* - ESP_OK Success
|
||||
*/
|
||||
esp_err_t touch_pad_denoise_disable(void);
|
||||
|
||||
/**
|
||||
* @brief Get denoise measure value (TOUCH_PAD_NUM0).
|
||||
* @param denoise value of denoise
|
||||
* @return
|
||||
* - ESP_OK Success
|
||||
*/
|
||||
esp_err_t touch_pad_denoise_read_data(uint32_t *data);
|
||||
|
||||
/**
|
||||
* @brief set parameter of waterproof function.
|
||||
* The waterproof function includes a shielded channel (TOUCH_PAD_NUM14) and a guard channel.
|
||||
* The shielded channel outputs the same signal as the channel being measured.
|
||||
* It is generally designed as a grid and is placed around the touch buttons.
|
||||
* The shielded channel does not follow the measurement signal of the protection channel.
|
||||
* So that the guard channel can detect a large area of water.
|
||||
* @param waterproof parameter of waterproof
|
||||
* @return
|
||||
* - ESP_OK Success
|
||||
*/
|
||||
esp_err_t touch_pad_waterproof_set_config(touch_pad_waterproof_t *waterproof);
|
||||
|
||||
/**
|
||||
* @brief get parameter of waterproof function.
|
||||
* @param waterproof parameter of waterproof
|
||||
* @return
|
||||
* - ESP_OK Success
|
||||
*/
|
||||
esp_err_t touch_pad_waterproof_get_config(touch_pad_waterproof_t *waterproof);
|
||||
|
||||
/**
|
||||
* @brief Enable parameter of waterproof function.
|
||||
* The waterproof function includes a shielded channel (TOUCH_PAD_NUM14) and a guard channel.
|
||||
* The shielded channel outputs the same signal as the channel being measured.
|
||||
* It is generally designed as a grid and is placed around the touch buttons.
|
||||
* The shielded channel does not follow the measurement signal of the protection channel.
|
||||
* So that the guard channel can detect a large area of water.
|
||||
* @return
|
||||
* - ESP_OK Success
|
||||
*/
|
||||
esp_err_t touch_pad_waterproof_enable(void);
|
||||
|
||||
/**
|
||||
* @brief Enable parameter of waterproof function.
|
||||
* The waterproof function includes a shielded channel (TOUCH_PAD_NUM14) and a guard channel.
|
||||
* The shielded channel outputs the same signal as the channel being measured.
|
||||
* It is generally designed as a grid and is placed around the touch buttons.
|
||||
* The shielded channel does not follow the measurement signal of the protection channel.
|
||||
* So that the guard channel can detect a large area of water.
|
||||
* @return
|
||||
* - ESP_OK Success
|
||||
*/
|
||||
esp_err_t touch_pad_waterproof_disable(void);
|
||||
|
||||
/**
|
||||
* @brief Set parameter of proximity channel. Three proximity sensing channels can be set.
|
||||
* The proximity sensor measurement is the accumulation of touch channel measurements.
|
||||
* @note If stop the proximity function for the channel, point this proximity channel to `TOUCH_PAD_NUM0`.
|
||||
* @param proximity parameter of proximity
|
||||
* @return
|
||||
* - ESP_OK Success
|
||||
*/
|
||||
esp_err_t touch_pad_proximity_set_config(touch_pad_proximity_t *proximity);
|
||||
|
||||
/**
|
||||
* @brief Get parameter of proximity channel. Three proximity sensing channels can be set.
|
||||
* The proximity sensor measurement is the accumulation of touch channel measurements.
|
||||
* @param proximity parameter of proximity
|
||||
* @return
|
||||
* - ESP_OK Success
|
||||
*/
|
||||
esp_err_t touch_pad_proximity_get_config(touch_pad_proximity_t *proximity);
|
||||
|
||||
/**
|
||||
* @brief Get measure count of proximity channel.
|
||||
* The proximity sensor measurement is the accumulation of touch channel measurements.
|
||||
* @param touch_num touch pad index
|
||||
* @param proximity parameter of proximity
|
||||
* @return
|
||||
* - ESP_OK Success
|
||||
* - ESP_ERR_INVALID_ARG parameter is NULL
|
||||
*/
|
||||
esp_err_t touch_pad_proximity_read_meas_cnt(touch_pad_t touch_num, uint32_t *cnt);
|
||||
|
||||
/**
|
||||
* @brief Get the accumulated measurement of the proximity sensor.
|
||||
* The proximity sensor measurement is the accumulation of touch channel measurements.
|
||||
* @param touch_num touch pad index
|
||||
* @param measure_out If the accumulation process does not end, the `measure_out` is the process value.
|
||||
* @return
|
||||
* - ESP_OK Success
|
||||
*/
|
||||
esp_err_t touch_pad_proximity_data_get(touch_pad_t touch_num, uint32_t *measure_out);
|
||||
|
||||
/**
|
||||
* @brief Set parameter of touch sensor in sleep mode.
|
||||
* In order to achieve low power consumption in sleep mode, other circuits except the RTC part of the register are in a power-off state.
|
||||
* Only one touch channel is supported in the sleep state, which can be used as a wake-up function.
|
||||
* If in non-sleep mode, the sleep parameters do not work.
|
||||
* @param slp_config touch pad config
|
||||
* @return
|
||||
* - ESP_OK Success
|
||||
*/
|
||||
esp_err_t touch_pad_sleep_channel_config(touch_pad_sleep_channel_t *slp_config);
|
||||
|
||||
/**
|
||||
* @brief Read baseline of touch sensor in sleep mode.
|
||||
* @param baseline pointer to accept touch sensor baseline value
|
||||
* @return
|
||||
* - ESP_OK Success
|
||||
* - ESP_ERR_INVALID_ARG parameter is NULL
|
||||
*/
|
||||
esp_err_t touch_pad_sleep_channel_read_baseline(uint32_t *baseline);
|
||||
|
||||
/**
|
||||
* @brief Read debounce of touch sensor in sleep mode.
|
||||
* @param debounce pointer to accept touch sensor debounce value
|
||||
* @return
|
||||
* - ESP_OK Success
|
||||
* - ESP_ERR_INVALID_ARG parameter is NULL
|
||||
*/
|
||||
esp_err_t touch_pad_sleep_channel_read_debounce(uint32_t *debounce);
|
||||
|
||||
/**
|
||||
* @brief Read proximity count of touch sensor in sleep mode.
|
||||
* @param proximity_cnt pointer to accept touch sensor proximity count value
|
||||
* @return
|
||||
* - ESP_OK Success
|
||||
* - ESP_ERR_INVALID_ARG parameter is NULL
|
||||
*/
|
||||
esp_err_t touch_pad_sleep_channel_read_proximity_cnt(uint32_t *proximity_cnt);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -1,674 +0,0 @@
|
||||
// Copyright 2016-2018 Espressif Systems (Shanghai) PTE LTD
|
||||
//
|
||||
// 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.
|
||||
|
||||
#include <esp_types.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#include "esp_log.h"
|
||||
#include "soc/rtc_periph.h"
|
||||
#include "soc/sens_periph.h"
|
||||
#include "soc/rtc_io_reg.h"
|
||||
#include "soc/rtc_io_struct.h"
|
||||
#include "soc/sens_reg.h"
|
||||
#include "soc/sens_struct.h"
|
||||
#include "soc/rtc_cntl_reg.h"
|
||||
#include "soc/rtc_cntl_struct.h"
|
||||
#include "soc/rtc.h"
|
||||
#include "soc/periph_defs.h"
|
||||
#include "rtc_io.h"
|
||||
#include "touch_pad.h"
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/xtensa_api.h"
|
||||
#include "freertos/semphr.h"
|
||||
#include "freertos/timers.h"
|
||||
#include "esp_intr_alloc.h"
|
||||
#include "sys/lock.h"
|
||||
#include "driver/rtc_cntl.h"
|
||||
#include "driver/gpio.h"
|
||||
#include "sdkconfig.h"
|
||||
|
||||
#include "esp32s2beta/rom/ets_sys.h"
|
||||
|
||||
#ifndef NDEBUG
|
||||
// Enable built-in checks in queue.h in debug builds
|
||||
#define INVARIANTS
|
||||
#endif
|
||||
#include "sys/queue.h"
|
||||
|
||||
#define TOUCH_PAD_FILTER_FACTOR_DEFAULT (4) // IIR filter coefficient.
|
||||
#define TOUCH_PAD_SHIFT_DEFAULT (4) // Increase computing accuracy.
|
||||
#define TOUCH_PAD_SHIFT_ROUND_DEFAULT (8) // ROUND = 2^(n-1); rounding off for fractional.
|
||||
#define TOUCH_PAD_MEASURE_WAIT_DEFAULT (0xFF) // The timer frequency is 8Mhz, the max value is 0xff
|
||||
#define DAC_ERR_STR_CHANNEL_ERROR "DAC channel error"
|
||||
|
||||
#define RTC_MODULE_CHECK(a, str, ret_val) ({ \
|
||||
if (!(a)) { \
|
||||
ESP_LOGE(RTC_MODULE_TAG,"%s:%d (%s):%s", __FILE__, __LINE__, __FUNCTION__, str); \
|
||||
return (ret_val); \
|
||||
} \
|
||||
})
|
||||
|
||||
#define RTC_RES_CHECK(res, ret_val) ({ \
|
||||
if ( (res) != ESP_OK) { \
|
||||
ESP_LOGE(RTC_MODULE_TAG,"%s:%d (%s)", __FILE__, __LINE__, __FUNCTION__);\
|
||||
return (ret_val); \
|
||||
} \
|
||||
})
|
||||
|
||||
static portMUX_TYPE rtc_spinlock = portMUX_INITIALIZER_UNLOCKED;
|
||||
#define RTC_TOUCH_ENTER_CRITICAL() portENTER_CRITICAL(&rtc_spinlock)
|
||||
#define RTC_TOUCH_EXIT_CRITICAL() portEXIT_CRITICAL(&rtc_spinlock)
|
||||
|
||||
static SemaphoreHandle_t rtc_touch_mux = NULL;
|
||||
static const char *RTC_MODULE_TAG = "RTC_MODULE";
|
||||
|
||||
/*---------------------------------------------------------------
|
||||
Touch Pad
|
||||
---------------------------------------------------------------*/
|
||||
esp_err_t touch_pad_isr_register(intr_handler_t fn, void *arg, touch_pad_intr_mask_t intr_mask)
|
||||
{
|
||||
assert(fn != NULL);
|
||||
return rtc_isr_register(fn, arg, TOUCH_PAD_INTR_MASK_ALL & (intr_mask << RTC_CNTL_TOUCH_DONE_INT_ENA_S));
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_isr_deregister(intr_handler_t fn, void *arg)
|
||||
{
|
||||
return rtc_isr_deregister(fn, arg);
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_set_meas_time(uint16_t sleep_cycle, uint16_t meas_times)
|
||||
{
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
// touch sensor sleep cycle Time = sleep_cycle / RTC_SLOW_CLK( can be 150k or 32k depending on the options)
|
||||
RTCCNTL.touch_ctrl1.touch_sleep_cycles = sleep_cycle;
|
||||
//The times of charge and discharge in each measure process of touch channels.
|
||||
RTCCNTL.touch_ctrl1.touch_meas_num = meas_times;
|
||||
//the waiting cycles (in 8MHz) between TOUCH_START and TOUCH_XPD
|
||||
RTCCNTL.touch_ctrl2.touch_xpd_wait = TOUCH_PAD_MEASURE_WAIT_DEFAULT; //wait volt stable
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_get_meas_time(uint16_t *sleep_cycle, uint16_t *meas_times)
|
||||
{
|
||||
if (sleep_cycle) {
|
||||
*sleep_cycle = RTCCNTL.touch_ctrl1.touch_sleep_cycles;
|
||||
}
|
||||
if (meas_times) {
|
||||
*meas_times = RTCCNTL.touch_ctrl1.touch_meas_num;
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_set_inactive_connect(touch_pad_conn_type_t type)
|
||||
{
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
RTCCNTL.touch_scan_ctrl.touch_inactive_connection = type;
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_get_inactive_connect(touch_pad_conn_type_t *type)
|
||||
{
|
||||
RTC_MODULE_CHECK(type != NULL, "parameter is NULL", ESP_ERR_INVALID_ARG);
|
||||
*type = RTCCNTL.touch_scan_ctrl.touch_inactive_connection;
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_set_voltage(touch_high_volt_t refh, touch_low_volt_t refl, touch_volt_atten_t atten)
|
||||
{
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
if (refh > TOUCH_HVOLT_KEEP) {
|
||||
RTCCNTL.touch_ctrl2.touch_drefh = refh;
|
||||
}
|
||||
if (refl > TOUCH_LVOLT_KEEP) {
|
||||
RTCCNTL.touch_ctrl2.touch_drefl = refl;
|
||||
}
|
||||
if (atten > TOUCH_HVOLT_ATTEN_KEEP) {
|
||||
RTCCNTL.touch_ctrl2.touch_drange = atten;
|
||||
}
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_get_voltage(touch_high_volt_t *refh, touch_low_volt_t *refl, touch_volt_atten_t *atten)
|
||||
{
|
||||
if (refh) {
|
||||
*refh = RTCCNTL.touch_ctrl2.touch_drefh;
|
||||
}
|
||||
if (refl) {
|
||||
*refl = RTCCNTL.touch_ctrl2.touch_drefl;
|
||||
}
|
||||
if (atten) {
|
||||
*atten = RTCCNTL.touch_ctrl2.touch_drange;
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_set_cnt_mode(touch_pad_t touch_num, touch_cnt_slope_t slope, touch_tie_opt_t opt)
|
||||
{
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
RTCIO.touch_pad[touch_num].tie_opt = opt;
|
||||
RTCIO.touch_pad[touch_num].dac = slope;
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_get_cnt_mode(touch_pad_t touch_num, touch_cnt_slope_t *slope, touch_tie_opt_t *opt)
|
||||
{
|
||||
if (slope) {
|
||||
*slope = RTCIO.touch_pad[touch_num].dac;
|
||||
}
|
||||
if (opt) {
|
||||
*opt = RTCIO.touch_pad[touch_num].tie_opt;
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_io_init(touch_pad_t touch_num)
|
||||
{
|
||||
RTC_MODULE_CHECK(touch_num != TOUCH_DENOISE_CHANNEL,
|
||||
"please use `touch_pad_denoise_enable` to set denoise channel", ESP_ERR_INVALID_ARG);
|
||||
rtc_gpio_init(touch_num);
|
||||
rtc_gpio_set_direction(touch_num, RTC_GPIO_MODE_DISABLED);
|
||||
rtc_gpio_pulldown_dis(touch_num);
|
||||
rtc_gpio_pullup_dis(touch_num);
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_wait_init_done(void)
|
||||
{
|
||||
// TODO
|
||||
return ESP_FAIL;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_fsm_start(void)
|
||||
{
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
RTCCNTL.touch_ctrl2.touch_clkgate_en = 1; //enable touch clock for FSM. or force enable.
|
||||
SENS.sar_touch_chn_st.touch_channel_clr = TOUCH_PAD_BIT_MASK_MAX; // clear SENS_TOUCH_SLP_BASELINE
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_fsm_stop(void)
|
||||
{
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
RTCCNTL.touch_ctrl2.touch_start_en = 0; //stop touch fsm
|
||||
RTCCNTL.touch_ctrl2.touch_slp_timer_en = 0;
|
||||
RTCCNTL.touch_ctrl2.touch_clkgate_en = 0; //enable touch clock for FSM. or force enable.
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_set_fsm_mode(touch_fsm_mode_t mode)
|
||||
{
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
RTCCNTL.touch_ctrl2.touch_start_en = 0; //stop touch fsm
|
||||
RTCCNTL.touch_ctrl2.touch_start_force = mode;
|
||||
RTCCNTL.touch_ctrl2.touch_slp_timer_en = (mode == TOUCH_FSM_MODE_TIMER ? 1 : 0);
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_get_fsm_mode(touch_fsm_mode_t *mode)
|
||||
{
|
||||
assert(mode != NULL);
|
||||
*mode = RTCCNTL.touch_ctrl2.touch_start_force;
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
bool touch_pad_meas_is_done(void)
|
||||
{
|
||||
return SENS.sar_touch_chn_st.touch_meas_done;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_sw_start(void)
|
||||
{
|
||||
RTC_MODULE_CHECK((RTCCNTL.touch_ctrl2.touch_start_force == TOUCH_FSM_MODE_SW),
|
||||
"touch fsm mode error", ESP_ERR_INVALID_STATE);
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
RTCCNTL.touch_ctrl2.touch_start_en = 0;
|
||||
RTCCNTL.touch_ctrl2.touch_start_en = 1;
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_set_thresh(touch_pad_t touch_num, uint32_t threshold)
|
||||
{
|
||||
RTC_MODULE_CHECK((touch_num < TOUCH_PAD_MAX) && (touch_num != TOUCH_DENOISE_CHANNEL), "touch num error", ESP_ERR_INVALID_ARG);
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
SENS.touch_thresh[touch_num - 1].thresh = threshold;
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_get_thresh(touch_pad_t touch_num, uint32_t *threshold)
|
||||
{
|
||||
if (threshold) {
|
||||
*threshold = SENS.touch_thresh[touch_num - 1].thresh;
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_set_group_mask(uint16_t enable_mask)
|
||||
{
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
RTCCNTL.touch_scan_ctrl.touch_scan_pad_map |= (enable_mask & TOUCH_PAD_BIT_MASK_MAX);
|
||||
SENS.sar_touch_conf.touch_outen |= (enable_mask & TOUCH_PAD_BIT_MASK_MAX);
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_get_group_mask(uint16_t *enable_mask)
|
||||
{
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
*enable_mask = SENS.sar_touch_conf.touch_outen \
|
||||
& RTCCNTL.touch_scan_ctrl.touch_scan_pad_map \
|
||||
& TOUCH_PAD_BIT_MASK_MAX;
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_clear_group_mask(uint16_t enable_mask)
|
||||
{
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
SENS.sar_touch_conf.touch_outen &= ~(enable_mask & TOUCH_PAD_BIT_MASK_MAX);
|
||||
RTCCNTL.touch_scan_ctrl.touch_scan_pad_map &= ~(enable_mask & TOUCH_PAD_BIT_MASK_MAX);
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
uint32_t IRAM_ATTR touch_pad_get_status(void)
|
||||
{
|
||||
return (SENS.sar_touch_chn_st.touch_pad_active & TOUCH_PAD_BIT_MASK_MAX);
|
||||
}
|
||||
|
||||
static esp_err_t touch_pad_clear_status(void)
|
||||
{
|
||||
SENS.sar_touch_conf.touch_status_clr = 1;
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
touch_pad_t IRAM_ATTR touch_pad_get_scan_curr(void)
|
||||
{
|
||||
return (touch_pad_t)(SENS.sar_touch_status0.touch_scan_curr);
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_intr_enable(touch_pad_intr_mask_t int_mask)
|
||||
{
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
if (int_mask & TOUCH_PAD_INTR_MASK_DONE) {
|
||||
RTCCNTL.int_ena.rtc_touch_done = 1;
|
||||
}
|
||||
if (int_mask & TOUCH_PAD_INTR_MASK_ACTIVE) {
|
||||
RTCCNTL.int_ena.rtc_touch_active = 1;
|
||||
}
|
||||
if (int_mask & TOUCH_PAD_INTR_MASK_INACTIVE) {
|
||||
RTCCNTL.int_ena.rtc_touch_inactive = 1;
|
||||
}
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_intr_disable(touch_pad_intr_mask_t int_mask)
|
||||
{
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
if (int_mask & TOUCH_PAD_INTR_MASK_DONE) {
|
||||
RTCCNTL.int_ena.rtc_touch_done = 0;
|
||||
}
|
||||
if (int_mask & TOUCH_PAD_INTR_MASK_ACTIVE) {
|
||||
RTCCNTL.int_ena.rtc_touch_active = 0;
|
||||
}
|
||||
if (int_mask & TOUCH_PAD_INTR_MASK_INACTIVE) {
|
||||
RTCCNTL.int_ena.rtc_touch_inactive = 0;
|
||||
}
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
uint32_t touch_pad_intr_status_get_mask(void)
|
||||
{
|
||||
return ((REG_READ(RTC_CNTL_INT_ST_REG) >> (RTC_CNTL_TOUCH_DONE_INT_ST_S)) & TOUCH_PAD_INTR_MASK_ALL);
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_config(touch_pad_t touch_num)
|
||||
{
|
||||
RTC_MODULE_CHECK(touch_num != TOUCH_DENOISE_CHANNEL, \
|
||||
"please use `touch_pad_denoise_enable` to set denoise channel", ESP_ERR_INVALID_ARG);
|
||||
touch_pad_io_init(touch_num);
|
||||
touch_pad_set_cnt_mode(touch_num, TOUCH_PAD_SLOPE_7, TOUCH_PAD_TIE_OPT_LOW);
|
||||
touch_pad_set_thresh(touch_num, TOUCH_PAD_THRESHOLD_MAX);
|
||||
touch_pad_set_group_mask(BIT(touch_num));
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_init(void)
|
||||
{
|
||||
if (rtc_touch_mux == NULL) {
|
||||
rtc_touch_mux = xSemaphoreCreateMutex();
|
||||
}
|
||||
if (rtc_touch_mux == NULL) {
|
||||
return ESP_ERR_NO_MEM;
|
||||
}
|
||||
touch_pad_intr_disable(TOUCH_PAD_INTR_ALL);
|
||||
touch_pad_clear_group_mask(TOUCH_PAD_BIT_MASK_MAX);
|
||||
touch_pad_clear_status();
|
||||
touch_pad_set_meas_time(TOUCH_PAD_SLEEP_CYCLE_DEFAULT, TOUCH_PAD_MEASURE_CYCLE_DEFAULT);
|
||||
// Set reference voltage for charging/discharging
|
||||
touch_pad_set_voltage(TOUCH_HVOLT_2V7, TOUCH_LVOLT_0V5, TOUCH_HVOLT_ATTEN_0V5);
|
||||
touch_pad_set_inactive_connect(TOUCH_PAD_CONN_GND);
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_deinit(void)
|
||||
{
|
||||
RTC_MODULE_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_FAIL);
|
||||
xSemaphoreTake(rtc_touch_mux, portMAX_DELAY);
|
||||
touch_pad_fsm_stop();
|
||||
touch_pad_clear_status();
|
||||
touch_pad_intr_disable(TOUCH_PAD_INTR_ALL);
|
||||
xSemaphoreGive(rtc_touch_mux);
|
||||
vSemaphoreDelete(rtc_touch_mux);
|
||||
rtc_touch_mux = NULL;
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t IRAM_ATTR touch_pad_read_raw_data(touch_pad_t touch_num, uint32_t *raw_data)
|
||||
{
|
||||
if (raw_data) {
|
||||
*raw_data = SENS.touch_meas[touch_num].meas_out;
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
|
||||
esp_err_t IRAM_ATTR touch_pad_filter_baseline_read(touch_pad_t touch_num, uint32_t *basedata)
|
||||
{
|
||||
RTC_MODULE_CHECK(touch_num != TOUCH_DENOISE_CHANNEL, "denoise channel don't support", ESP_ERR_INVALID_ARG);
|
||||
if (basedata) {
|
||||
*basedata = SENS.sar_touch_status[touch_num - 1].touch_pad_baseline;
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_filter_debounce_read(touch_pad_t touch_num, uint32_t *debounce)
|
||||
{
|
||||
RTC_MODULE_CHECK(touch_num != TOUCH_DENOISE_CHANNEL, "denoise channel don't support", ESP_ERR_INVALID_ARG);
|
||||
if (debounce) {
|
||||
*debounce = SENS.sar_touch_status[touch_num - 1].touch_pad_debounce;
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
/* Should be call after clk enable and filter enable. */
|
||||
esp_err_t touch_pad_filter_baseline_reset(touch_pad_t touch_num)
|
||||
{
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
if (touch_num == TOUCH_PAD_MAX) {
|
||||
SENS.sar_touch_chn_st.touch_channel_clr = TOUCH_PAD_BIT_MASK_MAX;
|
||||
} else {
|
||||
SENS.sar_touch_chn_st.touch_channel_clr = BIT(touch_num);
|
||||
}
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_filter_set_config(touch_filter_config_t *filter_info)
|
||||
{
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
RTCCNTL.touch_filter_ctrl.touch_filter_mode = filter_info->mode;
|
||||
RTCCNTL.touch_filter_ctrl.touch_debounce = filter_info->debounce_cnt;
|
||||
RTCCNTL.touch_filter_ctrl.touch_hysteresis = filter_info->hysteresis_thr;
|
||||
RTCCNTL.touch_filter_ctrl.touch_noise_thres = filter_info->noise_thr;
|
||||
RTCCNTL.touch_filter_ctrl.touch_neg_noise_thres = filter_info->noise_neg_thr;
|
||||
RTCCNTL.touch_filter_ctrl.touch_neg_noise_limit = filter_info->neg_noise_limit;
|
||||
RTCCNTL.touch_filter_ctrl.touch_jitter_step = filter_info->jitter_step;
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_filter_get_config(touch_filter_config_t *filter_info)
|
||||
{
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
filter_info->mode = RTCCNTL.touch_filter_ctrl.touch_filter_mode;
|
||||
filter_info->debounce_cnt = RTCCNTL.touch_filter_ctrl.touch_debounce;
|
||||
filter_info->hysteresis_thr = RTCCNTL.touch_filter_ctrl.touch_hysteresis;
|
||||
filter_info->noise_thr = RTCCNTL.touch_filter_ctrl.touch_noise_thres;
|
||||
filter_info->noise_neg_thr = RTCCNTL.touch_filter_ctrl.touch_neg_noise_thres;
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_filter_enable(void)
|
||||
{
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
RTCCNTL.touch_filter_ctrl.touch_filter_en = 1;
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_filter_disable(void)
|
||||
{
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
RTCCNTL.touch_filter_ctrl.touch_filter_en = 0;
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_denoise_enable(void)
|
||||
{
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
RTCCNTL.touch_scan_ctrl.touch_scan_pad_map &= ~(BIT(TOUCH_DENOISE_CHANNEL));
|
||||
RTCCNTL.touch_scan_ctrl.touch_denoise_en = 1;
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_denoise_disable(void)
|
||||
{
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
RTCCNTL.touch_scan_ctrl.touch_denoise_en = 0;
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_denoise_set_config(touch_pad_denoise_t denoise)
|
||||
{
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
RTCIO.touch_pad[TOUCH_DENOISE_CHANNEL].tie_opt = TOUCH_PAD_TIE_OPT_LOW;
|
||||
RTCIO.touch_pad[TOUCH_DENOISE_CHANNEL].dac = TOUCH_PAD_SLOPE_7;
|
||||
RTCCNTL.touch_ctrl2.touch_refc = denoise.cap_level;
|
||||
RTCCNTL.touch_scan_ctrl.touch_denoise_res = denoise.grade;
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_denoise_get_config(touch_pad_denoise_t *denoise)
|
||||
{
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
denoise->grade = RTCCNTL.touch_scan_ctrl.touch_denoise_res;
|
||||
denoise->cap_level = RTCCNTL.touch_ctrl2.touch_refc;
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_denoise_data_get(uint32_t *data)
|
||||
{
|
||||
if (data) {
|
||||
*data = SENS.sar_touch_status0.touch_denoise_data;
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_waterproof_set_config(touch_pad_waterproof_t waterproof)
|
||||
{
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
RTCCNTL.touch_scan_ctrl.touch_out_ring = waterproof.guard_ring_pad;
|
||||
RTCCNTL.touch_scan_ctrl.touch_bufdrv = waterproof.shield_driver;
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_waterproof_get_config(touch_pad_waterproof_t *waterproof)
|
||||
{
|
||||
if (waterproof) {
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
waterproof->guard_ring_pad = RTCCNTL.touch_scan_ctrl.touch_out_ring;
|
||||
waterproof->shield_driver = RTCCNTL.touch_scan_ctrl.touch_bufdrv;
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_waterproof_enable(void)
|
||||
{
|
||||
touch_pad_io_init(TOUCH_SHIELD_CHANNEL);
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
RTCCNTL.touch_scan_ctrl.touch_scan_pad_map &= ~(BIT(TOUCH_SHIELD_CHANNEL));
|
||||
RTCCNTL.touch_scan_ctrl.touch_shield_pad_en = 1;
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_waterproof_disable(void)
|
||||
{
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
RTCCNTL.touch_scan_ctrl.touch_shield_pad_en = 0;
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_proximity_set_config(touch_pad_proximity_t proximity)
|
||||
{
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
if (proximity.select_pad0) {
|
||||
SENS.sar_touch_conf.touch_approach_pad0 = proximity.select_pad0;
|
||||
}
|
||||
if (proximity.select_pad1) {
|
||||
SENS.sar_touch_conf.touch_approach_pad1 = proximity.select_pad1;
|
||||
}
|
||||
if (proximity.select_pad2) {
|
||||
SENS.sar_touch_conf.touch_approach_pad2 = proximity.select_pad2;
|
||||
}
|
||||
RTCCNTL.touch_approach.touch_approach_meas_time = proximity.meas_num;
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_proximity_get_config(touch_pad_proximity_t *proximity)
|
||||
{
|
||||
if (proximity) {
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
proximity->select_pad0 = SENS.sar_touch_conf.touch_approach_pad0;
|
||||
proximity->select_pad1 = SENS.sar_touch_conf.touch_approach_pad1;
|
||||
proximity->select_pad2 = SENS.sar_touch_conf.touch_approach_pad2;
|
||||
proximity->meas_num = RTCCNTL.touch_approach.touch_approach_meas_time;
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
} else {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_proximity_get_meas_cnt(touch_pad_t touch_num, uint32_t *cnt)
|
||||
{
|
||||
if (cnt == NULL) {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
if (SENS.sar_touch_conf.touch_approach_pad0 == touch_num) {
|
||||
*cnt = SENS.sar_touch_appr_status.touch_approach_pad0_cnt;
|
||||
} else if (SENS.sar_touch_conf.touch_approach_pad1 == touch_num) {
|
||||
*cnt = SENS.sar_touch_appr_status.touch_approach_pad1_cnt;
|
||||
} else if (SENS.sar_touch_conf.touch_approach_pad2 == touch_num) {
|
||||
*cnt = SENS.sar_touch_appr_status.touch_approach_pad2_cnt;
|
||||
} else {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_proximity_data_get(touch_pad_t touch_num, uint32_t *measure_out)
|
||||
{
|
||||
if ((SENS.sar_touch_conf.touch_approach_pad0 != touch_num)
|
||||
&& (SENS.sar_touch_conf.touch_approach_pad1 != touch_num)
|
||||
&& (SENS.sar_touch_conf.touch_approach_pad2 != touch_num)) {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
if (ESP_OK != touch_pad_filter_baseline_read(touch_num, measure_out)) {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_reset()
|
||||
{
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
RTCCNTL.touch_ctrl2.touch_reset = 0;
|
||||
RTCCNTL.touch_ctrl2.touch_reset = 1;
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
/************** sleep pad setting ***********************/
|
||||
|
||||
esp_err_t touch_pad_sleep_channel_config(touch_pad_sleep_channel_t slp_config)
|
||||
{
|
||||
RTC_TOUCH_ENTER_CRITICAL();
|
||||
RTCCNTL.touch_slp_thres.touch_slp_pad = slp_config.touch_num;
|
||||
RTCCNTL.touch_slp_thres.touch_slp_th = slp_config.sleep_pad_threshold;
|
||||
RTCCNTL.touch_slp_thres.touch_slp_approach_en = slp_config.en_proximity;
|
||||
RTC_TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_sleep_channel_baseline_get(uint32_t *baseline)
|
||||
{
|
||||
if (baseline) {
|
||||
*baseline = REG_GET_FIELD(SENS_SAR_TOUCH_SLP_STATUS_REG, SENS_TOUCH_SLP_BASELINE);
|
||||
} else {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_sleep_channel_debounce_get(uint32_t *debounce)
|
||||
{
|
||||
if (debounce) {
|
||||
*debounce = REG_GET_FIELD(SENS_SAR_TOUCH_SLP_STATUS_REG, SENS_TOUCH_SLP_DEBOUNCE);
|
||||
} else {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_sleep_channel_proximity_cnt_get(uint32_t *approach_cnt)
|
||||
{
|
||||
if (approach_cnt) {
|
||||
*approach_cnt = REG_GET_FIELD(SENS_SAR_TOUCH_APPR_STATUS_REG, SENS_TOUCH_SLP_APPROACH_CNT);
|
||||
} else {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_get_wakeup_status(touch_pad_t *pad_num)
|
||||
{
|
||||
if (pad_num) {
|
||||
*pad_num = (touch_pad_t)RTCCNTL.touch_slp_thres.touch_slp_pad;
|
||||
} else {
|
||||
return ESP_ERR_INVALID_ARG;
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
445
components/driver/esp32s2beta/touch_sensor.c
Normal file
445
components/driver/esp32s2beta/touch_sensor.c
Normal file
@@ -0,0 +1,445 @@
|
||||
// Copyright 2016-2018 Espressif Systems (Shanghai) PTE LTD
|
||||
//
|
||||
// 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.
|
||||
|
||||
#include <esp_types.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#include "esp_log.h"
|
||||
#include "sys/lock.h"
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/xtensa_api.h"
|
||||
#include "freertos/semphr.h"
|
||||
#include "freertos/timers.h"
|
||||
#include "esp_intr_alloc.h"
|
||||
#include "driver/rtc_io.h"
|
||||
#include "driver/touch_pad.h"
|
||||
#include "driver/rtc_cntl.h"
|
||||
#include "driver/gpio.h"
|
||||
#include "sdkconfig.h"
|
||||
|
||||
#include "esp32s2beta/rom/ets_sys.h"
|
||||
#include "hal/touch_sensor_types.h"
|
||||
#include "hal/touch_sensor_hal.h"
|
||||
|
||||
#ifndef NDEBUG
|
||||
// Enable built-in checks in queue.h in debug builds
|
||||
#define INVARIANTS
|
||||
#endif
|
||||
#include "sys/queue.h"
|
||||
|
||||
#define TOUCH_PAD_FILTER_FACTOR_DEFAULT (4) // IIR filter coefficient.
|
||||
#define TOUCH_PAD_SHIFT_DEFAULT (4) // Increase computing accuracy.
|
||||
#define TOUCH_PAD_SHIFT_ROUND_DEFAULT (8) // ROUND = 2^(n-1); rounding off for fractional.
|
||||
#define TOUCH_PAD_MEASURE_WAIT_DEFAULT (0xFF) // The timer frequency is 8Mhz, the max value is 0xff
|
||||
|
||||
static const char *TOUCH_TAG = "TOUCH_SENSOR";
|
||||
#define TOUCH_CHECK(a, str, ret_val) ({ \
|
||||
if (!(a)) { \
|
||||
ESP_LOGE(TOUCH_TAG,"%s:%d (%s):%s", __FILE__, __LINE__, __FUNCTION__, str); \
|
||||
return (ret_val); \
|
||||
} \
|
||||
})
|
||||
#define TOUCH_CHANNEL_CHECK(channel) do { \
|
||||
TOUCH_CHECK(channel < SOC_TOUCH_SENSOR_NUM && channel >= 0, "Touch channel error", ESP_ERR_INVALID_ARG); \
|
||||
TOUCH_CHECK(channel != SOC_TOUCH_DENOISE_CHANNEL, "TOUCH0 is internal denoise channel", ESP_ERR_INVALID_ARG); \
|
||||
} while (0);
|
||||
#define TOUCH_CH_MASK_CHECK(mask) TOUCH_CHECK((mask <= SOC_TOUCH_SENSOR_BIT_MASK_MAX), "touch channel bitmask error", ESP_ERR_INVALID_ARG)
|
||||
#define TOUCH_INTR_MASK_CHECK(mask) TOUCH_CHECK(mask & TOUCH_PAD_INTR_MASK_ALL, "intr mask error", ESP_ERR_INVALID_ARG)
|
||||
#define TOUCH_PARAM_CHECK_STR(s) ""s" parameter error"
|
||||
|
||||
extern portMUX_TYPE rtc_spinlock; //TODO: Will be placed in the appropriate position after the rtc module is finished.
|
||||
#define TOUCH_ENTER_CRITICAL() portENTER_CRITICAL(&rtc_spinlock)
|
||||
#define TOUCH_EXIT_CRITICAL() portEXIT_CRITICAL(&rtc_spinlock)
|
||||
|
||||
static SemaphoreHandle_t rtc_touch_mux = NULL;
|
||||
|
||||
/*---------------------------------------------------------------
|
||||
Touch Pad
|
||||
---------------------------------------------------------------*/
|
||||
|
||||
esp_err_t touch_pad_isr_register(intr_handler_t fn, void *arg, touch_pad_intr_mask_t intr_mask)
|
||||
{
|
||||
TOUCH_CHECK(fn != NULL, TOUCH_PARAM_CHECK_STR("intr_mask"), ESP_ERR_INVALID_ARG);
|
||||
TOUCH_INTR_MASK_CHECK(intr_mask);
|
||||
|
||||
uint32_t en_msk = 0;
|
||||
if (intr_mask & TOUCH_PAD_INTR_MASK_DONE) {
|
||||
en_msk |= RTC_CNTL_TOUCH_DONE_INT_ST_M;
|
||||
}
|
||||
if (intr_mask & TOUCH_PAD_INTR_MASK_ACTIVE) {
|
||||
en_msk |= RTC_CNTL_TOUCH_ACTIVE_INT_ST_M;
|
||||
}
|
||||
if (intr_mask & TOUCH_PAD_INTR_MASK_INACTIVE) {
|
||||
en_msk |= RTC_CNTL_TOUCH_INACTIVE_INT_ST_M;
|
||||
}
|
||||
return rtc_isr_register(fn, arg, en_msk);
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_set_meas_time(uint16_t sleep_cycle, uint16_t meas_times)
|
||||
{
|
||||
TOUCH_ENTER_CRITICAL();
|
||||
touch_hal_set_meas_times(meas_times);
|
||||
touch_hal_set_sleep_time(sleep_cycle);
|
||||
TOUCH_EXIT_CRITICAL();
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_get_meas_time(uint16_t *sleep_cycle, uint16_t *meas_times)
|
||||
{
|
||||
TOUCH_ENTER_CRITICAL();
|
||||
touch_hal_get_measure_times(meas_times);
|
||||
touch_hal_get_sleep_time(sleep_cycle);
|
||||
TOUCH_EXIT_CRITICAL();
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_set_inactive_connect(touch_pad_conn_type_t type)
|
||||
{
|
||||
TOUCH_CHECK(type < TOUCH_PAD_CONN_MAX, TOUCH_PARAM_CHECK_STR("type"), ESP_ERR_INVALID_ARG);
|
||||
TOUCH_ENTER_CRITICAL();
|
||||
touch_hal_set_inactive_connect(type);
|
||||
TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_get_inactive_connect(touch_pad_conn_type_t *type)
|
||||
{
|
||||
touch_hal_get_inactive_connect(type);
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
bool touch_pad_meas_is_done(void)
|
||||
{
|
||||
return touch_hal_meas_is_done();
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_set_channel_mask(uint16_t enable_mask)
|
||||
{
|
||||
TOUCH_CH_MASK_CHECK(enable_mask);
|
||||
TOUCH_ENTER_CRITICAL();
|
||||
touch_hal_set_channel_mask(enable_mask);
|
||||
TOUCH_EXIT_CRITICAL();
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_get_channel_mask(uint16_t *enable_mask)
|
||||
{
|
||||
TOUCH_ENTER_CRITICAL();
|
||||
touch_hal_get_channel_mask(enable_mask);
|
||||
TOUCH_EXIT_CRITICAL();
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_clear_channel_mask(uint16_t enable_mask)
|
||||
{
|
||||
TOUCH_CH_MASK_CHECK(enable_mask);
|
||||
TOUCH_ENTER_CRITICAL();
|
||||
touch_hal_clear_channel_mask(enable_mask);
|
||||
TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
touch_pad_t IRAM_ATTR touch_pad_get_current_meas_channel(void)
|
||||
{
|
||||
return (touch_pad_t)touch_hal_get_current_meas_channel();
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_intr_enable(touch_pad_intr_mask_t int_mask)
|
||||
{
|
||||
TOUCH_INTR_MASK_CHECK(int_mask);
|
||||
TOUCH_ENTER_CRITICAL();
|
||||
touch_hal_intr_enable(int_mask);
|
||||
TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_intr_disable(touch_pad_intr_mask_t int_mask)
|
||||
{
|
||||
TOUCH_INTR_MASK_CHECK(int_mask);
|
||||
TOUCH_ENTER_CRITICAL();
|
||||
touch_hal_intr_disable(int_mask);
|
||||
TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
uint32_t touch_pad_read_intr_status_mask(void)
|
||||
{
|
||||
return touch_hal_read_intr_status_mask();
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_config(touch_pad_t touch_num)
|
||||
{
|
||||
TOUCH_CHANNEL_CHECK(touch_num);
|
||||
|
||||
touch_pad_io_init(touch_num);
|
||||
TOUCH_ENTER_CRITICAL();
|
||||
touch_hal_config(touch_num);
|
||||
touch_hal_set_channel_mask(BIT(touch_num));
|
||||
TOUCH_EXIT_CRITICAL();
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_init(void)
|
||||
{
|
||||
if (rtc_touch_mux == NULL) {
|
||||
rtc_touch_mux = xSemaphoreCreateMutex();
|
||||
}
|
||||
if (rtc_touch_mux == NULL) {
|
||||
return ESP_ERR_NO_MEM;
|
||||
}
|
||||
TOUCH_ENTER_CRITICAL();
|
||||
touch_hal_init();
|
||||
TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_deinit(void)
|
||||
{
|
||||
TOUCH_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_FAIL);
|
||||
xSemaphoreTake(rtc_touch_mux, portMAX_DELAY);
|
||||
TOUCH_ENTER_CRITICAL();
|
||||
touch_hal_deinit();
|
||||
TOUCH_EXIT_CRITICAL();
|
||||
xSemaphoreGive(rtc_touch_mux);
|
||||
vSemaphoreDelete(rtc_touch_mux);
|
||||
rtc_touch_mux = NULL;
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_reset(void)
|
||||
{
|
||||
TOUCH_ENTER_CRITICAL();
|
||||
touch_hal_reset();
|
||||
TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t IRAM_ATTR touch_pad_read_raw_data(touch_pad_t touch_num, uint32_t *raw_data)
|
||||
{
|
||||
TOUCH_CHANNEL_CHECK(touch_num);
|
||||
*raw_data = touch_hal_read_raw_data(touch_num);
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t IRAM_ATTR touch_pad_filter_read_baseline(touch_pad_t touch_num, uint32_t *basedata)
|
||||
{
|
||||
TOUCH_CHANNEL_CHECK(touch_num);
|
||||
touch_hal_filter_read_baseline(touch_num, basedata);
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
/* Should be call after clk enable and filter enable. */
|
||||
esp_err_t touch_pad_filter_reset_baseline(touch_pad_t touch_num)
|
||||
{
|
||||
TOUCH_CHECK(touch_num <= TOUCH_PAD_MAX && touch_num >= 0, "Touch channel error", ESP_ERR_INVALID_ARG);
|
||||
TOUCH_ENTER_CRITICAL();
|
||||
touch_hal_filter_reset_baseline(touch_num);
|
||||
TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_filter_set_config(touch_filter_config_t *filter_info)
|
||||
{
|
||||
TOUCH_CHECK(filter_info->mode < TOUCH_PAD_FILTER_MAX, TOUCH_PARAM_CHECK_STR("mode"), ESP_ERR_INVALID_ARG);
|
||||
TOUCH_CHECK(filter_info->debounce_cnt <= TOUCH_DEBOUNCE_CNT_MAX, TOUCH_PARAM_CHECK_STR("debounce"), ESP_ERR_INVALID_ARG);
|
||||
TOUCH_CHECK(filter_info->hysteresis_thr <= TOUCH_HYSTERESIS_THR_MAX, TOUCH_PARAM_CHECK_STR("hysteresis"), ESP_ERR_INVALID_ARG);
|
||||
TOUCH_CHECK(filter_info->noise_thr <= TOUCH_NOISE_THR_MAX, TOUCH_PARAM_CHECK_STR("noise"), ESP_ERR_INVALID_ARG);
|
||||
TOUCH_CHECK(filter_info->noise_neg_thr <= TOUCH_NOISE_NEG_THR_MAX, TOUCH_PARAM_CHECK_STR("noise"), ESP_ERR_INVALID_ARG);
|
||||
TOUCH_CHECK(filter_info->neg_noise_limit <= TOUCH_NEG_NOISE_CNT_LIMIT, TOUCH_PARAM_CHECK_STR("noise_limit"), ESP_ERR_INVALID_ARG);
|
||||
TOUCH_CHECK(filter_info->jitter_step <= TOUCH_JITTER_STEP_MAX, TOUCH_PARAM_CHECK_STR("jitter_step"), ESP_ERR_INVALID_ARG);
|
||||
|
||||
TOUCH_ENTER_CRITICAL();
|
||||
touch_hal_filter_set_config(filter_info);
|
||||
TOUCH_EXIT_CRITICAL();
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_filter_get_config(touch_filter_config_t *filter_info)
|
||||
{
|
||||
TOUCH_ENTER_CRITICAL();
|
||||
touch_hal_filter_get_config(filter_info);
|
||||
TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_filter_enable(void)
|
||||
{
|
||||
TOUCH_ENTER_CRITICAL();
|
||||
touch_hal_filter_enable();
|
||||
TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_filter_disable(void)
|
||||
{
|
||||
TOUCH_ENTER_CRITICAL();
|
||||
touch_hal_filter_disable();
|
||||
TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_denoise_enable(void)
|
||||
{
|
||||
TOUCH_ENTER_CRITICAL();
|
||||
touch_hal_clear_channel_mask(BIT(SOC_TOUCH_DENOISE_CHANNEL));
|
||||
touch_hal_denoise_enable();
|
||||
TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_denoise_disable(void)
|
||||
{
|
||||
TOUCH_ENTER_CRITICAL();
|
||||
touch_hal_denoise_disable();
|
||||
TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_denoise_set_config(touch_pad_denoise_t *denoise)
|
||||
{
|
||||
TOUCH_CHECK(denoise->grade < TOUCH_PAD_DENOISE_MAX, TOUCH_PARAM_CHECK_STR("grade"), ESP_ERR_INVALID_ARG);
|
||||
TOUCH_CHECK(denoise->cap_level < TOUCH_PAD_DENOISE_CAP_MAX, TOUCH_PARAM_CHECK_STR("cap_level"), ESP_ERR_INVALID_ARG);
|
||||
|
||||
const touch_hal_meas_mode_t meas = {
|
||||
.slope = TOUCH_PAD_SLOPE_DEFAULT,
|
||||
.tie_opt = TOUCH_PAD_TIE_OPT_DEFAULT,
|
||||
};
|
||||
TOUCH_ENTER_CRITICAL();
|
||||
touch_hal_set_meas_mode(SOC_TOUCH_DENOISE_CHANNEL, &meas);
|
||||
touch_hal_denoise_set_config(denoise);
|
||||
TOUCH_EXIT_CRITICAL();
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_denoise_get_config(touch_pad_denoise_t *denoise)
|
||||
{
|
||||
TOUCH_ENTER_CRITICAL();
|
||||
touch_hal_denoise_get_config(denoise);
|
||||
TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_denoise_read_data(uint32_t *data)
|
||||
{
|
||||
touch_hal_denoise_read_data(data);
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_waterproof_set_config(touch_pad_waterproof_t *waterproof)
|
||||
{
|
||||
TOUCH_CHECK(waterproof->guard_ring_pad < SOC_TOUCH_SENSOR_NUM, TOUCH_PARAM_CHECK_STR("pad"), ESP_ERR_INVALID_ARG);
|
||||
TOUCH_CHECK(waterproof->shield_driver < TOUCH_PAD_SHIELD_DRV_MAX, TOUCH_PARAM_CHECK_STR("shield_driver"), ESP_ERR_INVALID_ARG);
|
||||
|
||||
TOUCH_ENTER_CRITICAL();
|
||||
touch_hal_waterproof_set_config(waterproof);
|
||||
TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_waterproof_get_config(touch_pad_waterproof_t *waterproof)
|
||||
{
|
||||
TOUCH_ENTER_CRITICAL();
|
||||
touch_hal_waterproof_get_config(waterproof);
|
||||
TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_waterproof_enable(void)
|
||||
{
|
||||
touch_pad_io_init(SOC_TOUCH_SHIELD_CHANNEL);
|
||||
TOUCH_ENTER_CRITICAL();
|
||||
touch_hal_waterproof_enable();
|
||||
TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_waterproof_disable(void)
|
||||
{
|
||||
TOUCH_ENTER_CRITICAL();
|
||||
touch_hal_waterproof_disable();
|
||||
TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_proximity_set_config(touch_pad_proximity_t *proximity)
|
||||
{
|
||||
for (int i=0; i<SOC_TOUCH_PROXIMITY_CHANNEL_NUM; i++) {
|
||||
TOUCH_CHECK(proximity->select_pad[i] < SOC_TOUCH_SENSOR_NUM, TOUCH_PARAM_CHECK_STR("pad"), ESP_ERR_INVALID_ARG);
|
||||
}
|
||||
TOUCH_CHECK(proximity->meas_num <= TOUCH_PROXIMITY_MEAS_NUM_MAX, TOUCH_PARAM_CHECK_STR("meas_num"), ESP_ERR_INVALID_ARG);
|
||||
|
||||
TOUCH_ENTER_CRITICAL();
|
||||
touch_hal_proximity_set_config(proximity);
|
||||
TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_proximity_get_config(touch_pad_proximity_t *proximity)
|
||||
{
|
||||
TOUCH_ENTER_CRITICAL();
|
||||
touch_hal_proximity_get_config(proximity);
|
||||
TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_proximity_read_meas_cnt(touch_pad_t touch_num, uint32_t *cnt)
|
||||
{
|
||||
TOUCH_CHECK(touch_hal_proximity_pad_check(touch_num), "touch_num is not proximity", ESP_ERR_INVALID_ARG);
|
||||
touch_hal_proximity_read_meas_cnt(touch_num, cnt);
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_proximity_data_get(touch_pad_t touch_num, uint32_t *measure_out)
|
||||
{
|
||||
TOUCH_CHECK(touch_hal_proximity_pad_check(touch_num), "touch_num is not proximity", ESP_ERR_INVALID_ARG);
|
||||
touch_hal_filter_read_baseline(touch_num, measure_out);
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
/************** sleep pad setting ***********************/
|
||||
|
||||
esp_err_t touch_pad_sleep_channel_config(touch_pad_sleep_channel_t *slp_config)
|
||||
{
|
||||
TOUCH_CHECK(slp_config->touch_num < SOC_TOUCH_SENSOR_NUM, TOUCH_PARAM_CHECK_STR("pad"), ESP_ERR_INVALID_ARG);
|
||||
|
||||
TOUCH_ENTER_CRITICAL();
|
||||
touch_hal_sleep_channel_config(slp_config);
|
||||
TOUCH_EXIT_CRITICAL();
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_sleep_channel_read_baseline(uint32_t *baseline)
|
||||
{
|
||||
touch_hal_sleep_read_baseline(baseline);
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_sleep_channel_read_debounce(uint32_t *debounce)
|
||||
{
|
||||
touch_hal_sleep_read_debounce(debounce);
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t touch_pad_sleep_channel_read_proximity_cnt(uint32_t *approach_cnt)
|
||||
{
|
||||
touch_hal_sleep_read_proximity_cnt(approach_cnt);
|
||||
return ESP_OK;
|
||||
}
|
||||
Reference in New Issue
Block a user