Skip to content

Commit a9faafe

Browse files
committed
Merge branch 'feature/touch_sensor_driver_support_for_esp32s3' into 'master'
driver(touch): support touch sensor for esp32s3 platform Closes IDF-1784 and IDF-3302 See merge request espressif/esp-idf!14102
2 parents 917d6e1 + f4705f8 commit a9faafe

File tree

82 files changed

+1236
-576
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

82 files changed

+1236
-576
lines changed

components/driver/CMakeLists.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,9 @@ if(${target} STREQUAL "esp32s3")
6060
"mcpwm.c"
6161
"usb_serial_jtag.c"
6262
"spi_slave_hd.c"
63-
"touch_sensor_common.c")
63+
"touch_sensor_common.c"
64+
"esp32s3/touch_sensor.c"
65+
)
6466
endif()
6567

6668
if(IDF_TARGET STREQUAL "esp32c3")

components/driver/esp32/touch_sensor.c

Lines changed: 50 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "driver/touch_pad.h"
2222
#include "driver/rtc_cntl.h"
2323
#include "driver/gpio.h"
24+
#include "esp_check.h"
2425

2526
#ifndef NDEBUG
2627
// Enable built-in checks in queue.h in debug builds
@@ -49,13 +50,9 @@ static SemaphoreHandle_t rtc_touch_mux = NULL;
4950
#define TOUCH_PAD_SHIFT_ROUND_DEFAULT (8) // ROUND = 2^(n-1); rounding off for fractional.
5051

5152
static const char *TOUCH_TAG = "TOUCH_SENSOR";
52-
#define TOUCH_CHECK(a, str, ret_val) ({ \
53-
if (!(a)) { \
54-
ESP_LOGE(TOUCH_TAG,"%s(%d): %s", __FUNCTION__, __LINE__, str); \
55-
return (ret_val); \
56-
} \
57-
})
58-
#define TOUCH_CHANNEL_CHECK(channel) TOUCH_CHECK(channel < SOC_TOUCH_SENSOR_NUM, "Touch channel error", ESP_ERR_INVALID_ARG)
53+
54+
#define TOUCH_CHANNEL_CHECK(channel) ESP_RETURN_ON_FALSE(channel < SOC_TOUCH_SENSOR_NUM, ESP_ERR_INVALID_ARG, TOUCH_TAG, "Touch channel error");
55+
#define TOUCH_NULL_POINTER_CHECK(p, name) ESP_RETURN_ON_FALSE((p), ESP_ERR_INVALID_ARG, TOUCH_TAG, "input param '"name"' is NULL")
5956
#define TOUCH_PARAM_CHECK_STR(s) ""s" parameter error"
6057

6158
extern portMUX_TYPE rtc_spinlock; //TODO: Will be placed in the appropriate position after the rtc module is finished.
@@ -72,13 +69,13 @@ static esp_err_t _touch_pad_read(touch_pad_t touch_num, uint16_t *touch_value, t
7269

7370
esp_err_t touch_pad_isr_handler_register(void (*fn)(void *), void *arg, int no_use, intr_handle_t *handle_no_use)
7471
{
75-
TOUCH_CHECK(fn, "Touch_Pad ISR null", ESP_ERR_INVALID_ARG);
72+
ESP_RETURN_ON_FALSE(fn, ESP_ERR_INVALID_ARG, TOUCH_TAG, "Touch_Pad ISR null");
7673
return rtc_isr_register(fn, arg, RTC_CNTL_TOUCH_INT_ST_M);
7774
}
7875

7976
esp_err_t touch_pad_isr_register(intr_handler_t fn, void *arg)
8077
{
81-
TOUCH_CHECK(fn, "Touch_Pad ISR null", ESP_ERR_INVALID_ARG);
78+
ESP_RETURN_ON_FALSE(fn, ESP_ERR_INVALID_ARG, TOUCH_TAG, "Touch_Pad ISR null");
8279
return rtc_isr_register(fn, arg, RTC_CNTL_TOUCH_INT_ST_M);
8380
}
8481

@@ -121,7 +118,7 @@ static void touch_pad_filter_cb(void *arg)
121118
}
122119
xTimerReset(s_touch_pad_filter->timer, portMAX_DELAY);
123120
xSemaphoreGive(rtc_touch_mux);
124-
if (s_filter_cb != NULL) {
121+
if (s_filter_cb) {
125122
//return the raw data and filtered data.
126123
s_filter_cb(s_touch_pad_filter->raw_val, s_touch_pad_filter->filtered_val);
127124
}
@@ -139,6 +136,8 @@ esp_err_t touch_pad_set_meas_time(uint16_t sleep_cycle, uint16_t meas_cycle)
139136

140137
esp_err_t touch_pad_get_meas_time(uint16_t *sleep_cycle, uint16_t *meas_cycle)
141138
{
139+
TOUCH_NULL_POINTER_CHECK(sleep_cycle, "sleep_cycle");
140+
TOUCH_NULL_POINTER_CHECK(meas_cycle, "meas_cycle");
142141
TOUCH_ENTER_CRITICAL();
143142
touch_hal_get_meas_time(meas_cycle);
144143
touch_hal_get_sleep_time(sleep_cycle);
@@ -149,7 +148,7 @@ esp_err_t touch_pad_get_meas_time(uint16_t *sleep_cycle, uint16_t *meas_cycle)
149148

150149
esp_err_t touch_pad_set_trigger_mode(touch_trigger_mode_t mode)
151150
{
152-
TOUCH_CHECK((mode < TOUCH_TRIGGER_MAX), TOUCH_PARAM_CHECK_STR("mode"), ESP_ERR_INVALID_ARG);
151+
ESP_RETURN_ON_FALSE((mode < TOUCH_TRIGGER_MAX), ESP_ERR_INVALID_ARG, TOUCH_TAG, TOUCH_PARAM_CHECK_STR("mode"));
153152
TOUCH_ENTER_CRITICAL();
154153
touch_hal_set_trigger_mode(mode);
155154
TOUCH_EXIT_CRITICAL();
@@ -158,13 +157,14 @@ esp_err_t touch_pad_set_trigger_mode(touch_trigger_mode_t mode)
158157

159158
esp_err_t touch_pad_get_trigger_mode(touch_trigger_mode_t *mode)
160159
{
160+
TOUCH_NULL_POINTER_CHECK(mode, "mode");
161161
touch_hal_get_trigger_mode(mode);
162162
return ESP_OK;
163163
}
164164

165165
esp_err_t touch_pad_set_trigger_source(touch_trigger_src_t src)
166166
{
167-
TOUCH_CHECK((src < TOUCH_TRIGGER_SOURCE_MAX), TOUCH_PARAM_CHECK_STR("src"), ESP_ERR_INVALID_ARG);
167+
ESP_RETURN_ON_FALSE((src < TOUCH_TRIGGER_SOURCE_MAX), ESP_ERR_INVALID_ARG, TOUCH_TAG, TOUCH_PARAM_CHECK_STR("src"));
168168
TOUCH_ENTER_CRITICAL();
169169
touch_hal_set_trigger_source(src);
170170
TOUCH_EXIT_CRITICAL();
@@ -173,15 +173,16 @@ esp_err_t touch_pad_set_trigger_source(touch_trigger_src_t src)
173173

174174
esp_err_t touch_pad_get_trigger_source(touch_trigger_src_t *src)
175175
{
176+
TOUCH_NULL_POINTER_CHECK(src, "src");
176177
touch_hal_get_trigger_source(src);
177178
return ESP_OK;
178179
}
179180

180181
esp_err_t touch_pad_set_group_mask(uint16_t set1_mask, uint16_t set2_mask, uint16_t en_mask)
181182
{
182-
TOUCH_CHECK((set1_mask <= TOUCH_PAD_BIT_MASK_ALL), "touch set1 bitmask error", ESP_ERR_INVALID_ARG);
183-
TOUCH_CHECK((set2_mask <= TOUCH_PAD_BIT_MASK_ALL), "touch set2 bitmask error", ESP_ERR_INVALID_ARG);
184-
TOUCH_CHECK((en_mask <= TOUCH_PAD_BIT_MASK_ALL), "touch work_en bitmask error", ESP_ERR_INVALID_ARG);
183+
ESP_RETURN_ON_FALSE((set1_mask <= TOUCH_PAD_BIT_MASK_ALL), ESP_ERR_INVALID_ARG, TOUCH_TAG, "touch set1 bitmask error");
184+
ESP_RETURN_ON_FALSE((set2_mask <= TOUCH_PAD_BIT_MASK_ALL), ESP_ERR_INVALID_ARG, TOUCH_TAG, "touch set2 bitmask error");
185+
ESP_RETURN_ON_FALSE((en_mask <= TOUCH_PAD_BIT_MASK_ALL), ESP_ERR_INVALID_ARG, TOUCH_TAG, "touch work_en bitmask error");
185186

186187
TOUCH_ENTER_CRITICAL();
187188
touch_hal_set_group_mask(set1_mask, set2_mask);
@@ -193,6 +194,9 @@ esp_err_t touch_pad_set_group_mask(uint16_t set1_mask, uint16_t set2_mask, uint1
193194

194195
esp_err_t touch_pad_get_group_mask(uint16_t *set1_mask, uint16_t *set2_mask, uint16_t *en_mask)
195196
{
197+
TOUCH_NULL_POINTER_CHECK(set1_mask, "set1_mask");
198+
TOUCH_NULL_POINTER_CHECK(set2_mask, "set2_mask");
199+
TOUCH_NULL_POINTER_CHECK(en_mask, "en_mask");
196200
TOUCH_ENTER_CRITICAL();
197201
touch_hal_get_channel_mask(en_mask);
198202
touch_hal_get_group_mask(set1_mask, set2_mask);
@@ -203,9 +207,9 @@ esp_err_t touch_pad_get_group_mask(uint16_t *set1_mask, uint16_t *set2_mask, uin
203207

204208
esp_err_t touch_pad_clear_group_mask(uint16_t set1_mask, uint16_t set2_mask, uint16_t en_mask)
205209
{
206-
TOUCH_CHECK((set1_mask <= TOUCH_PAD_BIT_MASK_ALL), "touch set1 bitmask error", ESP_ERR_INVALID_ARG);
207-
TOUCH_CHECK((set2_mask <= TOUCH_PAD_BIT_MASK_ALL), "touch set2 bitmask error", ESP_ERR_INVALID_ARG);
208-
TOUCH_CHECK((en_mask <= TOUCH_PAD_BIT_MASK_ALL), "touch work_en bitmask error", ESP_ERR_INVALID_ARG);
210+
ESP_RETURN_ON_FALSE((set1_mask <= TOUCH_PAD_BIT_MASK_ALL), ESP_ERR_INVALID_ARG, TOUCH_TAG, "touch set1 bitmask error");
211+
ESP_RETURN_ON_FALSE((set2_mask <= TOUCH_PAD_BIT_MASK_ALL), ESP_ERR_INVALID_ARG, TOUCH_TAG, "touch set2 bitmask error");
212+
ESP_RETURN_ON_FALSE((en_mask <= TOUCH_PAD_BIT_MASK_ALL), ESP_ERR_INVALID_ARG, TOUCH_TAG, "touch work_en bitmask error");
209213

210214
TOUCH_ENTER_CRITICAL();
211215
touch_hal_clear_channel_mask(en_mask);
@@ -245,7 +249,7 @@ bool touch_pad_meas_is_done(void)
245249

246250
esp_err_t touch_pad_config(touch_pad_t touch_num, uint16_t threshold)
247251
{
248-
TOUCH_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_FAIL);
252+
ESP_RETURN_ON_FALSE(rtc_touch_mux, ESP_FAIL, TOUCH_TAG, "Touch pad not initialized");
249253
TOUCH_CHANNEL_CHECK(touch_num);
250254
touch_fsm_mode_t mode;
251255
touch_pad_io_init(touch_num);
@@ -297,8 +301,8 @@ esp_err_t touch_pad_init(void)
297301

298302
esp_err_t touch_pad_deinit(void)
299303
{
300-
TOUCH_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_FAIL);
301-
if (s_touch_pad_filter != NULL) {
304+
ESP_RETURN_ON_FALSE(rtc_touch_mux, ESP_FAIL, TOUCH_TAG, "Touch pad not initialized");
305+
if (s_touch_pad_filter) {
302306
touch_pad_filter_stop();
303307
touch_pad_filter_delete();
304308
}
@@ -337,8 +341,8 @@ static esp_err_t _touch_pad_read(touch_pad_t touch_num, uint16_t *touch_value, t
337341
esp_err_t touch_pad_read(touch_pad_t touch_num, uint16_t *touch_value)
338342
{
339343
TOUCH_CHANNEL_CHECK(touch_num);
340-
TOUCH_CHECK(touch_value != NULL, "touch_value", ESP_ERR_INVALID_ARG);
341-
TOUCH_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_FAIL);
344+
TOUCH_NULL_POINTER_CHECK(touch_value, "touch_value");
345+
ESP_RETURN_ON_FALSE(rtc_touch_mux, ESP_FAIL, TOUCH_TAG, "Touch pad not initialized");
342346

343347
esp_err_t res = ESP_OK;
344348
touch_fsm_mode_t mode;
@@ -351,10 +355,10 @@ esp_err_t touch_pad_read(touch_pad_t touch_num, uint16_t *touch_value)
351355

352356
IRAM_ATTR esp_err_t touch_pad_read_raw_data(touch_pad_t touch_num, uint16_t *touch_value)
353357
{
354-
TOUCH_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_FAIL);
358+
ESP_RETURN_ON_FALSE(rtc_touch_mux, ESP_FAIL, TOUCH_TAG, "Touch pad not initialized");
355359
TOUCH_CHANNEL_CHECK(touch_num);
356-
TOUCH_CHECK(touch_value != NULL, "touch_value", ESP_ERR_INVALID_ARG);
357-
TOUCH_CHECK(s_touch_pad_filter != NULL, "Touch pad filter not initialized", ESP_FAIL);
360+
TOUCH_NULL_POINTER_CHECK(touch_value, "touch_value");
361+
ESP_RETURN_ON_FALSE(s_touch_pad_filter, ESP_FAIL, TOUCH_TAG, "Touch pad filter not initialized");
358362
*touch_value = s_touch_pad_filter->raw_val[touch_num];
359363
if (*touch_value == 0) {
360364
return ESP_ERR_INVALID_STATE;
@@ -364,10 +368,10 @@ IRAM_ATTR esp_err_t touch_pad_read_raw_data(touch_pad_t touch_num, uint16_t *tou
364368

365369
IRAM_ATTR esp_err_t touch_pad_read_filtered(touch_pad_t touch_num, uint16_t *touch_value)
366370
{
367-
TOUCH_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_FAIL);
371+
ESP_RETURN_ON_FALSE(rtc_touch_mux, ESP_FAIL, TOUCH_TAG, "Touch pad not initialized");
368372
TOUCH_CHANNEL_CHECK(touch_num);
369-
TOUCH_CHECK(touch_value != NULL, "touch_value", ESP_ERR_INVALID_ARG);
370-
TOUCH_CHECK(s_touch_pad_filter != NULL, "Touch pad filter not initialized", ESP_FAIL);
373+
TOUCH_NULL_POINTER_CHECK(touch_value, "touch_value");
374+
ESP_RETURN_ON_FALSE(s_touch_pad_filter, ESP_FAIL, TOUCH_TAG, "Touch pad filter not initialized");
371375
*touch_value = (s_touch_pad_filter->filtered_val[touch_num]);
372376
if (*touch_value == 0) {
373377
return ESP_ERR_INVALID_STATE;
@@ -377,13 +381,13 @@ IRAM_ATTR esp_err_t touch_pad_read_filtered(touch_pad_t touch_num, uint16_t *tou
377381

378382
esp_err_t touch_pad_set_filter_period(uint32_t new_period_ms)
379383
{
380-
TOUCH_CHECK(s_touch_pad_filter != NULL, "Touch pad filter not initialized", ESP_ERR_INVALID_STATE);
381-
TOUCH_CHECK(new_period_ms > 0, "Touch pad filter period error", ESP_ERR_INVALID_ARG);
382-
TOUCH_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_ERR_INVALID_STATE);
384+
ESP_RETURN_ON_FALSE(s_touch_pad_filter, ESP_ERR_INVALID_STATE, TOUCH_TAG, "Touch pad filter not initialized");
385+
ESP_RETURN_ON_FALSE(new_period_ms > 0, ESP_ERR_INVALID_ARG, TOUCH_TAG, "Touch pad filter period error");
386+
ESP_RETURN_ON_FALSE(rtc_touch_mux, ESP_ERR_INVALID_STATE, TOUCH_TAG, "Touch pad not initialized");
383387

384388
esp_err_t ret = ESP_OK;
385389
xSemaphoreTake(rtc_touch_mux, portMAX_DELAY);
386-
if (s_touch_pad_filter != NULL) {
390+
if (s_touch_pad_filter) {
387391
xTimerChangePeriod(s_touch_pad_filter->timer, new_period_ms / portTICK_PERIOD_MS, portMAX_DELAY);
388392
s_touch_pad_filter->period = new_period_ms;
389393
} else {
@@ -396,13 +400,13 @@ esp_err_t touch_pad_set_filter_period(uint32_t new_period_ms)
396400

397401
esp_err_t touch_pad_get_filter_period(uint32_t *p_period_ms)
398402
{
399-
TOUCH_CHECK(s_touch_pad_filter != NULL, "Touch pad filter not initialized", ESP_ERR_INVALID_STATE);
400-
TOUCH_CHECK(p_period_ms != NULL, "Touch pad period pointer error", ESP_ERR_INVALID_ARG);
401-
TOUCH_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_ERR_INVALID_STATE);
403+
ESP_RETURN_ON_FALSE(s_touch_pad_filter, ESP_ERR_INVALID_STATE, TOUCH_TAG, "Touch pad filter not initialized");
404+
TOUCH_NULL_POINTER_CHECK(p_period_ms, "p_period_ms");
405+
ESP_RETURN_ON_FALSE(rtc_touch_mux, ESP_ERR_INVALID_STATE, TOUCH_TAG, "Touch pad not initialized");
402406

403407
esp_err_t ret = ESP_OK;
404408
xSemaphoreTake(rtc_touch_mux, portMAX_DELAY);
405-
if (s_touch_pad_filter != NULL) {
409+
if (s_touch_pad_filter) {
406410
*p_period_ms = s_touch_pad_filter->period;
407411
} else {
408412
ESP_LOGE(TOUCH_TAG, "Touch pad filter deleted");
@@ -414,8 +418,8 @@ esp_err_t touch_pad_get_filter_period(uint32_t *p_period_ms)
414418

415419
esp_err_t touch_pad_filter_start(uint32_t filter_period_ms)
416420
{
417-
TOUCH_CHECK(filter_period_ms >= portTICK_PERIOD_MS, "Touch pad filter period error", ESP_ERR_INVALID_ARG);
418-
TOUCH_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_ERR_INVALID_STATE);
421+
ESP_RETURN_ON_FALSE(filter_period_ms >= portTICK_PERIOD_MS, ESP_ERR_INVALID_ARG, TOUCH_TAG, "Touch pad filter period error");
422+
ESP_RETURN_ON_FALSE(rtc_touch_mux, ESP_ERR_INVALID_STATE, TOUCH_TAG, "Touch pad not initialized");
419423

420424
xSemaphoreTake(rtc_touch_mux, portMAX_DELAY);
421425
if (s_touch_pad_filter == NULL) {
@@ -445,11 +449,11 @@ esp_err_t touch_pad_filter_start(uint32_t filter_period_ms)
445449

446450
esp_err_t touch_pad_filter_stop(void)
447451
{
448-
TOUCH_CHECK(s_touch_pad_filter != NULL, "Touch pad filter not initialized", ESP_ERR_INVALID_STATE);
449-
TOUCH_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_ERR_INVALID_STATE);
452+
ESP_RETURN_ON_FALSE(s_touch_pad_filter, ESP_ERR_INVALID_STATE, TOUCH_TAG, "Touch pad filter not initialized");
453+
ESP_RETURN_ON_FALSE(rtc_touch_mux, ESP_ERR_INVALID_STATE, TOUCH_TAG, "Touch pad not initialized");
450454
esp_err_t ret = ESP_OK;
451455
xSemaphoreTake(rtc_touch_mux, portMAX_DELAY);
452-
if (s_touch_pad_filter != NULL) {
456+
if (s_touch_pad_filter) {
453457
xTimerStop(s_touch_pad_filter->timer, portMAX_DELAY);
454458
} else {
455459
ESP_LOGE(TOUCH_TAG, "Touch pad filter deleted");
@@ -461,11 +465,11 @@ esp_err_t touch_pad_filter_stop(void)
461465

462466
esp_err_t touch_pad_filter_delete(void)
463467
{
464-
TOUCH_CHECK(s_touch_pad_filter != NULL, "Touch pad filter not initialized", ESP_ERR_INVALID_STATE);
465-
TOUCH_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_ERR_INVALID_STATE);
468+
ESP_RETURN_ON_FALSE(s_touch_pad_filter, ESP_ERR_INVALID_STATE, TOUCH_TAG, "Touch pad filter not initialized");
469+
ESP_RETURN_ON_FALSE(rtc_touch_mux, ESP_ERR_INVALID_STATE, TOUCH_TAG, "Touch pad not initialized");
466470
xSemaphoreTake(rtc_touch_mux, portMAX_DELAY);
467-
if (s_touch_pad_filter != NULL) {
468-
if (s_touch_pad_filter->timer != NULL) {
471+
if (s_touch_pad_filter) {
472+
if (s_touch_pad_filter->timer) {
469473
xTimerStop(s_touch_pad_filter->timer, portMAX_DELAY);
470474
xTimerDelete(s_touch_pad_filter->timer, portMAX_DELAY);
471475
s_touch_pad_filter->timer = NULL;

components/driver/esp32s2/include/driver/touch_sensor.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ esp_err_t touch_pad_reset_benchmark(touch_pad_t touch_num);
293293
* @return
294294
* - ESP_OK Success
295295
*/
296-
esp_err_t touch_pad_filter_set_config(touch_filter_config_t *filter_info);
296+
esp_err_t touch_pad_filter_set_config(const touch_filter_config_t *filter_info);
297297

298298
/**
299299
* @brief get parameter of touch sensor filter and detection algorithm.
@@ -331,7 +331,7 @@ esp_err_t touch_pad_filter_disable(void);
331331
* @return
332332
* - ESP_OK Success
333333
*/
334-
esp_err_t touch_pad_denoise_set_config(touch_pad_denoise_t *denoise);
334+
esp_err_t touch_pad_denoise_set_config(const touch_pad_denoise_t *denoise);
335335

336336
/**
337337
* @brief get parameter of denoise pad (TOUCH_PAD_NUM0).
@@ -380,7 +380,7 @@ esp_err_t touch_pad_denoise_read_data(uint32_t *data);
380380
* @return
381381
* - ESP_OK Success
382382
*/
383-
esp_err_t touch_pad_waterproof_set_config(touch_pad_waterproof_t *waterproof);
383+
esp_err_t touch_pad_waterproof_set_config(const touch_pad_waterproof_t *waterproof);
384384

385385
/**
386386
* @brief get parameter of waterproof function.

0 commit comments

Comments
 (0)