rtc_module.c 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834
  1. // Copyright 2016-2018 Espressif Systems (Shanghai) PTE LTD
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #include <esp_types.h>
  15. #include <stdlib.h>
  16. #include <ctype.h>
  17. #include "esp_log.h"
  18. #include "soc/rtc_periph.h"
  19. #include "soc/sens_periph.h"
  20. #include "soc/syscon_periph.h"
  21. #include "soc/rtc.h"
  22. #include "soc/periph_defs.h"
  23. #include "rtc_io.h"
  24. #include "touch_pad.h"
  25. #include "adc.h"
  26. #include "dac.h"
  27. #include "freertos/FreeRTOS.h"
  28. #include "freertos/xtensa_api.h"
  29. #include "freertos/semphr.h"
  30. #include "freertos/timers.h"
  31. #include "esp_intr_alloc.h"
  32. #include "sys/lock.h"
  33. #include "driver/rtc_cntl.h"
  34. #include "driver/gpio.h"
  35. #include "driver/rtc_io.h"
  36. #include "adc1_i2s_private.h"
  37. #include "sdkconfig.h"
  38. #if CONFIG_IDF_TARGET_ESP32
  39. #include "esp32/rom/ets_sys.h"
  40. #elif CONFIG_IDF_TARGET_ESP32S2BETA
  41. #include "esp32s2beta/rom/ets_sys.h"
  42. #endif
  43. #ifndef NDEBUG
  44. // Enable built-in checks in queue.h in debug builds
  45. #define INVARIANTS
  46. #endif
  47. #include "sys/queue.h"
  48. #define TOUCH_PAD_FILTER_FACTOR_DEFAULT (4) // IIR filter coefficient.
  49. #define TOUCH_PAD_SHIFT_DEFAULT (4) // Increase computing accuracy.
  50. #define TOUCH_PAD_SHIFT_ROUND_DEFAULT (8) // ROUND = 2^(n-1); rounding off for fractional.
  51. portMUX_TYPE rtc_spinlock = portMUX_INITIALIZER_UNLOCKED;
  52. #if CONFIG_IDF_TARGET_ESP32
  53. static SemaphoreHandle_t rtc_touch_mux = NULL;
  54. #endif
  55. #if CONFIG_IDF_TARGET_ESP32
  56. typedef struct {
  57. TimerHandle_t timer;
  58. uint16_t filtered_val[TOUCH_PAD_MAX];
  59. uint16_t raw_val[TOUCH_PAD_MAX];
  60. uint32_t filter_period;
  61. uint32_t period;
  62. bool enable;
  63. } touch_pad_filter_t;
  64. static touch_pad_filter_t *s_touch_pad_filter = NULL;
  65. // check if touch pad be inited.
  66. static uint16_t s_touch_pad_init_bit = 0x0000;
  67. static filter_cb_t s_filter_cb = NULL;
  68. #endif
  69. #if CONFIG_IDF_TARGET_ESP32
  70. static const char *RTC_MODULE_TAG = "RTC_MODULE";
  71. #define RTC_MODULE_CHECK(a, str, ret_val) if (!(a)) { \
  72. ESP_LOGE(RTC_MODULE_TAG,"%s:%d (%s):%s", __FILE__, __LINE__, __FUNCTION__, str); \
  73. return (ret_val); \
  74. }
  75. #define RTC_RES_CHECK(res, ret_val) if ( (a) != ESP_OK) { \
  76. ESP_LOGE(RTC_MODULE_TAG,"%s:%d (%s)", __FILE__, __LINE__, __FUNCTION__); \
  77. return (ret_val); \
  78. }
  79. /*---------------------------------------------------------------
  80. Touch Pad
  81. ---------------------------------------------------------------*/
  82. //Some register bits of touch sensor 8 and 9 are mismatched, we need to swap the bits.
  83. #define BITSWAP(data, n, m) (((data >> n) & 0x1) == ((data >> m) & 0x1) ? (data) : ((data) ^ ((0x1 <<n) | (0x1 << m))))
  84. #define TOUCH_BITS_SWAP(v) BITSWAP(v, TOUCH_PAD_NUM8, TOUCH_PAD_NUM9)
  85. static esp_err_t _touch_pad_read(touch_pad_t touch_num, uint16_t *touch_value, touch_fsm_mode_t mode);
  86. //Some registers of touch sensor 8 and 9 are mismatched, we need to swap register index
  87. inline static touch_pad_t touch_pad_num_wrap(touch_pad_t touch_num)
  88. {
  89. if (touch_num == TOUCH_PAD_NUM8) {
  90. return TOUCH_PAD_NUM9;
  91. } else if (touch_num == TOUCH_PAD_NUM9) {
  92. return TOUCH_PAD_NUM8;
  93. }
  94. return touch_num;
  95. }
  96. esp_err_t touch_pad_isr_handler_register(void (*fn)(void *), void *arg, int no_use, intr_handle_t *handle_no_use)
  97. {
  98. RTC_MODULE_CHECK(fn, "Touch_Pad ISR null", ESP_ERR_INVALID_ARG);
  99. #if CONFIG_IDF_TARGET_ESP32
  100. return rtc_isr_register(fn, arg, RTC_CNTL_TOUCH_INT_ST_M);
  101. #else
  102. return ESP_FAIL;
  103. #endif
  104. }
  105. esp_err_t touch_pad_isr_register(intr_handler_t fn, void* arg)
  106. {
  107. RTC_MODULE_CHECK(fn, "Touch_Pad ISR null", ESP_ERR_INVALID_ARG);
  108. #if CONFIG_IDF_TARGET_ESP32
  109. return rtc_isr_register(fn, arg, RTC_CNTL_TOUCH_INT_ST_M);
  110. #else
  111. return ESP_FAIL;
  112. #endif
  113. }
  114. esp_err_t touch_pad_isr_deregister(intr_handler_t fn, void *arg)
  115. {
  116. return rtc_isr_deregister(fn, arg);
  117. }
  118. static esp_err_t touch_pad_get_io_num(touch_pad_t touch_num, gpio_num_t *gpio_num)
  119. {
  120. switch (touch_num) {
  121. case TOUCH_PAD_NUM0:
  122. *gpio_num = TOUCH_PAD_NUM0_GPIO_NUM;
  123. break;
  124. case TOUCH_PAD_NUM1:
  125. *gpio_num = TOUCH_PAD_NUM1_GPIO_NUM;
  126. break;
  127. case TOUCH_PAD_NUM2:
  128. *gpio_num = TOUCH_PAD_NUM2_GPIO_NUM;
  129. break;
  130. case TOUCH_PAD_NUM3:
  131. *gpio_num = TOUCH_PAD_NUM3_GPIO_NUM;
  132. break;
  133. case TOUCH_PAD_NUM4:
  134. *gpio_num = TOUCH_PAD_NUM4_GPIO_NUM;
  135. break;
  136. case TOUCH_PAD_NUM5:
  137. *gpio_num = TOUCH_PAD_NUM5_GPIO_NUM;
  138. break;
  139. case TOUCH_PAD_NUM6:
  140. *gpio_num = TOUCH_PAD_NUM6_GPIO_NUM;
  141. break;
  142. case TOUCH_PAD_NUM7:
  143. *gpio_num = TOUCH_PAD_NUM7_GPIO_NUM;
  144. break;
  145. case TOUCH_PAD_NUM8:
  146. *gpio_num = TOUCH_PAD_NUM8_GPIO_NUM;
  147. break;
  148. case TOUCH_PAD_NUM9:
  149. *gpio_num = TOUCH_PAD_NUM9_GPIO_NUM;
  150. break;
  151. default:
  152. return ESP_ERR_INVALID_ARG;
  153. }
  154. return ESP_OK;
  155. }
  156. static uint32_t _touch_filter_iir(uint32_t in_now, uint32_t out_last, uint32_t k)
  157. {
  158. if (k == 0) {
  159. return in_now;
  160. } else {
  161. uint32_t out_now = (in_now + (k - 1) * out_last) / k;
  162. return out_now;
  163. }
  164. }
  165. esp_err_t touch_pad_set_filter_read_cb(filter_cb_t read_cb)
  166. {
  167. s_filter_cb = read_cb;
  168. return ESP_OK;
  169. }
  170. static void touch_pad_filter_cb(void *arg)
  171. {
  172. static uint32_t s_filtered_temp[TOUCH_PAD_MAX] = {0};
  173. if (s_touch_pad_filter == NULL || rtc_touch_mux == NULL) {
  174. return;
  175. }
  176. uint16_t val = 0;
  177. touch_fsm_mode_t mode;
  178. xSemaphoreTake(rtc_touch_mux, portMAX_DELAY);
  179. touch_pad_get_fsm_mode(&mode);
  180. for (int i = 0; i < TOUCH_PAD_MAX; i++) {
  181. if ((s_touch_pad_init_bit >> i) & 0x1) {
  182. _touch_pad_read(i, &val, mode);
  183. s_touch_pad_filter->raw_val[i] = val;
  184. s_filtered_temp[i] = s_filtered_temp[i] == 0 ? ((uint32_t)val << TOUCH_PAD_SHIFT_DEFAULT) : s_filtered_temp[i];
  185. s_filtered_temp[i] = _touch_filter_iir((val << TOUCH_PAD_SHIFT_DEFAULT),
  186. s_filtered_temp[i], TOUCH_PAD_FILTER_FACTOR_DEFAULT);
  187. s_touch_pad_filter->filtered_val[i] = (s_filtered_temp[i] + TOUCH_PAD_SHIFT_ROUND_DEFAULT) >> TOUCH_PAD_SHIFT_DEFAULT;
  188. }
  189. }
  190. xTimerReset(s_touch_pad_filter->timer, portMAX_DELAY);
  191. xSemaphoreGive(rtc_touch_mux);
  192. if(s_filter_cb != NULL) {
  193. //return the raw data and filtered data.
  194. s_filter_cb(s_touch_pad_filter->raw_val, s_touch_pad_filter->filtered_val);
  195. }
  196. }
  197. esp_err_t touch_pad_set_meas_time(uint16_t sleep_cycle, uint16_t meas_cycle)
  198. {
  199. xSemaphoreTake(rtc_touch_mux, portMAX_DELAY);
  200. portENTER_CRITICAL(&rtc_spinlock);
  201. //touch sensor sleep cycle Time = sleep_cycle / RTC_SLOW_CLK( can be 150k or 32k depending on the options)
  202. SENS.sar_touch_ctrl2.touch_sleep_cycles = sleep_cycle;
  203. //touch sensor measure time= meas_cycle / 8Mhz
  204. SENS.sar_touch_ctrl1.touch_meas_delay = meas_cycle;
  205. //the waiting cycles (in 8MHz) between TOUCH_START and TOUCH_XPD
  206. SENS.sar_touch_ctrl1.touch_xpd_wait = TOUCH_PAD_MEASURE_WAIT_DEFAULT;
  207. portEXIT_CRITICAL(&rtc_spinlock);
  208. xSemaphoreGive(rtc_touch_mux);
  209. return ESP_OK;
  210. }
  211. esp_err_t touch_pad_get_meas_time(uint16_t *sleep_cycle, uint16_t *meas_cycle)
  212. {
  213. portENTER_CRITICAL(&rtc_spinlock);
  214. if (sleep_cycle) {
  215. *sleep_cycle = SENS.sar_touch_ctrl2.touch_sleep_cycles;
  216. }
  217. if (meas_cycle) {
  218. *meas_cycle = SENS.sar_touch_ctrl1.touch_meas_delay;
  219. }
  220. portEXIT_CRITICAL(&rtc_spinlock);
  221. return ESP_OK;
  222. }
  223. esp_err_t touch_pad_set_voltage(touch_high_volt_t refh, touch_low_volt_t refl, touch_volt_atten_t atten)
  224. {
  225. RTC_MODULE_CHECK(((refh < TOUCH_HVOLT_MAX) && (refh >= (int )TOUCH_HVOLT_KEEP)), "touch refh error",
  226. ESP_ERR_INVALID_ARG);
  227. RTC_MODULE_CHECK(((refl < TOUCH_LVOLT_MAX) && (refh >= (int )TOUCH_LVOLT_KEEP)), "touch refl error",
  228. ESP_ERR_INVALID_ARG);
  229. RTC_MODULE_CHECK(((atten < TOUCH_HVOLT_ATTEN_MAX) && (refh >= (int )TOUCH_HVOLT_ATTEN_KEEP)), "touch atten error",
  230. ESP_ERR_INVALID_ARG);
  231. #if CONFIG_IDF_TARGET_ESP32
  232. portENTER_CRITICAL(&rtc_spinlock);
  233. if (refh > TOUCH_HVOLT_KEEP) {
  234. RTCIO.touch_cfg.drefh = refh;
  235. }
  236. if (refl > TOUCH_LVOLT_KEEP) {
  237. RTCIO.touch_cfg.drefl = refl;
  238. }
  239. if (atten > TOUCH_HVOLT_ATTEN_KEEP) {
  240. RTCIO.touch_cfg.drange = atten;
  241. }
  242. portEXIT_CRITICAL(&rtc_spinlock);
  243. #endif
  244. return ESP_OK;
  245. }
  246. esp_err_t touch_pad_get_voltage(touch_high_volt_t *refh, touch_low_volt_t *refl, touch_volt_atten_t *atten)
  247. {
  248. #if CONFIG_IDF_TARGET_ESP32
  249. portENTER_CRITICAL(&rtc_spinlock);
  250. if (refh) {
  251. *refh = RTCIO.touch_cfg.drefh;
  252. }
  253. if (refl) {
  254. *refl = RTCIO.touch_cfg.drefl;
  255. }
  256. if (atten) {
  257. *atten = RTCIO.touch_cfg.drange;
  258. }
  259. portEXIT_CRITICAL(&rtc_spinlock);
  260. #endif
  261. return ESP_OK;
  262. }
  263. esp_err_t touch_pad_set_cnt_mode(touch_pad_t touch_num, touch_cnt_slope_t slope, touch_tie_opt_t opt)
  264. {
  265. RTC_MODULE_CHECK((slope < TOUCH_PAD_SLOPE_MAX), "touch slope error", ESP_ERR_INVALID_ARG);
  266. RTC_MODULE_CHECK((opt < TOUCH_PAD_TIE_OPT_MAX), "touch opt error", ESP_ERR_INVALID_ARG);
  267. touch_pad_t touch_pad_wrap = touch_pad_num_wrap(touch_num);
  268. portENTER_CRITICAL(&rtc_spinlock);
  269. RTCIO.touch_pad[touch_pad_wrap].tie_opt = opt;
  270. RTCIO.touch_pad[touch_num].dac = slope;
  271. portEXIT_CRITICAL(&rtc_spinlock);
  272. return ESP_OK;
  273. }
  274. esp_err_t touch_pad_get_cnt_mode(touch_pad_t touch_num, touch_cnt_slope_t *slope, touch_tie_opt_t *opt)
  275. {
  276. RTC_MODULE_CHECK((touch_num < TOUCH_PAD_MAX), "touch IO error", ESP_ERR_INVALID_ARG);
  277. touch_pad_t touch_pad_wrap = touch_pad_num_wrap(touch_num);
  278. portENTER_CRITICAL(&rtc_spinlock);
  279. if(opt) {
  280. *opt = RTCIO.touch_pad[touch_pad_wrap].tie_opt;
  281. }
  282. if(slope) {
  283. *slope = RTCIO.touch_pad[touch_num].dac;
  284. }
  285. portEXIT_CRITICAL(&rtc_spinlock);
  286. return ESP_OK;
  287. }
  288. esp_err_t touch_pad_io_init(touch_pad_t touch_num)
  289. {
  290. RTC_MODULE_CHECK((touch_num < TOUCH_PAD_MAX), "touch IO error", ESP_ERR_INVALID_ARG);
  291. gpio_num_t gpio_num = GPIO_NUM_0;
  292. touch_pad_get_io_num(touch_num, &gpio_num);
  293. rtc_gpio_init(gpio_num);
  294. rtc_gpio_set_direction(gpio_num, RTC_GPIO_MODE_DISABLED);
  295. rtc_gpio_pulldown_dis(gpio_num);
  296. rtc_gpio_pullup_dis(gpio_num);
  297. return ESP_OK;
  298. }
  299. esp_err_t touch_pad_set_fsm_mode(touch_fsm_mode_t mode)
  300. {
  301. RTC_MODULE_CHECK((mode < TOUCH_FSM_MODE_MAX), "touch fsm mode error", ESP_ERR_INVALID_ARG);
  302. portENTER_CRITICAL(&rtc_spinlock);
  303. SENS.sar_touch_ctrl2.touch_start_en = 0;
  304. SENS.sar_touch_ctrl2.touch_start_force = mode;
  305. RTCCNTL.state0.touch_slp_timer_en = (mode == TOUCH_FSM_MODE_TIMER ? 1 : 0);
  306. portEXIT_CRITICAL(&rtc_spinlock);
  307. return ESP_OK;
  308. }
  309. esp_err_t touch_pad_get_fsm_mode(touch_fsm_mode_t *mode)
  310. {
  311. if (mode) {
  312. *mode = SENS.sar_touch_ctrl2.touch_start_force;
  313. }
  314. return ESP_OK;
  315. }
  316. esp_err_t touch_pad_sw_start(void)
  317. {
  318. portENTER_CRITICAL(&rtc_spinlock);
  319. SENS.sar_touch_ctrl2.touch_start_en = 0;
  320. SENS.sar_touch_ctrl2.touch_start_en = 1;
  321. portEXIT_CRITICAL(&rtc_spinlock);
  322. return ESP_OK;
  323. }
  324. esp_err_t touch_pad_set_thresh(touch_pad_t touch_num, uint16_t threshold)
  325. {
  326. RTC_MODULE_CHECK((touch_num < TOUCH_PAD_MAX), "touch IO error", ESP_ERR_INVALID_ARG);
  327. touch_pad_t tp_wrap = touch_pad_num_wrap(touch_num);
  328. portENTER_CRITICAL(&rtc_spinlock);
  329. if (tp_wrap & 0x1) {
  330. SENS.touch_thresh[tp_wrap / 2].l_thresh = threshold;
  331. } else {
  332. SENS.touch_thresh[tp_wrap / 2].h_thresh = threshold;
  333. }
  334. portEXIT_CRITICAL(&rtc_spinlock);
  335. return ESP_OK;
  336. }
  337. esp_err_t touch_pad_get_thresh(touch_pad_t touch_num, uint16_t *threshold)
  338. {
  339. RTC_MODULE_CHECK((touch_num < TOUCH_PAD_MAX), "touch IO error", ESP_ERR_INVALID_ARG);
  340. touch_pad_t tp_wrap = touch_pad_num_wrap(touch_num);
  341. if (threshold) {
  342. *threshold = (tp_wrap & 0x1 )? \
  343. SENS.touch_thresh[tp_wrap / 2].l_thresh : \
  344. SENS.touch_thresh[tp_wrap / 2].h_thresh;
  345. }
  346. return ESP_OK;
  347. }
  348. esp_err_t touch_pad_set_trigger_mode(touch_trigger_mode_t mode)
  349. {
  350. RTC_MODULE_CHECK((mode < TOUCH_TRIGGER_MAX), "touch trigger mode error", ESP_ERR_INVALID_ARG);
  351. portENTER_CRITICAL(&rtc_spinlock);
  352. SENS.sar_touch_ctrl1.touch_out_sel = mode;
  353. portEXIT_CRITICAL(&rtc_spinlock);
  354. return ESP_OK;
  355. }
  356. esp_err_t touch_pad_get_trigger_mode(touch_trigger_mode_t *mode)
  357. {
  358. if (mode) {
  359. *mode = SENS.sar_touch_ctrl1.touch_out_sel;
  360. }
  361. return ESP_OK;
  362. }
  363. esp_err_t touch_pad_set_trigger_source(touch_trigger_src_t src)
  364. {
  365. RTC_MODULE_CHECK((src < TOUCH_TRIGGER_SOURCE_MAX), "touch trigger source error", ESP_ERR_INVALID_ARG);
  366. portENTER_CRITICAL(&rtc_spinlock);
  367. SENS.sar_touch_ctrl1.touch_out_1en = src;
  368. portEXIT_CRITICAL(&rtc_spinlock);
  369. return ESP_OK;
  370. }
  371. esp_err_t touch_pad_get_trigger_source(touch_trigger_src_t *src)
  372. {
  373. if (src) {
  374. *src = SENS.sar_touch_ctrl1.touch_out_1en;
  375. }
  376. return ESP_OK;
  377. }
  378. esp_err_t touch_pad_set_group_mask(uint16_t set1_mask, uint16_t set2_mask, uint16_t en_mask)
  379. {
  380. RTC_MODULE_CHECK((set1_mask <= TOUCH_PAD_BIT_MASK_MAX), "touch set1 bitmask error", ESP_ERR_INVALID_ARG);
  381. RTC_MODULE_CHECK((set2_mask <= TOUCH_PAD_BIT_MASK_MAX), "touch set2 bitmask error", ESP_ERR_INVALID_ARG);
  382. RTC_MODULE_CHECK((en_mask <= TOUCH_PAD_BIT_MASK_MAX), "touch work_en bitmask error", ESP_ERR_INVALID_ARG);
  383. portENTER_CRITICAL(&rtc_spinlock);
  384. SENS.sar_touch_enable.touch_pad_outen1 |= TOUCH_BITS_SWAP(set1_mask);
  385. SENS.sar_touch_enable.touch_pad_outen2 |= TOUCH_BITS_SWAP(set2_mask);
  386. SENS.sar_touch_enable.touch_pad_worken |= TOUCH_BITS_SWAP(en_mask);
  387. portEXIT_CRITICAL(&rtc_spinlock);
  388. return ESP_OK;
  389. }
  390. esp_err_t touch_pad_get_group_mask(uint16_t *set1_mask, uint16_t *set2_mask, uint16_t *en_mask)
  391. {
  392. portENTER_CRITICAL(&rtc_spinlock);
  393. if (set1_mask) {
  394. *set1_mask = TOUCH_BITS_SWAP(SENS.sar_touch_enable.touch_pad_outen1);
  395. }
  396. if (set2_mask) {
  397. *set2_mask = TOUCH_BITS_SWAP(SENS.sar_touch_enable.touch_pad_outen2);
  398. }
  399. if (en_mask) {
  400. *en_mask = TOUCH_BITS_SWAP(SENS.sar_touch_enable.touch_pad_worken);
  401. }
  402. portEXIT_CRITICAL(&rtc_spinlock);
  403. return ESP_OK;
  404. }
  405. esp_err_t touch_pad_clear_group_mask(uint16_t set1_mask, uint16_t set2_mask, uint16_t en_mask)
  406. {
  407. RTC_MODULE_CHECK((set1_mask <= TOUCH_PAD_BIT_MASK_MAX), "touch set1 bitmask error", ESP_ERR_INVALID_ARG);
  408. RTC_MODULE_CHECK((set2_mask <= TOUCH_PAD_BIT_MASK_MAX), "touch set2 bitmask error", ESP_ERR_INVALID_ARG);
  409. RTC_MODULE_CHECK((en_mask <= TOUCH_PAD_BIT_MASK_MAX), "touch work_en bitmask error", ESP_ERR_INVALID_ARG);
  410. portENTER_CRITICAL(&rtc_spinlock);
  411. SENS.sar_touch_enable.touch_pad_outen1 &= TOUCH_BITS_SWAP(~set1_mask);
  412. SENS.sar_touch_enable.touch_pad_outen2 &= TOUCH_BITS_SWAP(~set2_mask);
  413. SENS.sar_touch_enable.touch_pad_worken &= TOUCH_BITS_SWAP(~en_mask);
  414. portEXIT_CRITICAL(&rtc_spinlock);
  415. return ESP_OK;
  416. }
  417. uint32_t IRAM_ATTR touch_pad_get_status(void)
  418. {
  419. uint32_t status = SENS.sar_touch_ctrl2.touch_meas_en;
  420. return TOUCH_BITS_SWAP(status);
  421. }
  422. esp_err_t IRAM_ATTR touch_pad_clear_status(void)
  423. {
  424. SENS.sar_touch_ctrl2.touch_meas_en_clr = 1;
  425. return ESP_OK;
  426. }
  427. esp_err_t touch_pad_intr_enable(void)
  428. {
  429. portENTER_CRITICAL(&rtc_spinlock);
  430. RTCCNTL.int_ena.rtc_touch = 1;
  431. portEXIT_CRITICAL(&rtc_spinlock);
  432. return ESP_OK;
  433. }
  434. esp_err_t touch_pad_intr_disable(void)
  435. {
  436. portENTER_CRITICAL(&rtc_spinlock);
  437. RTCCNTL.int_ena.rtc_touch = 0;
  438. portEXIT_CRITICAL(&rtc_spinlock);
  439. return ESP_OK;
  440. }
  441. esp_err_t touch_pad_config(touch_pad_t touch_num, uint16_t threshold)
  442. {
  443. RTC_MODULE_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_FAIL);
  444. RTC_MODULE_CHECK(touch_num < TOUCH_PAD_MAX, "Touch_Pad Num Err", ESP_ERR_INVALID_ARG);
  445. touch_fsm_mode_t mode;
  446. touch_pad_set_thresh(touch_num, threshold);
  447. touch_pad_io_init(touch_num);
  448. touch_pad_set_cnt_mode(touch_num, TOUCH_PAD_SLOPE_7, TOUCH_PAD_TIE_OPT_LOW);
  449. touch_pad_get_fsm_mode(&mode);
  450. if (TOUCH_FSM_MODE_SW == mode) {
  451. touch_pad_clear_group_mask((1 << touch_num), (1 << touch_num), (1 << touch_num));
  452. s_touch_pad_init_bit |= (1 << touch_num);
  453. } else if (TOUCH_FSM_MODE_TIMER == mode){
  454. uint16_t sleep_time = 0;
  455. uint16_t meas_cycle = 0;
  456. uint32_t wait_time_ms = 0;
  457. uint32_t wait_tick = 0;
  458. uint32_t rtc_clk = rtc_clk_slow_freq_get_hz();
  459. touch_pad_set_group_mask((1 << touch_num), (1 << touch_num), (1 << touch_num));
  460. touch_pad_get_meas_time(&sleep_time, &meas_cycle);
  461. //If the FSM mode is 'TOUCH_FSM_MODE_TIMER', The data will be ready after one measurement cycle
  462. //after this function is executed, otherwise, the "touch_value" by "touch_pad_read" is 0.
  463. wait_time_ms = sleep_time/(rtc_clk/1000) + meas_cycle/(RTC_FAST_CLK_FREQ_APPROX/1000);
  464. wait_tick = wait_time_ms/portTICK_RATE_MS;
  465. vTaskDelay(wait_tick ? wait_tick : 1);
  466. s_touch_pad_init_bit |= (1 << touch_num);
  467. } else {
  468. return ESP_FAIL;
  469. }
  470. return ESP_OK;
  471. }
  472. esp_err_t touch_pad_init(void)
  473. {
  474. if (rtc_touch_mux == NULL) {
  475. rtc_touch_mux = xSemaphoreCreateMutex();
  476. }
  477. if (rtc_touch_mux == NULL) {
  478. return ESP_FAIL;
  479. }
  480. touch_pad_intr_disable();
  481. touch_pad_clear_group_mask(TOUCH_PAD_BIT_MASK_MAX, TOUCH_PAD_BIT_MASK_MAX, TOUCH_PAD_BIT_MASK_MAX);
  482. touch_pad_set_trigger_mode(TOUCH_TRIGGER_MODE_DEFAULT);
  483. touch_pad_set_trigger_source(TOUCH_TRIGGER_SOURCE_DEFAULT);
  484. touch_pad_clear_status();
  485. touch_pad_set_meas_time(TOUCH_PAD_SLEEP_CYCLE_DEFAULT, TOUCH_PAD_MEASURE_CYCLE_DEFAULT);
  486. touch_pad_set_fsm_mode(TOUCH_FSM_MODE_DEFAULT);
  487. return ESP_OK;
  488. }
  489. esp_err_t touch_pad_deinit(void)
  490. {
  491. RTC_MODULE_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_FAIL);
  492. if (s_touch_pad_filter != NULL) {
  493. touch_pad_filter_stop();
  494. touch_pad_filter_delete();
  495. }
  496. xSemaphoreTake(rtc_touch_mux, portMAX_DELAY);
  497. s_touch_pad_init_bit = 0x0000;
  498. touch_pad_set_fsm_mode(TOUCH_FSM_MODE_SW);
  499. touch_pad_clear_status();
  500. touch_pad_intr_disable();
  501. xSemaphoreGive(rtc_touch_mux);
  502. vSemaphoreDelete(rtc_touch_mux);
  503. rtc_touch_mux = NULL;
  504. return ESP_OK;
  505. }
  506. static esp_err_t _touch_pad_read(touch_pad_t touch_num, uint16_t *touch_value, touch_fsm_mode_t mode)
  507. {
  508. esp_err_t res = ESP_OK;
  509. touch_pad_t tp_wrap = touch_pad_num_wrap(touch_num);
  510. if (TOUCH_FSM_MODE_SW == mode) {
  511. touch_pad_set_group_mask((1 << touch_num), (1 << touch_num), (1 << touch_num));
  512. touch_pad_sw_start();
  513. while (SENS.sar_touch_ctrl2.touch_meas_done == 0) {};
  514. *touch_value = (tp_wrap & 0x1) ? \
  515. SENS.touch_meas[tp_wrap / 2].l_val: \
  516. SENS.touch_meas[tp_wrap / 2].h_val;
  517. touch_pad_clear_group_mask((1 << touch_num), (1 << touch_num), (1 << touch_num));
  518. } else if (TOUCH_FSM_MODE_TIMER == mode) {
  519. while (SENS.sar_touch_ctrl2.touch_meas_done == 0) {};
  520. *touch_value = (tp_wrap & 0x1) ? \
  521. SENS.touch_meas[tp_wrap / 2].l_val: \
  522. SENS.touch_meas[tp_wrap / 2].h_val;
  523. } else {
  524. res = ESP_FAIL;
  525. }
  526. if (*touch_value == 0) {
  527. res = ESP_ERR_INVALID_STATE;
  528. }
  529. return res;
  530. }
  531. esp_err_t touch_pad_read(touch_pad_t touch_num, uint16_t *touch_value)
  532. {
  533. RTC_MODULE_CHECK(touch_num < TOUCH_PAD_MAX, "Touch_Pad Num Err", ESP_ERR_INVALID_ARG);
  534. RTC_MODULE_CHECK(touch_value != NULL, "touch_value", ESP_ERR_INVALID_ARG);
  535. RTC_MODULE_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_FAIL);
  536. esp_err_t res = ESP_OK;
  537. touch_fsm_mode_t mode;
  538. touch_pad_get_fsm_mode(&mode);
  539. xSemaphoreTake(rtc_touch_mux, portMAX_DELAY);
  540. res = _touch_pad_read(touch_num, touch_value, mode);
  541. xSemaphoreGive(rtc_touch_mux);
  542. return res;
  543. }
  544. IRAM_ATTR esp_err_t touch_pad_read_raw_data(touch_pad_t touch_num, uint16_t *touch_value)
  545. {
  546. RTC_MODULE_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_FAIL);
  547. RTC_MODULE_CHECK(touch_num < TOUCH_PAD_MAX, "Touch_Pad Num Err", ESP_ERR_INVALID_ARG);
  548. RTC_MODULE_CHECK(touch_value != NULL, "touch_value", ESP_ERR_INVALID_ARG);
  549. RTC_MODULE_CHECK(s_touch_pad_filter != NULL, "Touch pad filter not initialized", ESP_FAIL);
  550. *touch_value = s_touch_pad_filter->raw_val[touch_num];
  551. if (*touch_value == 0) {
  552. return ESP_ERR_INVALID_STATE;
  553. }
  554. return ESP_OK;
  555. }
  556. IRAM_ATTR esp_err_t touch_pad_read_filtered(touch_pad_t touch_num, uint16_t *touch_value)
  557. {
  558. RTC_MODULE_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_FAIL);
  559. RTC_MODULE_CHECK(touch_num < TOUCH_PAD_MAX, "Touch_Pad Num Err", ESP_ERR_INVALID_ARG);
  560. RTC_MODULE_CHECK(touch_value != NULL, "touch_value", ESP_ERR_INVALID_ARG);
  561. RTC_MODULE_CHECK(s_touch_pad_filter != NULL, "Touch pad filter not initialized", ESP_FAIL);
  562. *touch_value = (s_touch_pad_filter->filtered_val[touch_num]);
  563. if (*touch_value == 0) {
  564. return ESP_ERR_INVALID_STATE;
  565. }
  566. return ESP_OK;
  567. }
  568. esp_err_t touch_pad_set_filter_period(uint32_t new_period_ms)
  569. {
  570. RTC_MODULE_CHECK(s_touch_pad_filter != NULL, "Touch pad filter not initialized", ESP_ERR_INVALID_STATE);
  571. RTC_MODULE_CHECK(new_period_ms > 0, "Touch pad filter period error", ESP_ERR_INVALID_ARG);
  572. RTC_MODULE_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_ERR_INVALID_STATE);
  573. esp_err_t ret = ESP_OK;
  574. xSemaphoreTake(rtc_touch_mux, portMAX_DELAY);
  575. if (s_touch_pad_filter != NULL) {
  576. xTimerChangePeriod(s_touch_pad_filter->timer, new_period_ms / portTICK_PERIOD_MS, portMAX_DELAY);
  577. s_touch_pad_filter->period = new_period_ms;
  578. } else {
  579. ESP_LOGE(RTC_MODULE_TAG, "Touch pad filter deleted");
  580. ret = ESP_ERR_INVALID_STATE;
  581. }
  582. xSemaphoreGive(rtc_touch_mux);
  583. return ret;
  584. }
  585. esp_err_t touch_pad_get_filter_period(uint32_t* p_period_ms)
  586. {
  587. RTC_MODULE_CHECK(s_touch_pad_filter != NULL, "Touch pad filter not initialized", ESP_ERR_INVALID_STATE);
  588. RTC_MODULE_CHECK(p_period_ms != NULL, "Touch pad period pointer error", ESP_ERR_INVALID_ARG);
  589. RTC_MODULE_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_ERR_INVALID_STATE);
  590. esp_err_t ret = ESP_OK;
  591. xSemaphoreTake(rtc_touch_mux, portMAX_DELAY);
  592. if (s_touch_pad_filter != NULL) {
  593. *p_period_ms = s_touch_pad_filter->period;
  594. } else {
  595. ESP_LOGE(RTC_MODULE_TAG, "Touch pad filter deleted");
  596. ret = ESP_ERR_INVALID_STATE;
  597. }
  598. xSemaphoreGive(rtc_touch_mux);
  599. return ret;
  600. }
  601. esp_err_t touch_pad_filter_start(uint32_t filter_period_ms)
  602. {
  603. RTC_MODULE_CHECK(filter_period_ms >= portTICK_PERIOD_MS, "Touch pad filter period error", ESP_ERR_INVALID_ARG);
  604. RTC_MODULE_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_ERR_INVALID_STATE);
  605. xSemaphoreTake(rtc_touch_mux, portMAX_DELAY);
  606. if (s_touch_pad_filter == NULL) {
  607. s_touch_pad_filter = (touch_pad_filter_t *) calloc(1, sizeof(touch_pad_filter_t));
  608. if (s_touch_pad_filter == NULL) {
  609. goto err_no_mem;
  610. }
  611. }
  612. if (s_touch_pad_filter->timer == NULL) {
  613. s_touch_pad_filter->timer = xTimerCreate("filter_tmr", filter_period_ms / portTICK_PERIOD_MS, pdFALSE,
  614. NULL, (void(*)(TimerHandle_t))touch_pad_filter_cb);
  615. if (s_touch_pad_filter->timer == NULL) {
  616. free(s_touch_pad_filter);
  617. s_touch_pad_filter = NULL;
  618. goto err_no_mem;
  619. }
  620. s_touch_pad_filter->period = filter_period_ms;
  621. }
  622. xSemaphoreGive(rtc_touch_mux);
  623. touch_pad_filter_cb(NULL);
  624. return ESP_OK;
  625. err_no_mem:
  626. xSemaphoreGive(rtc_touch_mux);
  627. return ESP_ERR_NO_MEM;
  628. }
  629. esp_err_t touch_pad_filter_stop(void)
  630. {
  631. RTC_MODULE_CHECK(s_touch_pad_filter != NULL, "Touch pad filter not initialized", ESP_ERR_INVALID_STATE);
  632. RTC_MODULE_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_ERR_INVALID_STATE);
  633. esp_err_t ret = ESP_OK;
  634. xSemaphoreTake(rtc_touch_mux, portMAX_DELAY);
  635. if (s_touch_pad_filter != NULL) {
  636. xTimerStop(s_touch_pad_filter->timer, portMAX_DELAY);
  637. } else {
  638. ESP_LOGE(RTC_MODULE_TAG, "Touch pad filter deleted");
  639. ret = ESP_ERR_INVALID_STATE;
  640. }
  641. xSemaphoreGive(rtc_touch_mux);
  642. return ret;
  643. }
  644. esp_err_t touch_pad_filter_delete(void)
  645. {
  646. RTC_MODULE_CHECK(s_touch_pad_filter != NULL, "Touch pad filter not initialized", ESP_ERR_INVALID_STATE);
  647. RTC_MODULE_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_ERR_INVALID_STATE);
  648. xSemaphoreTake(rtc_touch_mux, portMAX_DELAY);
  649. if (s_touch_pad_filter != NULL) {
  650. if (s_touch_pad_filter->timer != NULL) {
  651. xTimerStop(s_touch_pad_filter->timer, portMAX_DELAY);
  652. xTimerDelete(s_touch_pad_filter->timer, portMAX_DELAY);
  653. s_touch_pad_filter->timer = NULL;
  654. }
  655. free(s_touch_pad_filter);
  656. s_touch_pad_filter = NULL;
  657. }
  658. xSemaphoreGive(rtc_touch_mux);
  659. return ESP_OK;
  660. }
  661. esp_err_t touch_pad_get_wakeup_status(touch_pad_t *pad_num)
  662. {
  663. uint32_t touch_mask = SENS.sar_touch_ctrl2.touch_meas_en;
  664. if(touch_mask == 0) {
  665. return ESP_FAIL;
  666. }
  667. *pad_num = touch_pad_num_wrap((touch_pad_t)(__builtin_ffs(touch_mask) - 1));
  668. return ESP_OK;
  669. }
  670. #endif
  671. /*---------------------------------------------------------------
  672. INTERRUPT HANDLER
  673. ---------------------------------------------------------------*/
  674. typedef struct rtc_isr_handler_ {
  675. uint32_t mask;
  676. intr_handler_t handler;
  677. void* handler_arg;
  678. SLIST_ENTRY(rtc_isr_handler_) next;
  679. } rtc_isr_handler_t;
  680. static SLIST_HEAD(rtc_isr_handler_list_, rtc_isr_handler_) s_rtc_isr_handler_list =
  681. SLIST_HEAD_INITIALIZER(s_rtc_isr_handler_list);
  682. portMUX_TYPE s_rtc_isr_handler_list_lock = portMUX_INITIALIZER_UNLOCKED;
  683. static intr_handle_t s_rtc_isr_handle;
  684. static void rtc_isr(void* arg)
  685. {
  686. uint32_t status = REG_READ(RTC_CNTL_INT_ST_REG);
  687. rtc_isr_handler_t* it;
  688. portENTER_CRITICAL_ISR(&s_rtc_isr_handler_list_lock);
  689. SLIST_FOREACH(it, &s_rtc_isr_handler_list, next) {
  690. if (it->mask & status) {
  691. portEXIT_CRITICAL_ISR(&s_rtc_isr_handler_list_lock);
  692. (*it->handler)(it->handler_arg);
  693. portENTER_CRITICAL_ISR(&s_rtc_isr_handler_list_lock);
  694. }
  695. }
  696. portEXIT_CRITICAL_ISR(&s_rtc_isr_handler_list_lock);
  697. REG_WRITE(RTC_CNTL_INT_CLR_REG, status);
  698. }
  699. static esp_err_t rtc_isr_ensure_installed(void)
  700. {
  701. esp_err_t err = ESP_OK;
  702. portENTER_CRITICAL(&s_rtc_isr_handler_list_lock);
  703. if (s_rtc_isr_handle) {
  704. goto out;
  705. }
  706. REG_WRITE(RTC_CNTL_INT_ENA_REG, 0);
  707. REG_WRITE(RTC_CNTL_INT_CLR_REG, UINT32_MAX);
  708. err = esp_intr_alloc(ETS_RTC_CORE_INTR_SOURCE, 0, &rtc_isr, NULL, &s_rtc_isr_handle);
  709. if (err != ESP_OK) {
  710. goto out;
  711. }
  712. out:
  713. portEXIT_CRITICAL(&s_rtc_isr_handler_list_lock);
  714. return err;
  715. }
  716. esp_err_t rtc_isr_register(intr_handler_t handler, void* handler_arg, uint32_t rtc_intr_mask)
  717. {
  718. esp_err_t err = rtc_isr_ensure_installed();
  719. if (err != ESP_OK) {
  720. return err;
  721. }
  722. rtc_isr_handler_t* item = malloc(sizeof(*item));
  723. if (item == NULL) {
  724. return ESP_ERR_NO_MEM;
  725. }
  726. item->handler = handler;
  727. item->handler_arg = handler_arg;
  728. item->mask = rtc_intr_mask;
  729. portENTER_CRITICAL(&s_rtc_isr_handler_list_lock);
  730. SLIST_INSERT_HEAD(&s_rtc_isr_handler_list, item, next);
  731. portEXIT_CRITICAL(&s_rtc_isr_handler_list_lock);
  732. return ESP_OK;
  733. }
  734. esp_err_t rtc_isr_deregister(intr_handler_t handler, void* handler_arg)
  735. {
  736. rtc_isr_handler_t* it;
  737. rtc_isr_handler_t* prev = NULL;
  738. bool found = false;
  739. portENTER_CRITICAL(&s_rtc_isr_handler_list_lock);
  740. SLIST_FOREACH(it, &s_rtc_isr_handler_list, next) {
  741. if (it->handler == handler && it->handler_arg == handler_arg) {
  742. if (it == SLIST_FIRST(&s_rtc_isr_handler_list)) {
  743. SLIST_REMOVE_HEAD(&s_rtc_isr_handler_list, next);
  744. } else {
  745. SLIST_REMOVE_AFTER(prev, next);
  746. }
  747. found = true;
  748. free(it);
  749. break;
  750. }
  751. prev = it;
  752. }
  753. portEXIT_CRITICAL(&s_rtc_isr_handler_list_lock);
  754. return found ? ESP_OK : ESP_ERR_INVALID_STATE;
  755. }