rtc_module.c 54 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303
  1. // you may not use this file except in compliance with the License.
  2. // You may obtain a copy of the License at
  3. // http://www.apache.org/licenses/LICENSE-2.0
  4. //
  5. // Unless required by applicable law or agreed to in writing, software
  6. // distributed under the License is distributed on an "AS IS" BASIS,
  7. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  8. // See the License for the specific language governing permissions and
  9. // limitations under the License.
  10. #include <esp_types.h>
  11. #include <stdlib.h>
  12. #include <ctype.h>
  13. #include "rom/ets_sys.h"
  14. #include "esp_log.h"
  15. #include "soc/rtc_io_reg.h"
  16. #include "soc/rtc_io_struct.h"
  17. #include "soc/sens_reg.h"
  18. #include "soc/sens_struct.h"
  19. #include "soc/rtc_cntl_reg.h"
  20. #include "soc/rtc_cntl_struct.h"
  21. #include "rtc_io.h"
  22. #include "touch_pad.h"
  23. #include "adc.h"
  24. #include "dac.h"
  25. #include "freertos/FreeRTOS.h"
  26. #include "freertos/xtensa_api.h"
  27. #include "freertos/semphr.h"
  28. #include "freertos/timers.h"
  29. #include "esp_intr_alloc.h"
  30. #include "sys/lock.h"
  31. #include "driver/rtc_cntl.h"
  32. #include "driver/gpio.h"
  33. #ifndef NDEBUG
  34. // Enable built-in checks in queue.h in debug builds
  35. #define INVARIANTS
  36. #endif
  37. #include "rom/queue.h"
  38. static const char *RTC_MODULE_TAG = "RTC_MODULE";
  39. #define RTC_MODULE_CHECK(a, str, ret_val) if (!(a)) { \
  40. ESP_LOGE(RTC_MODULE_TAG,"%s:%d (%s):%s", __FILE__, __LINE__, __FUNCTION__, str); \
  41. return (ret_val); \
  42. }
  43. #define RTC_RES_CHECK(res, ret_val) if ( (a) != ESP_OK) { \
  44. ESP_LOGE(RTC_MODULE_TAG,"%s:%d (%s)", __FILE__, __LINE__, __FUNCTION__); \
  45. return (ret_val); \
  46. }
  47. #define ADC1_CHECK_FUNCTION_RET(fun_ret) if(fun_ret!=ESP_OK){\
  48. ESP_LOGE(RTC_MODULE_TAG,"%s:%d\n",__FUNCTION__,__LINE__);\
  49. return ESP_FAIL;\
  50. }
  51. #define DAC_ERR_STR_CHANNEL_ERROR "DAC channel error"
  52. portMUX_TYPE rtc_spinlock = portMUX_INITIALIZER_UNLOCKED;
  53. static SemaphoreHandle_t rtc_touch_mux = NULL;
  54. typedef struct {
  55. TimerHandle_t timer;
  56. uint32_t filtered_val[TOUCH_PAD_MAX];
  57. uint32_t filter_period;
  58. uint32_t period;
  59. bool enable;
  60. } touch_pad_filter_t;
  61. static touch_pad_filter_t *s_touch_pad_filter = NULL;
  62. //Reg,Mux,Fun,IE,Up,Down,Rtc_number
  63. const rtc_gpio_desc_t rtc_gpio_desc[GPIO_PIN_COUNT] = {
  64. {RTC_IO_TOUCH_PAD1_REG, RTC_IO_TOUCH_PAD1_MUX_SEL_M, RTC_IO_TOUCH_PAD1_FUN_SEL_S, RTC_IO_TOUCH_PAD1_FUN_IE_M, RTC_IO_TOUCH_PAD1_RUE_M, RTC_IO_TOUCH_PAD1_RDE_M, RTC_IO_TOUCH_PAD1_SLP_SEL_M, RTC_IO_TOUCH_PAD1_SLP_IE_M, RTC_IO_TOUCH_PAD1_HOLD_M, RTC_CNTL_TOUCH_PAD1_HOLD_FORCE_M, RTC_IO_TOUCH_PAD1_DRV_V, RTC_IO_TOUCH_PAD1_DRV_S, RTCIO_GPIO0_CHANNEL}, //0
  65. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //1
  66. {RTC_IO_TOUCH_PAD2_REG, RTC_IO_TOUCH_PAD2_MUX_SEL_M, RTC_IO_TOUCH_PAD2_FUN_SEL_S, RTC_IO_TOUCH_PAD2_FUN_IE_M, RTC_IO_TOUCH_PAD2_RUE_M, RTC_IO_TOUCH_PAD2_RDE_M, RTC_IO_TOUCH_PAD2_SLP_SEL_M, RTC_IO_TOUCH_PAD2_SLP_IE_M, RTC_IO_TOUCH_PAD2_HOLD_M, RTC_CNTL_TOUCH_PAD2_HOLD_FORCE_M, RTC_IO_TOUCH_PAD2_DRV_V, RTC_IO_TOUCH_PAD2_DRV_S, RTCIO_GPIO2_CHANNEL}, //2
  67. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //3
  68. {RTC_IO_TOUCH_PAD0_REG, RTC_IO_TOUCH_PAD0_MUX_SEL_M, RTC_IO_TOUCH_PAD0_FUN_SEL_S, RTC_IO_TOUCH_PAD0_FUN_IE_M, RTC_IO_TOUCH_PAD0_RUE_M, RTC_IO_TOUCH_PAD0_RDE_M, RTC_IO_TOUCH_PAD0_SLP_SEL_M, RTC_IO_TOUCH_PAD0_SLP_IE_M, RTC_IO_TOUCH_PAD0_HOLD_M, RTC_CNTL_TOUCH_PAD0_HOLD_FORCE_M, RTC_IO_TOUCH_PAD0_DRV_V, RTC_IO_TOUCH_PAD0_DRV_S, RTCIO_GPIO4_CHANNEL}, //4
  69. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //5
  70. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //6
  71. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //7
  72. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //8
  73. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //9
  74. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //10
  75. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //11
  76. {RTC_IO_TOUCH_PAD5_REG, RTC_IO_TOUCH_PAD5_MUX_SEL_M, RTC_IO_TOUCH_PAD5_FUN_SEL_S, RTC_IO_TOUCH_PAD5_FUN_IE_M, RTC_IO_TOUCH_PAD5_RUE_M, RTC_IO_TOUCH_PAD5_RDE_M, RTC_IO_TOUCH_PAD5_SLP_SEL_M, RTC_IO_TOUCH_PAD5_SLP_IE_M, RTC_IO_TOUCH_PAD5_HOLD_M, RTC_CNTL_TOUCH_PAD5_HOLD_FORCE_M, RTC_IO_TOUCH_PAD5_DRV_V, RTC_IO_TOUCH_PAD5_DRV_S, RTCIO_GPIO12_CHANNEL}, //12
  77. {RTC_IO_TOUCH_PAD4_REG, RTC_IO_TOUCH_PAD4_MUX_SEL_M, RTC_IO_TOUCH_PAD4_FUN_SEL_S, RTC_IO_TOUCH_PAD4_FUN_IE_M, RTC_IO_TOUCH_PAD4_RUE_M, RTC_IO_TOUCH_PAD4_RDE_M, RTC_IO_TOUCH_PAD4_SLP_SEL_M, RTC_IO_TOUCH_PAD4_SLP_IE_M, RTC_IO_TOUCH_PAD4_HOLD_M, RTC_CNTL_TOUCH_PAD4_HOLD_FORCE_M, RTC_IO_TOUCH_PAD4_DRV_V, RTC_IO_TOUCH_PAD4_DRV_S, RTCIO_GPIO13_CHANNEL}, //13
  78. {RTC_IO_TOUCH_PAD6_REG, RTC_IO_TOUCH_PAD6_MUX_SEL_M, RTC_IO_TOUCH_PAD6_FUN_SEL_S, RTC_IO_TOUCH_PAD6_FUN_IE_M, RTC_IO_TOUCH_PAD6_RUE_M, RTC_IO_TOUCH_PAD6_RDE_M, RTC_IO_TOUCH_PAD6_SLP_SEL_M, RTC_IO_TOUCH_PAD6_SLP_IE_M, RTC_IO_TOUCH_PAD6_HOLD_M, RTC_CNTL_TOUCH_PAD6_HOLD_FORCE_M, RTC_IO_TOUCH_PAD6_DRV_V, RTC_IO_TOUCH_PAD6_DRV_S, RTCIO_GPIO14_CHANNEL}, //14
  79. {RTC_IO_TOUCH_PAD3_REG, RTC_IO_TOUCH_PAD3_MUX_SEL_M, RTC_IO_TOUCH_PAD3_FUN_SEL_S, RTC_IO_TOUCH_PAD3_FUN_IE_M, RTC_IO_TOUCH_PAD3_RUE_M, RTC_IO_TOUCH_PAD3_RDE_M, RTC_IO_TOUCH_PAD3_SLP_SEL_M, RTC_IO_TOUCH_PAD3_SLP_IE_M, RTC_IO_TOUCH_PAD3_HOLD_M, RTC_CNTL_TOUCH_PAD3_HOLD_FORCE_M, RTC_IO_TOUCH_PAD3_DRV_V, RTC_IO_TOUCH_PAD3_DRV_S, RTCIO_GPIO15_CHANNEL}, //15
  80. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //16
  81. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //17
  82. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //18
  83. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //19
  84. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //20
  85. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //21
  86. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //22
  87. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //23
  88. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //24
  89. {RTC_IO_PAD_DAC1_REG, RTC_IO_PDAC1_MUX_SEL_M, RTC_IO_PDAC1_FUN_SEL_S, RTC_IO_PDAC1_FUN_IE_M, RTC_IO_PDAC1_RUE_M, RTC_IO_PDAC1_RDE_M, RTC_IO_PDAC1_SLP_SEL_M, RTC_IO_PDAC1_SLP_IE_M, RTC_IO_PDAC1_HOLD_M, RTC_CNTL_PDAC1_HOLD_FORCE_M, RTC_IO_PDAC1_DRV_V, RTC_IO_PDAC1_DRV_S, RTCIO_GPIO25_CHANNEL}, //25
  90. {RTC_IO_PAD_DAC2_REG, RTC_IO_PDAC2_MUX_SEL_M, RTC_IO_PDAC2_FUN_SEL_S, RTC_IO_PDAC2_FUN_IE_M, RTC_IO_PDAC2_RUE_M, RTC_IO_PDAC2_RDE_M, RTC_IO_PDAC2_SLP_SEL_M, RTC_IO_PDAC2_SLP_IE_M, RTC_IO_PDAC2_HOLD_M, RTC_CNTL_PDAC1_HOLD_FORCE_M, RTC_IO_PDAC2_DRV_V, RTC_IO_PDAC2_DRV_S, RTCIO_GPIO26_CHANNEL}, //26
  91. {RTC_IO_TOUCH_PAD7_REG, RTC_IO_TOUCH_PAD7_MUX_SEL_M, RTC_IO_TOUCH_PAD7_FUN_SEL_S, RTC_IO_TOUCH_PAD7_FUN_IE_M, RTC_IO_TOUCH_PAD7_RUE_M, RTC_IO_TOUCH_PAD7_RDE_M, RTC_IO_TOUCH_PAD7_SLP_SEL_M, RTC_IO_TOUCH_PAD7_SLP_IE_M, RTC_IO_TOUCH_PAD7_HOLD_M, RTC_CNTL_TOUCH_PAD7_HOLD_FORCE_M, RTC_IO_TOUCH_PAD7_DRV_V, RTC_IO_TOUCH_PAD7_DRV_S, RTCIO_GPIO27_CHANNEL}, //27
  92. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //28
  93. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //29
  94. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //30
  95. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //31
  96. {RTC_IO_XTAL_32K_PAD_REG, RTC_IO_X32P_MUX_SEL_M, RTC_IO_X32P_FUN_SEL_S, RTC_IO_X32P_FUN_IE_M, RTC_IO_X32P_RUE_M, RTC_IO_X32P_RDE_M, RTC_IO_X32P_SLP_SEL_M, RTC_IO_X32P_SLP_IE_M, RTC_IO_X32P_HOLD_M, RTC_CNTL_X32P_HOLD_FORCE_M, RTC_IO_X32P_DRV_V, RTC_IO_X32P_DRV_S, RTCIO_GPIO32_CHANNEL}, //32
  97. {RTC_IO_XTAL_32K_PAD_REG, RTC_IO_X32N_MUX_SEL_M, RTC_IO_X32N_FUN_SEL_S, RTC_IO_X32N_FUN_IE_M, RTC_IO_X32N_RUE_M, RTC_IO_X32N_RDE_M, RTC_IO_X32N_SLP_SEL_M, RTC_IO_X32N_SLP_IE_M, RTC_IO_X32N_HOLD_M, RTC_CNTL_X32N_HOLD_FORCE_M, RTC_IO_X32N_DRV_V, RTC_IO_X32N_DRV_S, RTCIO_GPIO33_CHANNEL}, //33
  98. {RTC_IO_ADC_PAD_REG, RTC_IO_ADC1_MUX_SEL_M, RTC_IO_ADC1_FUN_SEL_S, RTC_IO_ADC1_FUN_IE_M, 0, 0, RTC_IO_ADC1_SLP_SEL_M, RTC_IO_ADC1_SLP_IE_M, RTC_IO_ADC1_HOLD_M, RTC_CNTL_ADC1_HOLD_FORCE_M, 0, 0, RTCIO_GPIO34_CHANNEL}, //34
  99. {RTC_IO_ADC_PAD_REG, RTC_IO_ADC2_MUX_SEL_M, RTC_IO_ADC2_FUN_SEL_S, RTC_IO_ADC2_FUN_IE_M, 0, 0, RTC_IO_ADC2_SLP_SEL_M, RTC_IO_ADC2_SLP_IE_M, RTC_IO_ADC1_HOLD_M, RTC_CNTL_ADC2_HOLD_FORCE_M, 0, 0, RTCIO_GPIO35_CHANNEL}, //35
  100. {RTC_IO_SENSOR_PADS_REG, RTC_IO_SENSE1_MUX_SEL_M, RTC_IO_SENSE1_FUN_SEL_S, RTC_IO_SENSE1_FUN_IE_M, 0, 0, RTC_IO_SENSE1_SLP_SEL_M, RTC_IO_SENSE1_SLP_IE_M, RTC_IO_SENSE1_HOLD_M, RTC_CNTL_SENSE1_HOLD_FORCE_M, 0, 0, RTCIO_GPIO36_CHANNEL}, //36
  101. {RTC_IO_SENSOR_PADS_REG, RTC_IO_SENSE2_MUX_SEL_M, RTC_IO_SENSE2_FUN_SEL_S, RTC_IO_SENSE2_FUN_IE_M, 0, 0, RTC_IO_SENSE2_SLP_SEL_M, RTC_IO_SENSE2_SLP_IE_M, RTC_IO_SENSE1_HOLD_M, RTC_CNTL_SENSE2_HOLD_FORCE_M, 0, 0, RTCIO_GPIO37_CHANNEL}, //37
  102. {RTC_IO_SENSOR_PADS_REG, RTC_IO_SENSE3_MUX_SEL_M, RTC_IO_SENSE3_FUN_SEL_S, RTC_IO_SENSE3_FUN_IE_M, 0, 0, RTC_IO_SENSE3_SLP_SEL_M, RTC_IO_SENSE3_SLP_IE_M, RTC_IO_SENSE1_HOLD_M, RTC_CNTL_SENSE3_HOLD_FORCE_M, 0, 0, RTCIO_GPIO38_CHANNEL}, //38
  103. {RTC_IO_SENSOR_PADS_REG, RTC_IO_SENSE4_MUX_SEL_M, RTC_IO_SENSE4_FUN_SEL_S, RTC_IO_SENSE4_FUN_IE_M, 0, 0, RTC_IO_SENSE4_SLP_SEL_M, RTC_IO_SENSE4_SLP_IE_M, RTC_IO_SENSE1_HOLD_M, RTC_CNTL_SENSE4_HOLD_FORCE_M, 0, 0, RTCIO_GPIO39_CHANNEL}, //39
  104. };
  105. /*---------------------------------------------------------------
  106. RTC IO
  107. ---------------------------------------------------------------*/
  108. esp_err_t rtc_gpio_init(gpio_num_t gpio_num)
  109. {
  110. RTC_MODULE_CHECK(rtc_gpio_is_valid_gpio(gpio_num), "RTC_GPIO number error", ESP_ERR_INVALID_ARG);
  111. portENTER_CRITICAL(&rtc_spinlock);
  112. // 0: GPIO connected to digital GPIO module. 1: GPIO connected to analog RTC module.
  113. SET_PERI_REG_MASK(rtc_gpio_desc[gpio_num].reg, (rtc_gpio_desc[gpio_num].mux));
  114. //0:RTC FUNCIOTN 1,2,3:Reserved
  115. SET_PERI_REG_BITS(rtc_gpio_desc[gpio_num].reg, RTC_IO_TOUCH_PAD1_FUN_SEL_V, 0x0, rtc_gpio_desc[gpio_num].func);
  116. portEXIT_CRITICAL(&rtc_spinlock);
  117. return ESP_OK;
  118. }
  119. esp_err_t rtc_gpio_deinit(gpio_num_t gpio_num)
  120. {
  121. RTC_MODULE_CHECK(rtc_gpio_is_valid_gpio(gpio_num), "RTC_GPIO number error", ESP_ERR_INVALID_ARG);
  122. portENTER_CRITICAL(&rtc_spinlock);
  123. //Select Gpio as Digital Gpio
  124. CLEAR_PERI_REG_MASK(rtc_gpio_desc[gpio_num].reg, (rtc_gpio_desc[gpio_num].mux));
  125. portEXIT_CRITICAL(&rtc_spinlock);
  126. return ESP_OK;
  127. }
  128. static esp_err_t rtc_gpio_output_enable(gpio_num_t gpio_num)
  129. {
  130. int rtc_gpio_num = rtc_gpio_desc[gpio_num].rtc_num;
  131. RTC_MODULE_CHECK(rtc_gpio_num != -1, "RTC_GPIO number error", ESP_ERR_INVALID_ARG);
  132. SET_PERI_REG_MASK(RTC_GPIO_ENABLE_W1TS_REG, (1 << (rtc_gpio_num + RTC_GPIO_ENABLE_W1TS_S)));
  133. CLEAR_PERI_REG_MASK(RTC_GPIO_ENABLE_W1TC_REG, (1 << (rtc_gpio_num + RTC_GPIO_ENABLE_W1TC_S)));
  134. return ESP_OK;
  135. }
  136. static esp_err_t rtc_gpio_output_disable(gpio_num_t gpio_num)
  137. {
  138. int rtc_gpio_num = rtc_gpio_desc[gpio_num].rtc_num;
  139. RTC_MODULE_CHECK(rtc_gpio_num != -1, "RTC_GPIO number error", ESP_ERR_INVALID_ARG);
  140. CLEAR_PERI_REG_MASK(RTC_GPIO_ENABLE_W1TS_REG, (1 << (rtc_gpio_num + RTC_GPIO_ENABLE_W1TS_S)));
  141. SET_PERI_REG_MASK(RTC_GPIO_ENABLE_W1TC_REG, (1 << ( rtc_gpio_num + RTC_GPIO_ENABLE_W1TC_S)));
  142. return ESP_OK;
  143. }
  144. static esp_err_t rtc_gpio_input_enable(gpio_num_t gpio_num)
  145. {
  146. RTC_MODULE_CHECK(rtc_gpio_is_valid_gpio(gpio_num), "RTC_GPIO number error", ESP_ERR_INVALID_ARG);
  147. portENTER_CRITICAL(&rtc_spinlock);
  148. SET_PERI_REG_MASK(rtc_gpio_desc[gpio_num].reg, rtc_gpio_desc[gpio_num].ie);
  149. portEXIT_CRITICAL(&rtc_spinlock);
  150. return ESP_OK;
  151. }
  152. static esp_err_t rtc_gpio_input_disable(gpio_num_t gpio_num)
  153. {
  154. RTC_MODULE_CHECK(rtc_gpio_is_valid_gpio(gpio_num), "RTC_GPIO number error", ESP_ERR_INVALID_ARG);
  155. portENTER_CRITICAL(&rtc_spinlock);
  156. CLEAR_PERI_REG_MASK(rtc_gpio_desc[gpio_num].reg, rtc_gpio_desc[gpio_num].ie);
  157. portEXIT_CRITICAL(&rtc_spinlock);
  158. return ESP_OK;
  159. }
  160. esp_err_t rtc_gpio_set_level(gpio_num_t gpio_num, uint32_t level)
  161. {
  162. int rtc_gpio_num = rtc_gpio_num = rtc_gpio_desc[gpio_num].rtc_num;;
  163. RTC_MODULE_CHECK(rtc_gpio_is_valid_gpio(gpio_num), "RTC_GPIO number error", ESP_ERR_INVALID_ARG);
  164. if (level) {
  165. WRITE_PERI_REG(RTC_GPIO_OUT_W1TS_REG, (1 << (rtc_gpio_num + RTC_GPIO_OUT_DATA_W1TS_S)));
  166. } else {
  167. WRITE_PERI_REG(RTC_GPIO_OUT_W1TC_REG, (1 << (rtc_gpio_num + RTC_GPIO_OUT_DATA_W1TC_S)));
  168. }
  169. return ESP_OK;
  170. }
  171. uint32_t rtc_gpio_get_level(gpio_num_t gpio_num)
  172. {
  173. uint32_t level = 0;
  174. int rtc_gpio_num = rtc_gpio_desc[gpio_num].rtc_num;
  175. RTC_MODULE_CHECK(rtc_gpio_is_valid_gpio(gpio_num), "RTC_GPIO number error", ESP_ERR_INVALID_ARG);
  176. portENTER_CRITICAL(&rtc_spinlock);
  177. level = READ_PERI_REG(RTC_GPIO_IN_REG);
  178. portEXIT_CRITICAL(&rtc_spinlock);
  179. return ((level >> (RTC_GPIO_IN_NEXT_S + rtc_gpio_num)) & 0x01);
  180. }
  181. esp_err_t rtc_gpio_set_drive_capability(gpio_num_t gpio_num, gpio_drive_cap_t strength)
  182. {
  183. RTC_MODULE_CHECK(rtc_gpio_is_valid_gpio(gpio_num), "RTC_GPIO number error", ESP_ERR_INVALID_ARG);
  184. RTC_MODULE_CHECK(GPIO_IS_VALID_OUTPUT_GPIO(gpio_num), "Output pad only", ESP_ERR_INVALID_ARG);
  185. RTC_MODULE_CHECK(strength < GPIO_DRIVE_CAP_MAX, "GPIO drive capability error", ESP_ERR_INVALID_ARG);
  186. portENTER_CRITICAL(&rtc_spinlock);
  187. SET_PERI_REG_BITS(rtc_gpio_desc[gpio_num].reg, rtc_gpio_desc[gpio_num].drv_v, strength, rtc_gpio_desc[gpio_num].drv_s);
  188. portEXIT_CRITICAL(&rtc_spinlock);
  189. return ESP_OK;
  190. }
  191. esp_err_t rtc_gpio_get_drive_capability(gpio_num_t gpio_num, gpio_drive_cap_t* strength)
  192. {
  193. RTC_MODULE_CHECK(rtc_gpio_is_valid_gpio(gpio_num), "RTC_GPIO number error", ESP_ERR_INVALID_ARG);
  194. RTC_MODULE_CHECK(GPIO_IS_VALID_OUTPUT_GPIO(gpio_num), "Output pad only", ESP_ERR_INVALID_ARG);
  195. RTC_MODULE_CHECK(strength != NULL, "GPIO drive pointer error", ESP_ERR_INVALID_ARG);
  196. *strength = GET_PERI_REG_BITS2(rtc_gpio_desc[gpio_num].reg, rtc_gpio_desc[gpio_num].drv_v, rtc_gpio_desc[gpio_num].drv_s);
  197. return ESP_OK;
  198. }
  199. esp_err_t rtc_gpio_set_direction(gpio_num_t gpio_num, rtc_gpio_mode_t mode)
  200. {
  201. RTC_MODULE_CHECK(rtc_gpio_is_valid_gpio(gpio_num), "RTC_GPIO number error", ESP_ERR_INVALID_ARG);
  202. switch (mode) {
  203. case RTC_GPIO_MODE_INPUT_ONLY:
  204. rtc_gpio_output_disable(gpio_num);
  205. rtc_gpio_input_enable(gpio_num);
  206. break;
  207. case RTC_GPIO_MODE_OUTPUT_ONLY:
  208. rtc_gpio_output_enable(gpio_num);
  209. rtc_gpio_input_disable(gpio_num);
  210. break;
  211. case RTC_GPIO_MODE_INPUT_OUTUT:
  212. rtc_gpio_output_enable(gpio_num);
  213. rtc_gpio_input_enable(gpio_num);
  214. break;
  215. case RTC_GPIO_MODE_DISABLED:
  216. rtc_gpio_output_disable(gpio_num);
  217. rtc_gpio_input_disable(gpio_num);
  218. break;
  219. }
  220. return ESP_OK;
  221. }
  222. esp_err_t rtc_gpio_pullup_en(gpio_num_t gpio_num)
  223. {
  224. //this is a digital pad
  225. if (rtc_gpio_desc[gpio_num].pullup == 0) {
  226. return ESP_ERR_INVALID_ARG;
  227. }
  228. //this is a rtc pad
  229. portENTER_CRITICAL(&rtc_spinlock);
  230. SET_PERI_REG_MASK(rtc_gpio_desc[gpio_num].reg, rtc_gpio_desc[gpio_num].pullup);
  231. portEXIT_CRITICAL(&rtc_spinlock);
  232. return ESP_OK;
  233. }
  234. esp_err_t rtc_gpio_pulldown_en(gpio_num_t gpio_num)
  235. {
  236. //this is a digital pad
  237. if (rtc_gpio_desc[gpio_num].pulldown == 0) {
  238. return ESP_ERR_INVALID_ARG;
  239. }
  240. //this is a rtc pad
  241. portENTER_CRITICAL(&rtc_spinlock);
  242. SET_PERI_REG_MASK(rtc_gpio_desc[gpio_num].reg, rtc_gpio_desc[gpio_num].pulldown);
  243. portEXIT_CRITICAL(&rtc_spinlock);
  244. return ESP_OK;
  245. }
  246. esp_err_t rtc_gpio_pullup_dis(gpio_num_t gpio_num)
  247. {
  248. //this is a digital pad
  249. if ( rtc_gpio_desc[gpio_num].pullup == 0 ) {
  250. return ESP_ERR_INVALID_ARG;
  251. }
  252. //this is a rtc pad
  253. portENTER_CRITICAL(&rtc_spinlock);
  254. CLEAR_PERI_REG_MASK(rtc_gpio_desc[gpio_num].reg, rtc_gpio_desc[gpio_num].pullup);
  255. portEXIT_CRITICAL(&rtc_spinlock);
  256. return ESP_OK;
  257. }
  258. esp_err_t rtc_gpio_pulldown_dis(gpio_num_t gpio_num)
  259. {
  260. //this is a digital pad
  261. if (rtc_gpio_desc[gpio_num].pulldown == 0) {
  262. return ESP_ERR_INVALID_ARG;
  263. }
  264. //this is a rtc pad
  265. portENTER_CRITICAL(&rtc_spinlock);
  266. CLEAR_PERI_REG_MASK(rtc_gpio_desc[gpio_num].reg, rtc_gpio_desc[gpio_num].pulldown);
  267. portEXIT_CRITICAL(&rtc_spinlock);
  268. return ESP_OK;
  269. }
  270. esp_err_t rtc_gpio_hold_en(gpio_num_t gpio_num)
  271. {
  272. // check if an RTC IO
  273. if (rtc_gpio_desc[gpio_num].pullup == 0) {
  274. return ESP_ERR_INVALID_ARG;
  275. }
  276. portENTER_CRITICAL(&rtc_spinlock);
  277. SET_PERI_REG_MASK(rtc_gpio_desc[gpio_num].reg, rtc_gpio_desc[gpio_num].hold);
  278. portEXIT_CRITICAL(&rtc_spinlock);
  279. return ESP_OK;
  280. }
  281. esp_err_t rtc_gpio_hold_dis(gpio_num_t gpio_num)
  282. {
  283. // check if an RTC IO
  284. if (rtc_gpio_desc[gpio_num].pullup == 0) {
  285. return ESP_ERR_INVALID_ARG;
  286. }
  287. portENTER_CRITICAL(&rtc_spinlock);
  288. CLEAR_PERI_REG_MASK(rtc_gpio_desc[gpio_num].reg, rtc_gpio_desc[gpio_num].hold);
  289. portEXIT_CRITICAL(&rtc_spinlock);
  290. return ESP_OK;
  291. }
  292. void rtc_gpio_force_hold_dis_all()
  293. {
  294. for (int gpio = 0; gpio < GPIO_PIN_COUNT; ++gpio) {
  295. const rtc_gpio_desc_t* desc = &rtc_gpio_desc[gpio];
  296. if (desc->hold_force != 0) {
  297. REG_CLR_BIT(RTC_CNTL_HOLD_FORCE_REG, desc->hold_force);
  298. }
  299. }
  300. }
  301. /*---------------------------------------------------------------
  302. Touch Pad
  303. ---------------------------------------------------------------*/
  304. esp_err_t touch_pad_isr_handler_register(void (*fn)(void *), void *arg, int no_use, intr_handle_t *handle_no_use)
  305. {
  306. RTC_MODULE_CHECK(fn, "Touch_Pad ISR null", ESP_ERR_INVALID_ARG);
  307. return rtc_isr_register(fn, arg, RTC_CNTL_TOUCH_INT_ST_M);
  308. }
  309. esp_err_t touch_pad_isr_register(intr_handler_t fn, void* arg)
  310. {
  311. RTC_MODULE_CHECK(fn, "Touch_Pad ISR null", ESP_ERR_INVALID_ARG);
  312. return rtc_isr_register(fn, arg, RTC_CNTL_TOUCH_INT_ST_M);
  313. }
  314. esp_err_t touch_pad_isr_deregister(intr_handler_t fn, void *arg)
  315. {
  316. return rtc_isr_deregister(fn, arg);
  317. }
  318. static esp_err_t touch_pad_get_io_num(touch_pad_t touch_num, gpio_num_t *gpio_num)
  319. {
  320. switch (touch_num) {
  321. case TOUCH_PAD_NUM0:
  322. *gpio_num = TOUCH_PAD_NUM0_GPIO_NUM;
  323. break;
  324. case TOUCH_PAD_NUM1:
  325. *gpio_num = TOUCH_PAD_NUM1_GPIO_NUM;
  326. break;
  327. case TOUCH_PAD_NUM2:
  328. *gpio_num = TOUCH_PAD_NUM2_GPIO_NUM;
  329. break;
  330. case TOUCH_PAD_NUM3:
  331. *gpio_num = TOUCH_PAD_NUM3_GPIO_NUM;
  332. break;
  333. case TOUCH_PAD_NUM4:
  334. *gpio_num = TOUCH_PAD_NUM4_GPIO_NUM;
  335. break;
  336. case TOUCH_PAD_NUM5:
  337. *gpio_num = TOUCH_PAD_NUM5_GPIO_NUM;
  338. break;
  339. case TOUCH_PAD_NUM6:
  340. *gpio_num = TOUCH_PAD_NUM6_GPIO_NUM;
  341. break;
  342. case TOUCH_PAD_NUM7:
  343. *gpio_num = TOUCH_PAD_NUM7_GPIO_NUM;
  344. break;
  345. case TOUCH_PAD_NUM8:
  346. *gpio_num = TOUCH_PAD_NUM8_GPIO_NUM;
  347. break;
  348. case TOUCH_PAD_NUM9:
  349. *gpio_num = TOUCH_PAD_NUM9_GPIO_NUM;
  350. break;
  351. default:
  352. return ESP_ERR_INVALID_ARG;
  353. }
  354. return ESP_OK;
  355. }
  356. #define TOUCH_PAD_FILTER_FACTOR_DEFAULT (16)
  357. #define TOUCH_PAD_SHIFT_DEFAULT (4)
  358. static uint32_t _touch_filter_iir(uint32_t in_now, uint32_t out_last, uint32_t k)
  359. {
  360. if (k == 0) {
  361. return in_now;
  362. } else {
  363. uint32_t out_now = (in_now + (k - 1) * out_last) / k;
  364. return out_now;
  365. }
  366. }
  367. static void touch_pad_filter_cb(void *arg)
  368. {
  369. if (s_touch_pad_filter == NULL) {
  370. return;
  371. }
  372. uint16_t val;
  373. for (int i = 0; i < TOUCH_PAD_MAX; i++) {
  374. touch_pad_read(i, &val);
  375. s_touch_pad_filter->filtered_val[i] = s_touch_pad_filter->filtered_val[i] == 0 ? (val << TOUCH_PAD_SHIFT_DEFAULT) : s_touch_pad_filter->filtered_val[i];
  376. s_touch_pad_filter->filtered_val[i] = _touch_filter_iir((val << TOUCH_PAD_SHIFT_DEFAULT),
  377. s_touch_pad_filter->filtered_val[i], TOUCH_PAD_FILTER_FACTOR_DEFAULT);
  378. }
  379. }
  380. esp_err_t touch_pad_set_meas_time(uint16_t sleep_cycle, uint16_t meas_cycle)
  381. {
  382. xSemaphoreTake(rtc_touch_mux, portMAX_DELAY);
  383. portENTER_CRITICAL(&rtc_spinlock);
  384. //touch sensor sleep cycle Time = sleep_cycle / RTC_SLOW_CLK( can be 150k or 32k depending on the options)
  385. SENS.sar_touch_ctrl2.touch_sleep_cycles = sleep_cycle;
  386. //touch sensor measure time= meas_cycle / 8Mhz
  387. SENS.sar_touch_ctrl1.touch_meas_delay = meas_cycle;
  388. portEXIT_CRITICAL(&rtc_spinlock);
  389. xSemaphoreGive(rtc_touch_mux);
  390. return ESP_OK;
  391. }
  392. esp_err_t touch_pad_get_meas_time(uint16_t *sleep_cycle, uint16_t *meas_cycle)
  393. {
  394. portENTER_CRITICAL(&rtc_spinlock);
  395. if (sleep_cycle) {
  396. *sleep_cycle = SENS.sar_touch_ctrl2.touch_sleep_cycles;
  397. }
  398. if (meas_cycle) {
  399. *meas_cycle = SENS.sar_touch_ctrl1.touch_meas_delay;
  400. }
  401. portEXIT_CRITICAL(&rtc_spinlock);
  402. return ESP_OK;
  403. }
  404. esp_err_t touch_pad_set_voltage(touch_high_volt_t refh, touch_low_volt_t refl, touch_volt_atten_t atten)
  405. {
  406. RTC_MODULE_CHECK(((refh < TOUCH_HVOLT_MAX) && (refh >= (int )TOUCH_HVOLT_KEEP)), "touch refh error",
  407. ESP_ERR_INVALID_ARG);
  408. RTC_MODULE_CHECK(((refl < TOUCH_LVOLT_MAX) && (refh >= (int )TOUCH_LVOLT_KEEP)), "touch refl error",
  409. ESP_ERR_INVALID_ARG);
  410. RTC_MODULE_CHECK(((atten < TOUCH_HVOLT_ATTEN_MAX) && (refh >= (int )TOUCH_HVOLT_ATTEN_KEEP)), "touch atten error",
  411. ESP_ERR_INVALID_ARG);
  412. portENTER_CRITICAL(&rtc_spinlock);
  413. if (refh > TOUCH_HVOLT_KEEP) {
  414. RTCIO.touch_cfg.drefh = refh;
  415. }
  416. if (refl > TOUCH_LVOLT_KEEP) {
  417. RTCIO.touch_cfg.drefl = refl;
  418. }
  419. if (atten > TOUCH_HVOLT_ATTEN_KEEP) {
  420. RTCIO.touch_cfg.drange = atten;
  421. }
  422. portEXIT_CRITICAL(&rtc_spinlock);
  423. return ESP_OK;
  424. }
  425. esp_err_t touch_pad_get_voltage(touch_high_volt_t *refh, touch_low_volt_t *refl, touch_volt_atten_t *atten)
  426. {
  427. portENTER_CRITICAL(&rtc_spinlock);
  428. if (refh) {
  429. *refh = RTCIO.touch_cfg.drefh;
  430. }
  431. if (refl) {
  432. *refl = RTCIO.touch_cfg.drefl;
  433. }
  434. if (atten) {
  435. *atten = RTCIO.touch_cfg.drange;
  436. }
  437. portEXIT_CRITICAL(&rtc_spinlock);
  438. return ESP_OK;
  439. }
  440. esp_err_t touch_pad_set_cnt_mode(touch_pad_t touch_num, touch_cnt_slope_t slope, touch_tie_opt_t opt)
  441. {
  442. RTC_MODULE_CHECK((slope < TOUCH_PAD_SLOPE_MAX), "touch slope error", ESP_ERR_INVALID_ARG);
  443. RTC_MODULE_CHECK((opt < TOUCH_PAD_TIE_OPT_MAX), "touch opt error", ESP_ERR_INVALID_ARG);
  444. portENTER_CRITICAL(&rtc_spinlock);
  445. //set tie opt value, high or low level seem no difference for counter
  446. RTCIO.touch_pad[touch_num].tie_opt = opt;
  447. //touch sensor set slope for charging and discharging.
  448. RTCIO.touch_pad[touch_num].dac = slope;
  449. portEXIT_CRITICAL(&rtc_spinlock);
  450. return ESP_OK;
  451. }
  452. esp_err_t touch_pad_get_cnt_mode(touch_pad_t touch_num, touch_cnt_slope_t *slope, touch_tie_opt_t *opt)
  453. {
  454. RTC_MODULE_CHECK((touch_num < TOUCH_PAD_MAX), "touch IO error", ESP_ERR_INVALID_ARG);
  455. portENTER_CRITICAL(&rtc_spinlock);
  456. if (slope) {
  457. *slope = RTCIO.touch_pad[touch_num].dac;
  458. }
  459. if (opt) {
  460. *opt = RTCIO.touch_pad[touch_num].tie_opt;
  461. }
  462. portEXIT_CRITICAL(&rtc_spinlock);
  463. return ESP_OK;
  464. }
  465. esp_err_t touch_pad_io_init(touch_pad_t touch_num)
  466. {
  467. RTC_MODULE_CHECK((touch_num < TOUCH_PAD_MAX), "touch IO error", ESP_ERR_INVALID_ARG);
  468. gpio_num_t gpio_num = GPIO_NUM_0;
  469. touch_pad_get_io_num(touch_num, &gpio_num);
  470. rtc_gpio_init(gpio_num);
  471. rtc_gpio_set_direction(gpio_num, RTC_GPIO_MODE_DISABLED);
  472. rtc_gpio_pulldown_dis(gpio_num);
  473. rtc_gpio_pullup_dis(gpio_num);
  474. return ESP_OK;
  475. }
  476. esp_err_t touch_pad_set_fsm_mode(touch_fsm_mode_t mode)
  477. {
  478. RTC_MODULE_CHECK((mode < TOUCH_FSM_MODE_MAX), "touch fsm mode error", ESP_ERR_INVALID_ARG);
  479. portENTER_CRITICAL(&rtc_spinlock);
  480. SENS.sar_touch_ctrl2.touch_start_en = 0;
  481. SENS.sar_touch_ctrl2.touch_start_force = mode;
  482. RTCCNTL.state0.touch_slp_timer_en = (mode == TOUCH_FSM_MODE_TIMER ? 1 : 0);
  483. portEXIT_CRITICAL(&rtc_spinlock);
  484. return ESP_OK;
  485. }
  486. esp_err_t touch_pad_get_fsm_mode(touch_fsm_mode_t *mode)
  487. {
  488. if (mode) {
  489. *mode = SENS.sar_touch_ctrl2.touch_start_force;
  490. }
  491. return ESP_OK;
  492. }
  493. esp_err_t touch_pad_sw_start()
  494. {
  495. portENTER_CRITICAL(&rtc_spinlock);
  496. SENS.sar_touch_ctrl2.touch_start_en = 0;
  497. SENS.sar_touch_ctrl2.touch_start_en = 1;
  498. portEXIT_CRITICAL(&rtc_spinlock);
  499. return ESP_OK;
  500. }
  501. esp_err_t touch_pad_set_thresh(touch_pad_t touch_num, uint16_t threshold)
  502. {
  503. RTC_MODULE_CHECK((touch_num < TOUCH_PAD_MAX), "touch IO error", ESP_ERR_INVALID_ARG);
  504. portENTER_CRITICAL(&rtc_spinlock);
  505. if (touch_num & 0x1) {
  506. SENS.touch_thresh[touch_num / 2].l_thresh = threshold;
  507. } else {
  508. SENS.touch_thresh[touch_num / 2].h_thresh = threshold;
  509. }
  510. portEXIT_CRITICAL(&rtc_spinlock);
  511. return ESP_OK;
  512. }
  513. esp_err_t touch_pad_get_thresh(touch_pad_t touch_num, uint16_t *threshold)
  514. {
  515. RTC_MODULE_CHECK((touch_num < TOUCH_PAD_MAX), "touch IO error", ESP_ERR_INVALID_ARG);
  516. if (threshold) {
  517. *threshold = (touch_num & 0x1 )? \
  518. SENS.touch_thresh[touch_num / 2].l_thresh : \
  519. SENS.touch_thresh[touch_num / 2].h_thresh;
  520. }
  521. return ESP_OK;
  522. }
  523. esp_err_t touch_pad_set_trigger_mode(touch_trigger_mode_t mode)
  524. {
  525. RTC_MODULE_CHECK((mode < TOUCH_TRIGGER_MAX), "touch trigger mode error", ESP_ERR_INVALID_ARG);
  526. portENTER_CRITICAL(&rtc_spinlock);
  527. SENS.sar_touch_ctrl1.touch_out_sel = mode;
  528. portEXIT_CRITICAL(&rtc_spinlock);
  529. return ESP_OK;
  530. }
  531. esp_err_t touch_pad_get_trigger_mode(touch_trigger_mode_t *mode)
  532. {
  533. if (mode) {
  534. *mode = SENS.sar_touch_ctrl1.touch_out_sel;
  535. }
  536. return ESP_OK;
  537. }
  538. esp_err_t touch_pad_set_trigger_source(touch_trigger_src_t src)
  539. {
  540. RTC_MODULE_CHECK((src < TOUCH_TRIGGER_SOURCE_MAX), "touch trigger source error", ESP_ERR_INVALID_ARG);
  541. portENTER_CRITICAL(&rtc_spinlock);
  542. SENS.sar_touch_ctrl1.touch_out_1en = src;
  543. portEXIT_CRITICAL(&rtc_spinlock);
  544. return ESP_OK;
  545. }
  546. esp_err_t touch_pad_get_trigger_source(touch_trigger_src_t *src)
  547. {
  548. if (src) {
  549. *src = SENS.sar_touch_ctrl1.touch_out_1en;
  550. }
  551. return ESP_OK;
  552. }
  553. esp_err_t touch_pad_set_group_mask(uint16_t set1_mask, uint16_t set2_mask, uint16_t en_mask)
  554. {
  555. RTC_MODULE_CHECK((set1_mask <= TOUCH_PAD_BIT_MASK_MAX), "touch set1 bitmask error", ESP_ERR_INVALID_ARG);
  556. RTC_MODULE_CHECK((set2_mask <= TOUCH_PAD_BIT_MASK_MAX), "touch set2 bitmask error", ESP_ERR_INVALID_ARG);
  557. RTC_MODULE_CHECK((en_mask <= TOUCH_PAD_BIT_MASK_MAX), "touch work_en bitmask error", ESP_ERR_INVALID_ARG);
  558. portENTER_CRITICAL(&rtc_spinlock);
  559. SENS.sar_touch_enable.touch_pad_outen1 |= set1_mask;
  560. SENS.sar_touch_enable.touch_pad_outen2 |= set2_mask;
  561. SENS.sar_touch_enable.touch_pad_worken |= en_mask;
  562. portEXIT_CRITICAL(&rtc_spinlock);
  563. return ESP_OK;
  564. }
  565. esp_err_t touch_pad_get_group_mask(uint16_t *set1_mask, uint16_t *set2_mask, uint16_t *en_mask)
  566. {
  567. portENTER_CRITICAL(&rtc_spinlock);
  568. if (set1_mask) {
  569. *set1_mask = SENS.sar_touch_enable.touch_pad_outen1;
  570. }
  571. if (set2_mask) {
  572. *set2_mask = SENS.sar_touch_enable.touch_pad_outen2;
  573. }
  574. if (en_mask) {
  575. *en_mask = SENS.sar_touch_enable.touch_pad_worken;
  576. }
  577. portEXIT_CRITICAL(&rtc_spinlock);
  578. return ESP_OK;
  579. }
  580. esp_err_t touch_pad_clear_group_mask(uint16_t set1_mask, uint16_t set2_mask, uint16_t en_mask)
  581. {
  582. RTC_MODULE_CHECK((set1_mask <= TOUCH_PAD_BIT_MASK_MAX), "touch set1 bitmask error", ESP_ERR_INVALID_ARG);
  583. RTC_MODULE_CHECK((set2_mask <= TOUCH_PAD_BIT_MASK_MAX), "touch set2 bitmask error", ESP_ERR_INVALID_ARG);
  584. RTC_MODULE_CHECK((en_mask <= TOUCH_PAD_BIT_MASK_MAX), "touch work_en bitmask error", ESP_ERR_INVALID_ARG);
  585. portENTER_CRITICAL(&rtc_spinlock);
  586. SENS.sar_touch_enable.touch_pad_outen1 &= (~set1_mask);
  587. SENS.sar_touch_enable.touch_pad_outen2 &= (~set2_mask);
  588. SENS.sar_touch_enable.touch_pad_worken &= (~en_mask);
  589. portEXIT_CRITICAL(&rtc_spinlock);
  590. return ESP_OK;
  591. }
  592. uint32_t IRAM_ATTR touch_pad_get_status()
  593. {
  594. return SENS.sar_touch_ctrl2.touch_meas_en;
  595. }
  596. esp_err_t IRAM_ATTR touch_pad_clear_status()
  597. {
  598. portENTER_CRITICAL(&rtc_spinlock);
  599. SENS.sar_touch_ctrl2.touch_meas_en_clr = 1;
  600. portEXIT_CRITICAL(&rtc_spinlock);
  601. return ESP_OK;
  602. }
  603. esp_err_t touch_pad_intr_enable()
  604. {
  605. portENTER_CRITICAL(&rtc_spinlock);
  606. RTCCNTL.int_ena.rtc_touch = 1;
  607. portEXIT_CRITICAL(&rtc_spinlock);
  608. return ESP_OK;
  609. }
  610. esp_err_t touch_pad_intr_disable()
  611. {
  612. portENTER_CRITICAL(&rtc_spinlock);
  613. RTCCNTL.int_ena.rtc_touch = 0;
  614. portEXIT_CRITICAL(&rtc_spinlock);
  615. return ESP_OK;
  616. }
  617. esp_err_t touch_pad_config(touch_pad_t touch_num, uint16_t threshold)
  618. {
  619. RTC_MODULE_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_FAIL);
  620. RTC_MODULE_CHECK(touch_num < TOUCH_PAD_MAX, "Touch_Pad Num Err", ESP_ERR_INVALID_ARG);
  621. touch_pad_set_thresh(touch_num, threshold);
  622. touch_pad_io_init(touch_num);
  623. touch_pad_set_cnt_mode(touch_num, TOUCH_PAD_SLOPE_7, TOUCH_PAD_TIE_OPT_HIGH);
  624. touch_pad_set_group_mask((1 << touch_num), (1 << touch_num), (1 << touch_num));
  625. return ESP_OK;
  626. }
  627. esp_err_t touch_pad_init()
  628. {
  629. if (rtc_touch_mux == NULL) {
  630. rtc_touch_mux = xSemaphoreCreateMutex();
  631. }
  632. if (rtc_touch_mux == NULL) {
  633. return ESP_FAIL;
  634. }
  635. touch_pad_intr_disable();
  636. touch_pad_set_fsm_mode(TOUCH_FSM_MODE_DEFAULT);
  637. touch_pad_set_trigger_mode(TOUCH_TRIGGER_MODE_DEFAULT);
  638. touch_pad_set_trigger_source(TOUCH_TRIGGER_SOURCE_DEFAULT);
  639. touch_pad_clear_status();
  640. touch_pad_set_meas_time(TOUCH_PAD_SLEEP_CYCLE_DEFAULT, TOUCH_PAD_MEASURE_CYCLE_DEFAULT);
  641. return ESP_OK;
  642. }
  643. esp_err_t touch_pad_deinit()
  644. {
  645. if (rtc_touch_mux == NULL) {
  646. return ESP_FAIL;
  647. }
  648. touch_pad_filter_delete();
  649. touch_pad_set_fsm_mode(TOUCH_FSM_MODE_SW);
  650. touch_pad_clear_status();
  651. touch_pad_intr_disable();
  652. vSemaphoreDelete(rtc_touch_mux);
  653. rtc_touch_mux = NULL;
  654. return ESP_OK;
  655. }
  656. esp_err_t touch_pad_read(touch_pad_t touch_num, uint16_t *touch_value)
  657. {
  658. RTC_MODULE_CHECK(touch_num < TOUCH_PAD_MAX, "Touch_Pad Num Err", ESP_ERR_INVALID_ARG);
  659. RTC_MODULE_CHECK(touch_value != NULL, "touch_value", ESP_ERR_INVALID_ARG);
  660. RTC_MODULE_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_FAIL);
  661. xSemaphoreTake(rtc_touch_mux, portMAX_DELAY);
  662. while (SENS.sar_touch_ctrl2.touch_meas_done == 0) {};
  663. *touch_value = (touch_num & 0x1) ? \
  664. SENS.touch_meas[touch_num / 2].l_val: \
  665. SENS.touch_meas[touch_num / 2].h_val;
  666. xSemaphoreGive(rtc_touch_mux);
  667. return ESP_OK;
  668. }
  669. IRAM_ATTR esp_err_t touch_pad_read_filtered(touch_pad_t touch_num, uint16_t *touch_value)
  670. {
  671. RTC_MODULE_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_FAIL);
  672. RTC_MODULE_CHECK(touch_num < TOUCH_PAD_MAX, "Touch_Pad Num Err", ESP_ERR_INVALID_ARG);
  673. RTC_MODULE_CHECK(touch_value != NULL, "touch_value", ESP_ERR_INVALID_ARG);
  674. RTC_MODULE_CHECK(s_touch_pad_filter != NULL, "Touch pad filter not initialized", ESP_ERR_INVALID_STATE);
  675. *touch_value = (s_touch_pad_filter->filtered_val[touch_num] >> TOUCH_PAD_SHIFT_DEFAULT);
  676. return ESP_OK;
  677. }
  678. esp_err_t touch_pad_set_filter_period(uint32_t new_period_ms)
  679. {
  680. RTC_MODULE_CHECK(s_touch_pad_filter != NULL, "Touch pad filter not initialized", ESP_ERR_INVALID_STATE);
  681. RTC_MODULE_CHECK(new_period_ms > 0, "Touch pad filter period error", ESP_ERR_INVALID_ARG);
  682. RTC_MODULE_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_ERR_INVALID_STATE);
  683. esp_err_t ret = ESP_OK;
  684. xSemaphoreTake(rtc_touch_mux, portMAX_DELAY);
  685. if (s_touch_pad_filter != NULL) {
  686. xTimerChangePeriod(s_touch_pad_filter->timer, new_period_ms / portTICK_PERIOD_MS, portMAX_DELAY);
  687. s_touch_pad_filter->period = new_period_ms;
  688. } else {
  689. ESP_LOGE(RTC_MODULE_TAG, "Touch pad filter deleted");
  690. ret = ESP_ERR_INVALID_STATE;
  691. }
  692. xSemaphoreGive(rtc_touch_mux);
  693. return ret;
  694. }
  695. esp_err_t touch_pad_get_filter_period(uint32_t* p_period_ms)
  696. {
  697. RTC_MODULE_CHECK(s_touch_pad_filter != NULL, "Touch pad filter not initialized", ESP_ERR_INVALID_STATE);
  698. RTC_MODULE_CHECK(p_period_ms != NULL, "Touch pad period pointer error", ESP_ERR_INVALID_ARG);
  699. RTC_MODULE_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_ERR_INVALID_STATE);
  700. esp_err_t ret = ESP_OK;
  701. xSemaphoreTake(rtc_touch_mux, portMAX_DELAY);
  702. if (s_touch_pad_filter != NULL) {
  703. *p_period_ms = s_touch_pad_filter->period;
  704. } else {
  705. ESP_LOGE(RTC_MODULE_TAG, "Touch pad filter deleted");
  706. ret = ESP_ERR_INVALID_STATE;
  707. }
  708. xSemaphoreGive(rtc_touch_mux);
  709. return ret;
  710. }
  711. esp_err_t touch_pad_filter_start(uint32_t filter_period_ms)
  712. {
  713. RTC_MODULE_CHECK(filter_period_ms >= portTICK_PERIOD_MS, "Touch pad filter period error", ESP_ERR_INVALID_ARG);
  714. RTC_MODULE_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_ERR_INVALID_STATE);
  715. esp_err_t ret = ESP_OK;
  716. xSemaphoreTake(rtc_touch_mux, portMAX_DELAY);
  717. if (s_touch_pad_filter == NULL) {
  718. s_touch_pad_filter = (touch_pad_filter_t *) calloc(1, sizeof(touch_pad_filter_t));
  719. if (s_touch_pad_filter == NULL) {
  720. ret = ESP_ERR_NO_MEM;
  721. }
  722. }
  723. if (s_touch_pad_filter->timer == NULL) {
  724. s_touch_pad_filter->timer = xTimerCreate("filter_tmr", filter_period_ms / portTICK_PERIOD_MS, pdTRUE,
  725. NULL, touch_pad_filter_cb);
  726. if (s_touch_pad_filter->timer == NULL) {
  727. ret = ESP_ERR_NO_MEM;
  728. }
  729. xTimerStart(s_touch_pad_filter->timer, portMAX_DELAY);
  730. s_touch_pad_filter->enable = true;
  731. } else {
  732. xTimerChangePeriod(s_touch_pad_filter->timer, filter_period_ms / portTICK_PERIOD_MS, portMAX_DELAY);
  733. s_touch_pad_filter->period = filter_period_ms;
  734. xTimerStart(s_touch_pad_filter->timer, portMAX_DELAY);
  735. }
  736. xSemaphoreGive(rtc_touch_mux);
  737. return ret;
  738. }
  739. esp_err_t touch_pad_filter_stop()
  740. {
  741. RTC_MODULE_CHECK(s_touch_pad_filter != NULL, "Touch pad filter not initialized", ESP_ERR_INVALID_STATE);
  742. esp_err_t ret = ESP_OK;
  743. xSemaphoreTake(rtc_touch_mux, portMAX_DELAY);
  744. if (s_touch_pad_filter != NULL) {
  745. xTimerStop(s_touch_pad_filter->timer, portMAX_DELAY);
  746. s_touch_pad_filter->enable = false;
  747. } else {
  748. ESP_LOGE(RTC_MODULE_TAG, "Touch pad filter deleted");
  749. ret = ESP_ERR_INVALID_STATE;
  750. }
  751. xSemaphoreGive(rtc_touch_mux);
  752. return ret;
  753. }
  754. esp_err_t touch_pad_filter_delete()
  755. {
  756. RTC_MODULE_CHECK(s_touch_pad_filter != NULL, "Touch pad filter not initialized", ESP_ERR_INVALID_STATE);
  757. xSemaphoreTake(rtc_touch_mux, portMAX_DELAY);
  758. if (s_touch_pad_filter != NULL) {
  759. if (s_touch_pad_filter->timer != NULL) {
  760. xTimerStop(s_touch_pad_filter->timer, portMAX_DELAY);
  761. xTimerDelete(s_touch_pad_filter->timer, portMAX_DELAY);
  762. s_touch_pad_filter->timer = NULL;
  763. }
  764. free(s_touch_pad_filter);
  765. s_touch_pad_filter = NULL;
  766. }
  767. xSemaphoreGive(rtc_touch_mux);
  768. return ESP_OK;
  769. }
  770. /*---------------------------------------------------------------
  771. ADC
  772. ---------------------------------------------------------------*/
  773. static esp_err_t adc1_pad_get_io_num(adc1_channel_t channel, gpio_num_t *gpio_num)
  774. {
  775. RTC_MODULE_CHECK(channel < ADC1_CHANNEL_MAX, "ADC Channel Err", ESP_ERR_INVALID_ARG);
  776. switch (channel) {
  777. case ADC1_CHANNEL_0:
  778. *gpio_num = ADC1_CHANNEL_0_GPIO_NUM;
  779. break;
  780. case ADC1_CHANNEL_1:
  781. *gpio_num = ADC1_CHANNEL_1_GPIO_NUM;
  782. break;
  783. case ADC1_CHANNEL_2:
  784. *gpio_num = ADC1_CHANNEL_2_GPIO_NUM;
  785. break;
  786. case ADC1_CHANNEL_3:
  787. *gpio_num = ADC1_CHANNEL_3_GPIO_NUM;
  788. break;
  789. case ADC1_CHANNEL_4:
  790. *gpio_num = ADC1_CHANNEL_4_GPIO_NUM;
  791. break;
  792. case ADC1_CHANNEL_5:
  793. *gpio_num = ADC1_CHANNEL_5_GPIO_NUM;
  794. break;
  795. case ADC1_CHANNEL_6:
  796. *gpio_num = ADC1_CHANNEL_6_GPIO_NUM;
  797. break;
  798. case ADC1_CHANNEL_7:
  799. *gpio_num = ADC1_CHANNEL_7_GPIO_NUM;
  800. break;
  801. default:
  802. return ESP_ERR_INVALID_ARG;
  803. }
  804. return ESP_OK;
  805. }
  806. static esp_err_t adc1_pad_init(adc1_channel_t channel)
  807. {
  808. gpio_num_t gpio_num = 0;
  809. ADC1_CHECK_FUNCTION_RET(adc1_pad_get_io_num(channel, &gpio_num));
  810. ADC1_CHECK_FUNCTION_RET(rtc_gpio_init(gpio_num));
  811. ADC1_CHECK_FUNCTION_RET(rtc_gpio_output_disable(gpio_num));
  812. ADC1_CHECK_FUNCTION_RET(rtc_gpio_input_disable(gpio_num));
  813. ADC1_CHECK_FUNCTION_RET(gpio_set_pull_mode(gpio_num, GPIO_FLOATING));
  814. return ESP_OK;
  815. }
  816. esp_err_t adc1_config_channel_atten(adc1_channel_t channel, adc_atten_t atten)
  817. {
  818. RTC_MODULE_CHECK(channel < ADC1_CHANNEL_MAX, "ADC Channel Err", ESP_ERR_INVALID_ARG);
  819. RTC_MODULE_CHECK(atten <= ADC_ATTEN_11db, "ADC Atten Err", ESP_ERR_INVALID_ARG);
  820. adc1_pad_init(channel);
  821. portENTER_CRITICAL(&rtc_spinlock);
  822. SET_PERI_REG_BITS(SENS_SAR_ATTEN1_REG, 3, atten, (channel * 2)); //SAR1_atten
  823. portEXIT_CRITICAL(&rtc_spinlock);
  824. return ESP_OK;
  825. }
  826. esp_err_t adc1_config_width(adc_bits_width_t width_bit)
  827. {
  828. portENTER_CRITICAL(&rtc_spinlock);
  829. SET_PERI_REG_BITS(SENS_SAR_START_FORCE_REG, SENS_SAR1_BIT_WIDTH_V, width_bit, SENS_SAR1_BIT_WIDTH_S); //SAR2_BIT_WIDTH[1:0]=0x3, SAR1_BIT_WIDTH[1:0]=0x3
  830. //Invert the adc value,the Output value is invert
  831. SET_PERI_REG_MASK(SENS_SAR_READ_CTRL_REG, SENS_SAR1_DATA_INV);
  832. //Set The adc sample width,invert adc value,must
  833. SET_PERI_REG_BITS(SENS_SAR_READ_CTRL_REG, SENS_SAR1_SAMPLE_BIT_V, width_bit, SENS_SAR1_SAMPLE_BIT_S); //digital sar1_bit_width[1:0]=3
  834. portEXIT_CRITICAL(&rtc_spinlock);
  835. return ESP_OK;
  836. }
  837. int adc1_get_raw(adc1_channel_t channel)
  838. {
  839. uint16_t adc_value;
  840. RTC_MODULE_CHECK(channel < ADC1_CHANNEL_MAX, "ADC Channel Err", ESP_ERR_INVALID_ARG);
  841. portENTER_CRITICAL(&rtc_spinlock);
  842. //Adc Controler is Rtc module,not ulp coprocessor
  843. SET_PERI_REG_BITS(SENS_SAR_MEAS_START1_REG, 1, 1, SENS_MEAS1_START_FORCE_S); //force pad mux and force start
  844. //Bit1=0:Fsm Bit1=1(Bit0=0:PownDown Bit10=1:Powerup)
  845. SET_PERI_REG_BITS(SENS_SAR_MEAS_WAIT2_REG, SENS_FORCE_XPD_SAR, 0, SENS_FORCE_XPD_SAR_S); //force XPD_SAR=0, use XPD_FSM
  846. //Disable Amp Bit1=0:Fsm Bit1=1(Bit0=0:PownDown Bit10=1:Powerup)
  847. SET_PERI_REG_BITS(SENS_SAR_MEAS_WAIT2_REG, SENS_FORCE_XPD_AMP, 0x2, SENS_FORCE_XPD_AMP_S); //force XPD_AMP=0
  848. //Open the ADC1 Data port Not ulp coprocessor
  849. SET_PERI_REG_BITS(SENS_SAR_MEAS_START1_REG, 1, 1, SENS_SAR1_EN_PAD_FORCE_S); //open the ADC1 data port
  850. //Select channel
  851. SET_PERI_REG_BITS(SENS_SAR_MEAS_START1_REG, SENS_SAR1_EN_PAD, (1 << channel), SENS_SAR1_EN_PAD_S); //pad enable
  852. SET_PERI_REG_BITS(SENS_SAR_MEAS_CTRL_REG, 0xfff, 0x0, SENS_AMP_RST_FB_FSM_S); //[11:8]:short ref ground, [7:4]:short ref, [3:0]:rst fb
  853. SET_PERI_REG_BITS(SENS_SAR_MEAS_WAIT1_REG, SENS_SAR_AMP_WAIT1, 0x1, SENS_SAR_AMP_WAIT1_S);
  854. SET_PERI_REG_BITS(SENS_SAR_MEAS_WAIT1_REG, SENS_SAR_AMP_WAIT2, 0x1, SENS_SAR_AMP_WAIT2_S);
  855. SET_PERI_REG_BITS(SENS_SAR_MEAS_WAIT2_REG, SENS_SAR_AMP_WAIT3, 0x1, SENS_SAR_AMP_WAIT3_S);
  856. while (GET_PERI_REG_BITS2(SENS_SAR_SLAVE_ADDR1_REG, 0x7, SENS_MEAS_STATUS_S) != 0); //wait det_fsm==0
  857. SET_PERI_REG_BITS(SENS_SAR_MEAS_START1_REG, 1, 0, SENS_MEAS1_START_SAR_S); //start force 0
  858. SET_PERI_REG_BITS(SENS_SAR_MEAS_START1_REG, 1, 1, SENS_MEAS1_START_SAR_S); //start force 1
  859. while (GET_PERI_REG_MASK(SENS_SAR_MEAS_START1_REG, SENS_MEAS1_DONE_SAR) == 0) {}; //read done
  860. adc_value = GET_PERI_REG_BITS2(SENS_SAR_MEAS_START1_REG, SENS_MEAS1_DATA_SAR, SENS_MEAS1_DATA_SAR_S);
  861. portEXIT_CRITICAL(&rtc_spinlock);
  862. return adc_value;
  863. }
  864. int adc1_get_voltage(adc1_channel_t channel) //Deprecated. Use adc1_get_raw() instead
  865. {
  866. return adc1_get_raw(channel);
  867. }
  868. void adc1_ulp_enable(void)
  869. {
  870. portENTER_CRITICAL(&rtc_spinlock);
  871. CLEAR_PERI_REG_MASK(SENS_SAR_MEAS_START1_REG, SENS_MEAS1_START_FORCE);
  872. CLEAR_PERI_REG_MASK(SENS_SAR_MEAS_START1_REG, SENS_SAR1_EN_PAD_FORCE_M);
  873. SET_PERI_REG_BITS(SENS_SAR_MEAS_WAIT2_REG, SENS_FORCE_XPD_AMP, 0x2, SENS_FORCE_XPD_AMP_S);
  874. SET_PERI_REG_BITS(SENS_SAR_MEAS_WAIT2_REG, SENS_FORCE_XPD_SAR, 0, SENS_FORCE_XPD_SAR_S);
  875. SET_PERI_REG_BITS(SENS_SAR_MEAS_CTRL_REG, 0xfff, 0x0, SENS_AMP_RST_FB_FSM_S); //[11:8]:short ref ground, [7:4]:short ref, [3:0]:rst fb
  876. SET_PERI_REG_BITS(SENS_SAR_MEAS_WAIT1_REG, SENS_SAR_AMP_WAIT1, 0x1, SENS_SAR_AMP_WAIT1_S);
  877. SET_PERI_REG_BITS(SENS_SAR_MEAS_WAIT1_REG, SENS_SAR_AMP_WAIT2, 0x1, SENS_SAR_AMP_WAIT2_S);
  878. SET_PERI_REG_BITS(SENS_SAR_MEAS_WAIT2_REG, SENS_SAR_AMP_WAIT3, 0x1, SENS_SAR_AMP_WAIT3_S);
  879. portEXIT_CRITICAL(&rtc_spinlock);
  880. }
  881. esp_err_t adc2_vref_to_gpio(gpio_num_t gpio)
  882. {
  883. int channel;
  884. if(gpio == GPIO_NUM_25){
  885. channel = 8; //Channel 8 bit
  886. }else if (gpio == GPIO_NUM_26){
  887. channel = 9; //Channel 9 bit
  888. }else if (gpio == GPIO_NUM_27){
  889. channel = 7; //Channel 7 bit
  890. }else{
  891. return ESP_ERR_INVALID_ARG;
  892. }
  893. //Configure RTC gpio
  894. rtc_gpio_init(gpio);
  895. rtc_gpio_output_disable(gpio);
  896. rtc_gpio_input_disable(gpio);
  897. rtc_gpio_pullup_dis(gpio);
  898. rtc_gpio_pulldown_dis(gpio);
  899. SET_PERI_REG_BITS(RTC_CNTL_BIAS_CONF_REG, RTC_CNTL_DBG_ATTEN, 0, RTC_CNTL_DBG_ATTEN_S); //Check DBG effect outside sleep mode
  900. //set dtest (MUX_SEL : 0 -> RTC; 1-> vdd_sar2)
  901. SET_PERI_REG_BITS(RTC_CNTL_TEST_MUX_REG, RTC_CNTL_DTEST_RTC, 1, RTC_CNTL_DTEST_RTC_S); //Config test mux to route v_ref to ADC2 Channels
  902. //set ent
  903. SET_PERI_REG_MASK(RTC_CNTL_TEST_MUX_REG, RTC_CNTL_ENT_RTC_M);
  904. //set sar2_en_test
  905. SET_PERI_REG_MASK(SENS_SAR_START_FORCE_REG, SENS_SAR2_EN_TEST_M);
  906. //force fsm
  907. SET_PERI_REG_BITS(SENS_SAR_MEAS_WAIT2_REG, SENS_FORCE_XPD_SAR, 3, SENS_FORCE_XPD_SAR_S); //Select power source of ADC
  908. //set sar2 en force
  909. SET_PERI_REG_MASK(SENS_SAR_MEAS_START2_REG, SENS_SAR2_EN_PAD_FORCE_M); //Pad bitmap controlled by SW
  910. //set en_pad for channels 7,8,9 (bits 0x380)
  911. SET_PERI_REG_BITS(SENS_SAR_MEAS_START2_REG, SENS_SAR2_EN_PAD, 1<<channel, SENS_SAR2_EN_PAD_S);
  912. return ESP_OK;
  913. }
  914. /*---------------------------------------------------------------
  915. DAC
  916. ---------------------------------------------------------------*/
  917. static esp_err_t dac_pad_get_io_num(dac_channel_t channel, gpio_num_t *gpio_num)
  918. {
  919. RTC_MODULE_CHECK((channel >= DAC_CHANNEL_1) && (channel < DAC_CHANNEL_MAX), DAC_ERR_STR_CHANNEL_ERROR, ESP_ERR_INVALID_ARG);
  920. RTC_MODULE_CHECK(gpio_num, "Param null", ESP_ERR_INVALID_ARG);
  921. switch (channel) {
  922. case DAC_CHANNEL_1:
  923. *gpio_num = DAC_CHANNEL_1_GPIO_NUM;
  924. break;
  925. case DAC_CHANNEL_2:
  926. *gpio_num = DAC_CHANNEL_2_GPIO_NUM;
  927. break;
  928. default:
  929. return ESP_ERR_INVALID_ARG;
  930. }
  931. return ESP_OK;
  932. }
  933. static esp_err_t dac_rtc_pad_init(dac_channel_t channel)
  934. {
  935. RTC_MODULE_CHECK((channel >= DAC_CHANNEL_1) && (channel < DAC_CHANNEL_MAX), DAC_ERR_STR_CHANNEL_ERROR, ESP_ERR_INVALID_ARG);
  936. gpio_num_t gpio_num = 0;
  937. dac_pad_get_io_num(channel, &gpio_num);
  938. rtc_gpio_init(gpio_num);
  939. rtc_gpio_output_disable(gpio_num);
  940. rtc_gpio_input_disable(gpio_num);
  941. rtc_gpio_pullup_dis(gpio_num);
  942. rtc_gpio_pulldown_dis(gpio_num);
  943. return ESP_OK;
  944. }
  945. esp_err_t dac_output_enable(dac_channel_t channel)
  946. {
  947. RTC_MODULE_CHECK((channel >= DAC_CHANNEL_1) && (channel < DAC_CHANNEL_MAX), DAC_ERR_STR_CHANNEL_ERROR, ESP_ERR_INVALID_ARG);
  948. dac_rtc_pad_init(channel);
  949. portENTER_CRITICAL(&rtc_spinlock);
  950. if (channel == DAC_CHANNEL_1) {
  951. SET_PERI_REG_MASK(RTC_IO_PAD_DAC1_REG, RTC_IO_PDAC1_XPD_DAC | RTC_IO_PDAC1_DAC_XPD_FORCE);
  952. } else if (channel == DAC_CHANNEL_2) {
  953. SET_PERI_REG_MASK(RTC_IO_PAD_DAC2_REG, RTC_IO_PDAC2_XPD_DAC | RTC_IO_PDAC2_DAC_XPD_FORCE);
  954. }
  955. portEXIT_CRITICAL(&rtc_spinlock);
  956. return ESP_OK;
  957. }
  958. esp_err_t dac_output_disable(dac_channel_t channel)
  959. {
  960. RTC_MODULE_CHECK((channel >= DAC_CHANNEL_1) && (channel < DAC_CHANNEL_MAX), DAC_ERR_STR_CHANNEL_ERROR, ESP_ERR_INVALID_ARG);
  961. portENTER_CRITICAL(&rtc_spinlock);
  962. if (channel == DAC_CHANNEL_1) {
  963. CLEAR_PERI_REG_MASK(RTC_IO_PAD_DAC1_REG, RTC_IO_PDAC1_XPD_DAC | RTC_IO_PDAC1_DAC_XPD_FORCE);
  964. } else if (channel == DAC_CHANNEL_2) {
  965. CLEAR_PERI_REG_MASK(RTC_IO_PAD_DAC2_REG, RTC_IO_PDAC2_XPD_DAC | RTC_IO_PDAC2_DAC_XPD_FORCE);
  966. }
  967. portEXIT_CRITICAL(&rtc_spinlock);
  968. return ESP_OK;
  969. }
  970. esp_err_t dac_output_voltage(dac_channel_t channel, uint8_t dac_value)
  971. {
  972. RTC_MODULE_CHECK((channel >= DAC_CHANNEL_1) && (channel < DAC_CHANNEL_MAX), DAC_ERR_STR_CHANNEL_ERROR, ESP_ERR_INVALID_ARG);
  973. portENTER_CRITICAL(&rtc_spinlock);
  974. //Disable Tone
  975. CLEAR_PERI_REG_MASK(SENS_SAR_DAC_CTRL1_REG, SENS_SW_TONE_EN);
  976. //Disable Channel Tone
  977. if (channel == DAC_CHANNEL_1) {
  978. CLEAR_PERI_REG_MASK(SENS_SAR_DAC_CTRL2_REG, SENS_DAC_CW_EN1_M);
  979. } else if (channel == DAC_CHANNEL_2) {
  980. CLEAR_PERI_REG_MASK(SENS_SAR_DAC_CTRL2_REG, SENS_DAC_CW_EN2_M);
  981. }
  982. //Set the Dac value
  983. if (channel == DAC_CHANNEL_1) {
  984. SET_PERI_REG_BITS(RTC_IO_PAD_DAC1_REG, RTC_IO_PDAC1_DAC, dac_value, RTC_IO_PDAC1_DAC_S); //dac_output
  985. } else if (channel == DAC_CHANNEL_2) {
  986. SET_PERI_REG_BITS(RTC_IO_PAD_DAC2_REG, RTC_IO_PDAC2_DAC, dac_value, RTC_IO_PDAC2_DAC_S); //dac_output
  987. }
  988. portEXIT_CRITICAL(&rtc_spinlock);
  989. return ESP_OK;
  990. }
  991. esp_err_t dac_out_voltage(dac_channel_t channel, uint8_t dac_value)
  992. {
  993. RTC_MODULE_CHECK((channel >= DAC_CHANNEL_1) && (channel < DAC_CHANNEL_MAX), DAC_ERR_STR_CHANNEL_ERROR, ESP_ERR_INVALID_ARG);
  994. portENTER_CRITICAL(&rtc_spinlock);
  995. //Disable Tone
  996. CLEAR_PERI_REG_MASK(SENS_SAR_DAC_CTRL1_REG, SENS_SW_TONE_EN);
  997. //Disable Channel Tone
  998. if (channel == DAC_CHANNEL_1) {
  999. CLEAR_PERI_REG_MASK(SENS_SAR_DAC_CTRL2_REG, SENS_DAC_CW_EN1_M);
  1000. } else if (channel == DAC_CHANNEL_2) {
  1001. CLEAR_PERI_REG_MASK(SENS_SAR_DAC_CTRL2_REG, SENS_DAC_CW_EN2_M);
  1002. }
  1003. //Set the Dac value
  1004. if (channel == DAC_CHANNEL_1) {
  1005. SET_PERI_REG_BITS(RTC_IO_PAD_DAC1_REG, RTC_IO_PDAC1_DAC, dac_value, RTC_IO_PDAC1_DAC_S); //dac_output
  1006. } else if (channel == DAC_CHANNEL_2) {
  1007. SET_PERI_REG_BITS(RTC_IO_PAD_DAC2_REG, RTC_IO_PDAC2_DAC, dac_value, RTC_IO_PDAC2_DAC_S); //dac_output
  1008. }
  1009. portEXIT_CRITICAL(&rtc_spinlock);
  1010. //dac pad init
  1011. dac_rtc_pad_init(channel);
  1012. dac_output_enable(channel);
  1013. return ESP_OK;
  1014. }
  1015. esp_err_t dac_i2s_enable()
  1016. {
  1017. portENTER_CRITICAL(&rtc_spinlock);
  1018. SET_PERI_REG_MASK(SENS_SAR_DAC_CTRL1_REG, SENS_DAC_DIG_FORCE_M | SENS_DAC_CLK_INV_M);
  1019. portEXIT_CRITICAL(&rtc_spinlock);
  1020. return ESP_OK;
  1021. }
  1022. esp_err_t dac_i2s_disable()
  1023. {
  1024. portENTER_CRITICAL(&rtc_spinlock);
  1025. CLEAR_PERI_REG_MASK(SENS_SAR_DAC_CTRL1_REG, SENS_DAC_DIG_FORCE_M | SENS_DAC_CLK_INV_M);
  1026. portEXIT_CRITICAL(&rtc_spinlock);
  1027. return ESP_OK;
  1028. }
  1029. /*---------------------------------------------------------------
  1030. HALL SENSOR
  1031. ---------------------------------------------------------------*/
  1032. static int hall_sensor_get_value() //hall sensor without LNA
  1033. {
  1034. int Sens_Vp0;
  1035. int Sens_Vn0;
  1036. int Sens_Vp1;
  1037. int Sens_Vn1;
  1038. int hall_value;
  1039. portENTER_CRITICAL(&rtc_spinlock);
  1040. SET_PERI_REG_MASK(SENS_SAR_TOUCH_CTRL1_REG, SENS_XPD_HALL_FORCE_M); // hall sens force enable
  1041. SET_PERI_REG_MASK(RTC_IO_HALL_SENS_REG, RTC_IO_XPD_HALL); // xpd hall
  1042. SET_PERI_REG_MASK(SENS_SAR_TOUCH_CTRL1_REG, SENS_HALL_PHASE_FORCE_M); // phase force
  1043. CLEAR_PERI_REG_MASK(RTC_IO_HALL_SENS_REG, RTC_IO_HALL_PHASE); // hall phase
  1044. Sens_Vp0 = adc1_get_raw(ADC1_CHANNEL_0);
  1045. Sens_Vn0 = adc1_get_raw(ADC1_CHANNEL_3);
  1046. SET_PERI_REG_MASK(RTC_IO_HALL_SENS_REG, RTC_IO_HALL_PHASE);
  1047. Sens_Vp1 = adc1_get_raw(ADC1_CHANNEL_0);
  1048. Sens_Vn1 = adc1_get_raw(ADC1_CHANNEL_3);
  1049. SET_PERI_REG_BITS(SENS_SAR_MEAS_WAIT2_REG, SENS_FORCE_XPD_SAR, 0, SENS_FORCE_XPD_SAR_S);
  1050. CLEAR_PERI_REG_MASK(SENS_SAR_TOUCH_CTRL1_REG, SENS_XPD_HALL_FORCE);
  1051. CLEAR_PERI_REG_MASK(SENS_SAR_TOUCH_CTRL1_REG, SENS_HALL_PHASE_FORCE);
  1052. portEXIT_CRITICAL(&rtc_spinlock);
  1053. hall_value = (Sens_Vp1 - Sens_Vp0) - (Sens_Vn1 - Sens_Vn0);
  1054. return hall_value;
  1055. }
  1056. int hall_sensor_read()
  1057. {
  1058. adc1_pad_init(ADC1_CHANNEL_0);
  1059. adc1_pad_init(ADC1_CHANNEL_3);
  1060. adc1_config_channel_atten(ADC1_CHANNEL_0, ADC_ATTEN_0db);
  1061. adc1_config_channel_atten(ADC1_CHANNEL_3, ADC_ATTEN_0db);
  1062. return hall_sensor_get_value();
  1063. }
  1064. /*---------------------------------------------------------------
  1065. INTERRUPT HANDLER
  1066. ---------------------------------------------------------------*/
  1067. typedef struct rtc_isr_handler_ {
  1068. uint32_t mask;
  1069. intr_handler_t handler;
  1070. void* handler_arg;
  1071. SLIST_ENTRY(rtc_isr_handler_) next;
  1072. } rtc_isr_handler_t;
  1073. static SLIST_HEAD(rtc_isr_handler_list_, rtc_isr_handler_) s_rtc_isr_handler_list =
  1074. SLIST_HEAD_INITIALIZER(s_rtc_isr_handler_list);
  1075. portMUX_TYPE s_rtc_isr_handler_list_lock = portMUX_INITIALIZER_UNLOCKED;
  1076. static intr_handle_t s_rtc_isr_handle;
  1077. static void rtc_isr(void* arg)
  1078. {
  1079. uint32_t status = REG_READ(RTC_CNTL_INT_ST_REG);
  1080. rtc_isr_handler_t* it;
  1081. portENTER_CRITICAL(&s_rtc_isr_handler_list_lock);
  1082. SLIST_FOREACH(it, &s_rtc_isr_handler_list, next) {
  1083. if (it->mask & status) {
  1084. portEXIT_CRITICAL(&s_rtc_isr_handler_list_lock);
  1085. (*it->handler)(it->handler_arg);
  1086. portENTER_CRITICAL(&s_rtc_isr_handler_list_lock);
  1087. }
  1088. }
  1089. portEXIT_CRITICAL(&s_rtc_isr_handler_list_lock);
  1090. REG_WRITE(RTC_CNTL_INT_CLR_REG, status);
  1091. }
  1092. static esp_err_t rtc_isr_ensure_installed()
  1093. {
  1094. esp_err_t err = ESP_OK;
  1095. portENTER_CRITICAL(&s_rtc_isr_handler_list_lock);
  1096. if (s_rtc_isr_handle) {
  1097. goto out;
  1098. }
  1099. REG_WRITE(RTC_CNTL_INT_ENA_REG, 0);
  1100. REG_WRITE(RTC_CNTL_INT_CLR_REG, UINT32_MAX);
  1101. err = esp_intr_alloc(ETS_RTC_CORE_INTR_SOURCE, 0, &rtc_isr, NULL, &s_rtc_isr_handle);
  1102. if (err != ESP_OK) {
  1103. goto out;
  1104. }
  1105. out:
  1106. portEXIT_CRITICAL(&s_rtc_isr_handler_list_lock);
  1107. return err;
  1108. }
  1109. esp_err_t rtc_isr_register(intr_handler_t handler, void* handler_arg, uint32_t rtc_intr_mask)
  1110. {
  1111. esp_err_t err = rtc_isr_ensure_installed();
  1112. if (err != ESP_OK) {
  1113. return err;
  1114. }
  1115. rtc_isr_handler_t* item = malloc(sizeof(*item));
  1116. if (item == NULL) {
  1117. return ESP_ERR_NO_MEM;
  1118. }
  1119. item->handler = handler;
  1120. item->handler_arg = handler_arg;
  1121. item->mask = rtc_intr_mask;
  1122. portENTER_CRITICAL(&s_rtc_isr_handler_list_lock);
  1123. SLIST_INSERT_HEAD(&s_rtc_isr_handler_list, item, next);
  1124. portEXIT_CRITICAL(&s_rtc_isr_handler_list_lock);
  1125. return ESP_OK;
  1126. }
  1127. esp_err_t rtc_isr_deregister(intr_handler_t handler, void* handler_arg)
  1128. {
  1129. rtc_isr_handler_t* it;
  1130. rtc_isr_handler_t* prev = NULL;
  1131. bool found = false;
  1132. portENTER_CRITICAL(&s_rtc_isr_handler_list_lock);
  1133. SLIST_FOREACH(it, &s_rtc_isr_handler_list, next) {
  1134. if (it->handler == handler && it->handler_arg == handler_arg) {
  1135. if (it == SLIST_FIRST(&s_rtc_isr_handler_list)) {
  1136. SLIST_REMOVE_HEAD(&s_rtc_isr_handler_list, next);
  1137. } else {
  1138. SLIST_REMOVE_AFTER(prev, next);
  1139. }
  1140. found = true;
  1141. break;
  1142. }
  1143. prev = it;
  1144. }
  1145. portEXIT_CRITICAL(&s_rtc_isr_handler_list_lock);
  1146. return found ? ESP_OK : ESP_ERR_INVALID_STATE;
  1147. }