Skip to content
Merged
Show file tree
Hide file tree
Changes from 23 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
5c2ebf4
feat(touch): Support all touch versions in NG driver
P-R-O-C-H-Y Jul 25, 2025
41287a3
fix(ci): Update touch test
P-R-O-C-H-Y Jul 25, 2025
0a36580
fix(touch): Update example and fix config
P-R-O-C-H-Y Jul 25, 2025
09336ac
fix(touch): Use correct type
P-R-O-C-H-Y Jul 25, 2025
399094d
fix(touch): Remove old driver from cmake
P-R-O-C-H-Y Jul 25, 2025
ec720a8
fix(touch): Update touchSetConfig for S2 and S3
P-R-O-C-H-Y Jul 25, 2025
7143d08
fix(touch): Revert old touch driver for older IDF
P-R-O-C-H-Y Jul 25, 2025
f691a42
fix(touch): Add missing include
P-R-O-C-H-Y Jul 25, 2025
04459fa
fix(touch): Update test and example
P-R-O-C-H-Y Jul 25, 2025
c80c3b7
Merge branch 'master' into feat/touch-ng-all-socs
P-R-O-C-H-Y Aug 25, 2025
79760ba
fix(component): Require touch driver for older SoCs
P-R-O-C-H-Y Aug 25, 2025
942a905
fix(ci): Add delay to isr test
P-R-O-C-H-Y Aug 25, 2025
6e96c1d
ci: Increase log level
P-R-O-C-H-Y Aug 26, 2025
44c5abf
Update pytest.ini
P-R-O-C-H-Y Aug 26, 2025
b9d409f
Update tests_run.sh
P-R-O-C-H-Y Aug 26, 2025
d9a8eaa
Update touch.ino
P-R-O-C-H-Y Aug 26, 2025
523fb52
update
P-R-O-C-H-Y Aug 26, 2025
cd5078b
Update touch.ino
P-R-O-C-H-Y Aug 26, 2025
dad323e
fix(touch): Stop and disable before deleting channel
P-R-O-C-H-Y Aug 26, 2025
70d0a88
ci: Test multiple touch reads
P-R-O-C-H-Y Aug 26, 2025
6b17726
Revert "ci: Test multiple touch reads"
P-R-O-C-H-Y Aug 26, 2025
d1ec9c8
ci: revert pytest ini config
P-R-O-C-H-Y Aug 26, 2025
28904a9
fix(ci): Add verbose debug level to fix test
P-R-O-C-H-Y Aug 27, 2025
0dccd26
fix(touch): Commit copilot suggestions
P-R-O-C-H-Y Aug 27, 2025
6b91048
ci(pre-commit): Apply automatic fixes
pre-commit-ci-lite[bot] Aug 29, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .github/scripts/tests_run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -115,14 +115,14 @@ function run_test {
rm "$sketchdir"/diagram.json 2>/dev/null || true

result=0
printf "\033[95mpytest \"%s/test_%s.py\" --build-dir \"%s\" --junit-xml=\"%s\" -o junit_suite_name=%s_%s_%s_%s%s %s\033[0m\n" "$sketchdir" "$sketchname" "$build_dir" "$report_file" "$test_type" "$platform" "$target" "$sketchname" "$i" "${extra_args[*]@Q}"
bash -c "set +e; pytest \"$sketchdir/test_$sketchname.py\" --build-dir \"$build_dir\" --junit-xml=\"$report_file\" -o junit_suite_name=${test_type}_${platform}_${target}_${sketchname}${i} ${extra_args[*]@Q}; exit \$?" || result=$?
printf "\033[95mpytest -s \"%s/test_%s.py\" --build-dir \"%s\" --junit-xml=\"%s\" -o junit_suite_name=%s_%s_%s_%s%s %s\033[0m\n" "$sketchdir" "$sketchname" "$build_dir" "$report_file" "$test_type" "$platform" "$target" "$sketchname" "$i" "${extra_args[*]@Q}"
bash -c "set +e; pytest -s \"$sketchdir/test_$sketchname.py\" --build-dir \"$build_dir\" --junit-xml=\"$report_file\" -o junit_suite_name=${test_type}_${platform}_${target}_${sketchname}${i} ${extra_args[*]@Q}; exit \$?" || result=$?
printf "\n"
if [ $result -ne 0 ]; then
result=0
printf "\033[95mRetrying test: %s -- Config: %s\033[0m\n" "$sketchname" "$i"
printf "\033[95mpytest \"%s/test_%s.py\" --build-dir \"%s\" --junit-xml=\"%s\" -o junit_suite_name=%s_%s_%s_%s%s %s\033[0m\n" "$sketchdir" "$sketchname" "$build_dir" "$report_file" "$test_type" "$platform" "$target" "$sketchname" "$i" "${extra_args[*]@Q}"
bash -c "set +e; pytest \"$sketchdir/test_$sketchname.py\" --build-dir \"$build_dir\" --junit-xml=\"$report_file\" -o junit_suite_name=${test_type}_${platform}_${target}_${sketchname}${i} ${extra_args[*]@Q}; exit \$?" || result=$?
printf "\033[95mpytest -s \"%s/test_%s.py\" --build-dir \"%s\" --junit-xml=\"%s\" -o junit_suite_name=%s_%s_%s_%s%s %s\033[0m\n" "$sketchdir" "$sketchname" "$build_dir" "$report_file" "$test_type" "$platform" "$target" "$sketchname" "$i" "${extra_args[*]@Q}"
bash -c "set +e; pytest -s \"$sketchdir/test_$sketchname.py\" --build-dir \"$build_dir\" --junit-xml=\"$report_file\" -o junit_suite_name=${test_type}_${platform}_${target}_${sketchname}${i} ${extra_args[*]@Q}; exit \$?" || result=$?
printf "\n"
if [ $result -ne 0 ]; then
printf "\033[91mFailed test: %s -- Config: %s\033[0m\n\n" "$sketchname" "$i"
Expand Down
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -373,7 +373,7 @@ if(NOT CONFIG_ARDUINO_SELECTIVE_COMPILATION OR CONFIG_ARDUINO_SELECTIVE_OpenThre
endif()
endif()

if(IDF_TARGET STREQUAL "esp32p4")
if(IDF_TARGET STREQUAL "esp32" OR IDF_TARGET STREQUAL "esp32s2" OR IDF_TARGET STREQUAL "esp32s3" OR IDF_TARGET STREQUAL "esp32p4")
list(APPEND requires esp_driver_touch_sens)
endif()

Expand Down
149 changes: 123 additions & 26 deletions cores/esp32/esp32-hal-touch-ng.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@
// See the License for the specific language governing permissions and
// limitations under the License.
#include "soc/soc_caps.h"
#include "esp_idf_version.h"

#if SOC_TOUCH_SENSOR_SUPPORTED
#if SOC_TOUCH_SENSOR_VERSION == 3 // ESP32P4 for now
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0) || SOC_TOUCH_SENSOR_VERSION == 3

#include "driver/touch_sens.h"
#include "esp32-hal-touch-ng.h"
#include "esp32-hal-periman.h"

Expand All @@ -37,11 +37,24 @@ typedef struct {
static TouchInterruptHandle_t __touchInterruptHandlers[SOC_TOUCH_SENSOR_NUM] = {
0,
};

static uint8_t _sample_num = 1;
#if SOC_TOUCH_SENSOR_VERSION == 1 // ESP32
static uint8_t _sample_num = 1; // only one sample configuration supported
static float _duration_ms = 5.0f;
static touch_volt_lim_l_t _volt_low = TOUCH_VOLT_LIM_L_0V5;
static touch_volt_lim_h_t _volt_high = TOUCH_VOLT_LIM_H_1V7;
static touch_intr_trig_mode_t _intr_trig_mode = TOUCH_INTR_TRIG_ON_BELOW_THRESH;
#elif SOC_TOUCH_SENSOR_VERSION == 2 // ESP32S2, ESP32S3
static uint8_t _sample_num = 1; // only one sample configuration supported
static uint32_t _chg_times = 500;
static touch_volt_lim_l_t _volt_low = TOUCH_VOLT_LIM_L_0V5;
static touch_volt_lim_h_t _volt_high = TOUCH_VOLT_LIM_H_2V2;
#elif SOC_TOUCH_SENSOR_VERSION == 3 // ESP32P4
static uint8_t _sample_num = 1; // TODO: can be extended to multiple samples
static uint32_t _div_num = 1;
static uint8_t _coarse_freq_tune = 1;
static uint8_t _fine_freq_tune = 1;
#endif

static uint8_t used_pads = 0;

static uint32_t __touchSleepTime = 256;
Expand Down Expand Up @@ -156,15 +169,28 @@ bool touchBenchmarkThreshold(uint8_t pad) {

// Reconfigure passed pad with new threshold
uint32_t benchmark[_sample_num] = {};
#if SOC_TOUCH_SUPPORT_BENCHMARK // ESP32S2, ESP32S3,ESP32P4
if (touch_channel_read_data(touch_channel_handle[pad], TOUCH_CHAN_DATA_TYPE_BENCHMARK, benchmark) != ESP_OK) {
log_e("Touch channel read data failed!");
return false;
}
#else
if (touch_channel_read_data(touch_channel_handle[pad], TOUCH_CHAN_DATA_TYPE_SMOOTH, benchmark) != ESP_OK) {
log_e("Touch channel read data failed!");
return false;
}
#endif

/* Calculate the proper active thresholds regarding the initial benchmark */
touch_channel_config_t chan_cfg = {};
touch_channel_config_t chan_cfg = TOUCH_CHANNEL_DEFAULT_CONFIG();
for (int i = 0; i < _sample_num; i++) {
#if SOC_TOUCH_SENSOR_VERSION == 1 // ESP32
chan_cfg.abs_active_thresh[i] = (uint32_t)(benchmark[i] * (1 - s_thresh2bm_ratio));
log_v("Configured [CH %d] sample %d: benchmark = %"PRIu32", threshold = %"PRIu32"\t", pad, i, benchmark[i], chan_cfg.abs_active_thresh[i]);
#else
chan_cfg.active_thresh[i] = (uint32_t)(benchmark[i] * s_thresh2bm_ratio);
log_v("Configured [CH %d] sample %d: benchmark = %" PRIu32 ", threshold = %" PRIu32 "\t", pad, i, benchmark[i], chan_cfg.active_thresh[i]);
log_v("Configured [CH %d] sample %d: benchmark = %"PRIu32", threshold = %"PRIu32"\t", pad, i, benchmark[i], chan_cfg.active_thresh[i]);
#endif
}
/* Update the channel configuration */
if (touch_sensor_reconfig_channel(touch_channel_handle[pad], &chan_cfg) != ESP_OK) {
Expand All @@ -178,18 +204,22 @@ static bool touchDetachBus(void *pin) {
int8_t pad = digitalPinToTouchChannel((int)(pin - 1));
channels_initialized[pad] = false;
//disable touch pad and delete the channel
touchStop();
touchDisable();
touch_sensor_del_channel(touch_channel_handle[pad]);
used_pads--;
if (used_pads == 0) {
touchStop();
touchDisable();
if (touch_sensor_del_controller(touch_sensor_handle) != ESP_OK) //deinit touch module, as no pads are used
{
log_e("Touch module deinit failed!");
return false;
}
initialized = false;
}
else {
touchEnable();
touchStart();
}
return true;
}

Expand All @@ -198,21 +228,40 @@ static void __touchInit() {
return;
}
// Support only one sample configuration for now
#if SOC_TOUCH_SENSOR_VERSION == 1 // ESP32
touch_sensor_sample_config_t single_sample_cfg = TOUCH_SENSOR_V1_DEFAULT_SAMPLE_CONFIG(_duration_ms, _volt_low, _volt_high);
#elif SOC_TOUCH_SENSOR_VERSION == 2 // ESP32S2, ESP32S3
touch_sensor_sample_config_t single_sample_cfg = TOUCH_SENSOR_V2_DEFAULT_SAMPLE_CONFIG(_chg_times, _volt_low, _volt_high);
#elif SOC_TOUCH_SENSOR_VERSION == 3 // ESP32P4
touch_sensor_sample_config_t single_sample_cfg = TOUCH_SENSOR_V3_DEFAULT_SAMPLE_CONFIG(_div_num, _coarse_freq_tune, _fine_freq_tune);
#endif
touch_sensor_sample_config_t sample_cfg[_sample_num] = {};
sample_cfg[0] = single_sample_cfg;

/* Allocate new touch controller handle */
touch_sensor_config_t sens_cfg = {
#if SOC_TOUCH_SENSOR_VERSION == 1 // ESP32
.power_on_wait_us = __touchSleepTime,
.meas_interval_us = __touchMeasureTime,
.intr_trig_mode = _intr_trig_mode,
.intr_trig_group = TOUCH_INTR_TRIG_GROUP_BOTH,
.sample_cfg_num = _sample_num,
.sample_cfg = sample_cfg,
#elif SOC_TOUCH_SENSOR_VERSION == 2 // ESP32S2, ESP32S3
.power_on_wait_us = __touchSleepTime,
.meas_interval_us = __touchMeasureTime,
.max_meas_time_us = 0,
.sample_cfg_num = _sample_num,
.sample_cfg = sample_cfg,
#elif SOC_TOUCH_SENSOR_VERSION == 3 // ESP32P4
.power_on_wait_us = __touchSleepTime,
.meas_interval_us = __touchMeasureTime,
.max_meas_time_us = 0,
.output_mode = TOUCH_PAD_OUT_AS_CLOCK,
.sample_cfg_num = _sample_num,
.sample_cfg = sample_cfg,
#endif
};

// touch_sensor_config_t sens_cfg = TOUCH_SENSOR_DEFAULT_BASIC_CONFIG(_sample_num, sample_cfg);
if (touch_sensor_new_controller(&sens_cfg, &touch_sensor_handle) != ESP_OK) {
goto err;
}
Expand All @@ -225,14 +274,10 @@ static void __touchInit() {
}

/* Register the touch sensor on_active and on_inactive callbacks */
touch_event_callbacks_t callbacks = {
.on_active = __touchOnActiveISR,
.on_inactive = __touchOnInactiveISR,
.on_measure_done = NULL,
.on_scan_done = NULL,
.on_timeout = NULL,
.on_proximity_meas_done = NULL,
};
touch_event_callbacks_t callbacks = {0};
callbacks.on_active = __touchOnActiveISR;
callbacks.on_inactive = __touchOnInactiveISR;

if (touch_sensor_register_callbacks(touch_sensor_handle, &callbacks, NULL) != ESP_OK) {
goto err;
}
Expand All @@ -253,10 +298,8 @@ static void __touchChannelInit(int pad) {
// Initial setup with default Threshold
__touchInterruptHandlers[pad].fn = NULL;

touch_channel_config_t chan_cfg = {
.active_thresh = {1000} // default threshold, will be updated after benchmark
};

touch_channel_config_t chan_cfg = TOUCH_CHANNEL_DEFAULT_CONFIG();

if (!touchStop() || !touchDisable()) {
log_e("Touch sensor stop and disable failed!");
return;
Expand Down Expand Up @@ -323,8 +366,21 @@ static void __touchConfigInterrupt(uint8_t pin, void (*userFunc)(void), void *Ar
__touchInterruptHandlers[pad].arg = NULL;
} else {
// attach ISR User Call
__touchInit();
__touchChannelInit(pad);
if (perimanGetPinBus(pin, ESP32_BUS_TYPE_TOUCH) == NULL) {
perimanSetBusDeinit(ESP32_BUS_TYPE_TOUCH, touchDetachBus);
if (!perimanClearPinBus(pin)) {
log_e("Failed to clear pin bus");
return;
}
__touchInit();
__touchChannelInit(pad);

if (!perimanSetPinBus(pin, ESP32_BUS_TYPE_TOUCH, (void *)(pin + 1), -1, pad)) {
touchDetachBus((void *)(pin + 1));
log_e("Failed to set bus to Peripheral manager");
return;
}
}
__touchInterruptHandlers[pad].fn = userFunc;
__touchInterruptHandlers[pad].callWithArgs = callWithArgs;
__touchInterruptHandlers[pad].arg = Args;
Expand All @@ -338,7 +394,11 @@ static void __touchConfigInterrupt(uint8_t pin, void (*userFunc)(void), void *Ar

touch_channel_config_t chan_cfg = {};
for (int i = 0; i < _sample_num; i++) {
#if SOC_TOUCH_SENSOR_VERSION == 1 // ESP32
chan_cfg.abs_active_thresh[i] = threshold;
#else
chan_cfg.active_thresh[i] = threshold;
#endif
}

if (touch_sensor_reconfig_channel(touch_channel_handle[pad], &chan_cfg) != ESP_OK) {
Expand Down Expand Up @@ -375,7 +435,6 @@ bool touchInterruptGetLastStatus(uint8_t pin) {
if (pad < 0) {
return false;
}

return __touchInterruptHandlers[pad].lastStatusIsPressed;
}

Expand Down Expand Up @@ -405,9 +464,13 @@ void touchSleepWakeUpEnable(uint8_t pin, touch_value_t threshold) {

touch_sleep_config_t deep_slp_cfg = {
.slp_wakeup_lvl = TOUCH_DEEP_SLEEP_WAKEUP,
#if SOC_TOUCH_SENSOR_VERSION == 1 // ESP32
.deep_slp_sens_cfg = NULL, // Use the original touch sensor configuration
#else // SOC_TOUCH_SENSOR_VERSION 2 and 3// ESP32S2, ESP32S3, ESP32P4
.deep_slp_chan = touch_channel_handle[pad],
.deep_slp_thresh = {threshold},
.deep_slp_sens_cfg = NULL, // Use the original touch sensor configuration
#endif
};

// Register the deep sleep wake-up
Expand All @@ -434,6 +497,29 @@ void touchSetTiming(float measure, uint32_t sleep) {
__touchMeasureTime = measure;
}

#if SOC_TOUCH_SENSOR_VERSION == 1 // ESP32
void touchSetConfig(float duration_ms, touch_volt_lim_l_t volt_low, touch_volt_lim_h_t volt_high) {
if (initialized) {
log_e("Touch sensor already initialized. Cannot set configuration.");
return;
}
_duration_ms = duration_ms;
_volt_low = volt_low;
_volt_high = volt_high;
}

#elif SOC_TOUCH_SENSOR_VERSION == 2 // ESP32S2, ESP32S3
void touchSetConfig(uint32_t chg_times, touch_volt_lim_l_t volt_low, touch_volt_lim_h_t volt_high) {
if (initialized) {
log_e("Touch sensor already initialized. Cannot set configuration.");
return;
}
_chg_times = chg_times;
_volt_low = volt_low;
_volt_high = volt_high;
}

#elif SOC_TOUCH_SENSOR_VERSION == 3 // ESP32P4
void touchSetConfig(uint32_t div_num, uint8_t coarse_freq_tune, uint8_t fine_freq_tune) {
if (initialized) {
log_e("Touch sensor already initialized. Cannot set configuration.");
Expand All @@ -443,11 +529,22 @@ void touchSetConfig(uint32_t div_num, uint8_t coarse_freq_tune, uint8_t fine_fre
_coarse_freq_tune = coarse_freq_tune;
_fine_freq_tune = fine_freq_tune;
}
#endif

#if SOC_TOUCH_SENSOR_VERSION == 1 // ESP32
void touchInterruptSetThresholdDirection(bool mustbeLower) {
if (mustbeLower) {
_intr_trig_mode = TOUCH_INTR_TRIG_ON_BELOW_THRESH;
} else {
_intr_trig_mode = TOUCH_INTR_TRIG_ON_ABOVE_THRESH;
}
}
#endif

extern touch_value_t touchRead(uint8_t) __attribute__((weak, alias("__touchRead")));
extern void touchAttachInterrupt(uint8_t, voidFuncPtr, touch_value_t) __attribute__((weak, alias("__touchAttachInterrupt")));
extern void touchAttachInterruptArg(uint8_t, voidArgFuncPtr, void *, touch_value_t) __attribute__((weak, alias("__touchAttachArgsInterrupt")));
extern void touchDetachInterrupt(uint8_t) __attribute__((weak, alias("__touchDettachInterrupt")));

#endif /* SOC_TOUCH_SENSOR_VERSION == 3 */
#endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0) || SOC_TOUCH_SENSOR_VERSION == 3 */
#endif /* SOC_TOUCH_SENSOR_SUPPORTED */
54 changes: 52 additions & 2 deletions cores/esp32/esp32-hal-touch-ng.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,36 @@
#define MAIN_ESP32_HAL_TOUCH_NEW_H_

#include "soc/soc_caps.h"
#include "esp_idf_version.h"

#if SOC_TOUCH_SENSOR_SUPPORTED
#if SOC_TOUCH_SENSOR_VERSION == 3 // ESP32P4
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0) || SOC_TOUCH_SENSOR_VERSION == 3

#ifdef __cplusplus
extern "C" {
#endif

#include "esp32-hal.h"
#include "driver/touch_sens.h"

#if SOC_TOUCH_SENSOR_VERSION == 1 // ESP32
#define TOUCH_CHANNEL_DEFAULT_CONFIG() { \
.abs_active_thresh = {1000}, \
.charge_speed = TOUCH_CHARGE_SPEED_7, \
.init_charge_volt = TOUCH_INIT_CHARGE_VOLT_DEFAULT, \
.group = TOUCH_CHAN_TRIG_GROUP_BOTH, \
}
#elif SOC_TOUCH_SENSOR_VERSION == 2 // ESP32-S2 & ESP32-S3
#define TOUCH_CHANNEL_DEFAULT_CONFIG() { \
.active_thresh = {2000}, \
.charge_speed = TOUCH_CHARGE_SPEED_7, \
.init_charge_volt = TOUCH_INIT_CHARGE_VOLT_DEFAULT, \
}
#elif SOC_TOUCH_SENSOR_VERSION == 3 // ESP32-P4
#define TOUCH_CHANNEL_DEFAULT_CONFIG() { \
.active_thresh = {1000}, \
}
#endif

typedef uint32_t touch_value_t;

Expand All @@ -40,11 +62,39 @@ typedef uint32_t touch_value_t;
**/
void touchSetTiming(float measure, uint32_t sleep);

#if SOC_TOUCH_SENSOR_VERSION == 1 // ESP32
/*
* @param[in] duration_ms The measurement duration of the touch channel
* @param[in] volt_low The low voltage limit of the touch channel
* @param[in] volt_high The high voltage limit of the touch channel
*/
void touchSetConfig(float duration_ms, touch_volt_lim_l_t volt_low, touch_volt_lim_h_t volt_high);

#elif SOC_TOUCH_SENSOR_VERSION == 2 // ESP32S2, ESP32S3
/*
* @param[in] chg_times The charge times of the touch channel
* @param[in] volt_low The low voltage limit of the touch channel
* @param[in] volt_high The high voltage limit of the touch channel
*/
void touchSetConfig(uint32_t chg_times, touch_volt_lim_l_t volt_low, touch_volt_lim_h_t volt_high);

#elif SOC_TOUCH_SENSOR_VERSION == 3 // ESP32P4
/*
* Tune the touch pad frequency.
* Note: Must be called before setting up touch pads
*/
void touchSetConfig(uint32_t _div_num, uint8_t coarse_freq_tune, uint8_t fine_freq_tune);
#endif

#if SOC_TOUCH_SENSOR_VERSION == 1
/*
* Specific functions to ESP32
* Tells the driver if it shall activate the ISR if the sensor is Lower or Higher than the Threshold
* Default if Lower.
* Note: Must be called before setting up touch pads
**/
void touchInterruptSetThresholdDirection(bool mustbeLower);
#endif

/*
* Read touch pad value.
Expand Down Expand Up @@ -86,6 +136,6 @@ void touchSleepWakeUpEnable(uint8_t pin, touch_value_t threshold);
}
#endif

#endif /* SOC_TOUCH_SENSOR_VERSION == 3 */
#endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0) || SOC_TOUCH_SENSOR_VERSION == 3 */
#endif /* SOC_TOUCH_SENSOR_SUPPORTED */
#endif /* MAIN_ESP32_HAL_TOUCH_H_ */
Loading
Loading