rtc_module.c 68 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753
  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 "soc/syscon_reg.h"
  22. #include "soc/syscon_struct.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. #ifndef NDEBUG
  36. // Enable built-in checks in queue.h in debug builds
  37. #define INVARIANTS
  38. #endif
  39. #include "rom/queue.h"
  40. #define ADC_FSM_RSTB_WAIT_DEFAULT (8)
  41. #define ADC_FSM_START_WAIT_DEFAULT (5)
  42. #define ADC_FSM_STANDBY_WAIT_DEFAULT (100)
  43. #define ADC_FSM_TIME_KEEP (-1)
  44. #define ADC_MAX_MEAS_NUM_DEFAULT (255)
  45. #define ADC_MEAS_NUM_LIM_DEFAULT (1)
  46. #define SAR_ADC_CLK_DIV_DEFUALT (2)
  47. #define ADC_PATT_LEN_MAX (16)
  48. #define TOUCH_PAD_FILTER_FACTOR_DEFAULT (16)
  49. #define TOUCH_PAD_SHIFT_DEFAULT (4)
  50. #define DAC_ERR_STR_CHANNEL_ERROR "DAC channel error"
  51. static const char *RTC_MODULE_TAG = "RTC_MODULE";
  52. #define RTC_MODULE_CHECK(a, str, ret_val) if (!(a)) { \
  53. ESP_LOGE(RTC_MODULE_TAG,"%s:%d (%s):%s", __FILE__, __LINE__, __FUNCTION__, str); \
  54. return (ret_val); \
  55. }
  56. #define RTC_RES_CHECK(res, ret_val) if ( (a) != ESP_OK) { \
  57. ESP_LOGE(RTC_MODULE_TAG,"%s:%d (%s)", __FILE__, __LINE__, __FUNCTION__); \
  58. return (ret_val); \
  59. }
  60. #define ADC_CHECK_UNIT(unit) RTC_MODULE_CHECK(adc_unit < ADC_UNIT_2, "ADC unit error, only support ADC1 for now", ESP_ERR_INVALID_ARG)
  61. #define ADC1_CHECK_FUNCTION_RET(fun_ret) if(fun_ret!=ESP_OK){\
  62. ESP_LOGE(RTC_MODULE_TAG,"%s:%d\n",__FUNCTION__,__LINE__);\
  63. return ESP_FAIL;\
  64. }
  65. #define ADC2_CHECK_FUNCTION_RET(fun_ret) do { if(fun_ret!=ESP_OK){\
  66. ESP_LOGE(RTC_MODULE_TAG,"%s:%d\n",__FUNCTION__,__LINE__);\
  67. return ESP_FAIL;\
  68. } }while (0)
  69. portMUX_TYPE rtc_spinlock = portMUX_INITIALIZER_UNLOCKED;
  70. static SemaphoreHandle_t rtc_touch_mux = NULL;
  71. /*
  72. In ADC2, there're two locks used for different cases:
  73. 1. lock shared with app and WIFI:
  74. when wifi using the ADC2, we assume it will never stop,
  75. so app checks the lock and returns immediately if failed.
  76. 2. lock shared between tasks:
  77. when several tasks sharing the ADC2, we want to guarantee
  78. all the requests will be handled.
  79. Since conversions are short (about 31us), app returns the lock very soon,
  80. we use a spinlock to stand there waiting to do conversions one by one.
  81. adc2_spinlock should be acquired first, then adc2_wifi_lock or rtc_spinlock.
  82. */
  83. //prevent ADC2 being used by wifi and other tasks at the same time.
  84. static _lock_t adc2_wifi_lock = NULL;
  85. //prevent ADC2 being used by tasks (regardless of WIFI)
  86. portMUX_TYPE adc2_spinlock = portMUX_INITIALIZER_UNLOCKED;
  87. typedef struct {
  88. TimerHandle_t timer;
  89. uint32_t filtered_val[TOUCH_PAD_MAX];
  90. uint32_t filter_period;
  91. uint32_t period;
  92. bool enable;
  93. } touch_pad_filter_t;
  94. static touch_pad_filter_t *s_touch_pad_filter = NULL;
  95. typedef enum {
  96. ADC_FORCE_FSM = 0x0,
  97. ADC_FORCE_DISABLE = 0x2,
  98. ADC_FORCE_ENABLE = 0x3,
  99. } adc_force_mode_t;
  100. //Reg,Mux,Fun,IE,Up,Down,Rtc_number
  101. const rtc_gpio_desc_t rtc_gpio_desc[GPIO_PIN_COUNT] = {
  102. {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
  103. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //1
  104. {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
  105. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //3
  106. {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
  107. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //5
  108. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //6
  109. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //7
  110. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //8
  111. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //9
  112. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //10
  113. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //11
  114. {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
  115. {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
  116. {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
  117. {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
  118. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //16
  119. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //17
  120. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //18
  121. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //19
  122. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //20
  123. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //21
  124. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //22
  125. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //23
  126. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //24
  127. {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
  128. {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_PDAC2_HOLD_FORCE_M, RTC_IO_PDAC2_DRV_V, RTC_IO_PDAC2_DRV_S, RTCIO_GPIO26_CHANNEL}, //26
  129. {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
  130. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //28
  131. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //29
  132. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //30
  133. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1}, //31
  134. {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
  135. {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
  136. {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
  137. {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
  138. {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
  139. {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
  140. {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
  141. {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
  142. };
  143. /*---------------------------------------------------------------
  144. RTC IO
  145. ---------------------------------------------------------------*/
  146. esp_err_t rtc_gpio_init(gpio_num_t gpio_num)
  147. {
  148. RTC_MODULE_CHECK(rtc_gpio_is_valid_gpio(gpio_num), "RTC_GPIO number error", ESP_ERR_INVALID_ARG);
  149. portENTER_CRITICAL(&rtc_spinlock);
  150. // 0: GPIO connected to digital GPIO module. 1: GPIO connected to analog RTC module.
  151. SET_PERI_REG_MASK(rtc_gpio_desc[gpio_num].reg, (rtc_gpio_desc[gpio_num].mux));
  152. //0:RTC FUNCIOTN 1,2,3:Reserved
  153. SET_PERI_REG_BITS(rtc_gpio_desc[gpio_num].reg, RTC_IO_TOUCH_PAD1_FUN_SEL_V, 0x0, rtc_gpio_desc[gpio_num].func);
  154. portEXIT_CRITICAL(&rtc_spinlock);
  155. return ESP_OK;
  156. }
  157. esp_err_t rtc_gpio_deinit(gpio_num_t gpio_num)
  158. {
  159. RTC_MODULE_CHECK(rtc_gpio_is_valid_gpio(gpio_num), "RTC_GPIO number error", ESP_ERR_INVALID_ARG);
  160. portENTER_CRITICAL(&rtc_spinlock);
  161. //Select Gpio as Digital Gpio
  162. CLEAR_PERI_REG_MASK(rtc_gpio_desc[gpio_num].reg, (rtc_gpio_desc[gpio_num].mux));
  163. portEXIT_CRITICAL(&rtc_spinlock);
  164. return ESP_OK;
  165. }
  166. static esp_err_t rtc_gpio_output_enable(gpio_num_t gpio_num)
  167. {
  168. int rtc_gpio_num = rtc_gpio_desc[gpio_num].rtc_num;
  169. RTC_MODULE_CHECK(rtc_gpio_num != -1, "RTC_GPIO number error", ESP_ERR_INVALID_ARG);
  170. SET_PERI_REG_MASK(RTC_GPIO_ENABLE_W1TS_REG, (1 << (rtc_gpio_num + RTC_GPIO_ENABLE_W1TS_S)));
  171. CLEAR_PERI_REG_MASK(RTC_GPIO_ENABLE_W1TC_REG, (1 << (rtc_gpio_num + RTC_GPIO_ENABLE_W1TC_S)));
  172. return ESP_OK;
  173. }
  174. static esp_err_t rtc_gpio_output_disable(gpio_num_t gpio_num)
  175. {
  176. int rtc_gpio_num = rtc_gpio_desc[gpio_num].rtc_num;
  177. RTC_MODULE_CHECK(rtc_gpio_num != -1, "RTC_GPIO number error", ESP_ERR_INVALID_ARG);
  178. CLEAR_PERI_REG_MASK(RTC_GPIO_ENABLE_W1TS_REG, (1 << (rtc_gpio_num + RTC_GPIO_ENABLE_W1TS_S)));
  179. SET_PERI_REG_MASK(RTC_GPIO_ENABLE_W1TC_REG, (1 << ( rtc_gpio_num + RTC_GPIO_ENABLE_W1TC_S)));
  180. return ESP_OK;
  181. }
  182. static esp_err_t rtc_gpio_input_enable(gpio_num_t gpio_num)
  183. {
  184. RTC_MODULE_CHECK(rtc_gpio_is_valid_gpio(gpio_num), "RTC_GPIO number error", ESP_ERR_INVALID_ARG);
  185. portENTER_CRITICAL(&rtc_spinlock);
  186. SET_PERI_REG_MASK(rtc_gpio_desc[gpio_num].reg, rtc_gpio_desc[gpio_num].ie);
  187. portEXIT_CRITICAL(&rtc_spinlock);
  188. return ESP_OK;
  189. }
  190. static esp_err_t rtc_gpio_input_disable(gpio_num_t gpio_num)
  191. {
  192. RTC_MODULE_CHECK(rtc_gpio_is_valid_gpio(gpio_num), "RTC_GPIO number error", ESP_ERR_INVALID_ARG);
  193. portENTER_CRITICAL(&rtc_spinlock);
  194. CLEAR_PERI_REG_MASK(rtc_gpio_desc[gpio_num].reg, rtc_gpio_desc[gpio_num].ie);
  195. portEXIT_CRITICAL(&rtc_spinlock);
  196. return ESP_OK;
  197. }
  198. esp_err_t rtc_gpio_set_level(gpio_num_t gpio_num, uint32_t level)
  199. {
  200. int rtc_gpio_num = rtc_gpio_num = rtc_gpio_desc[gpio_num].rtc_num;;
  201. RTC_MODULE_CHECK(rtc_gpio_is_valid_gpio(gpio_num), "RTC_GPIO number error", ESP_ERR_INVALID_ARG);
  202. if (level) {
  203. WRITE_PERI_REG(RTC_GPIO_OUT_W1TS_REG, (1 << (rtc_gpio_num + RTC_GPIO_OUT_DATA_W1TS_S)));
  204. } else {
  205. WRITE_PERI_REG(RTC_GPIO_OUT_W1TC_REG, (1 << (rtc_gpio_num + RTC_GPIO_OUT_DATA_W1TC_S)));
  206. }
  207. return ESP_OK;
  208. }
  209. uint32_t rtc_gpio_get_level(gpio_num_t gpio_num)
  210. {
  211. uint32_t level = 0;
  212. int rtc_gpio_num = rtc_gpio_desc[gpio_num].rtc_num;
  213. RTC_MODULE_CHECK(rtc_gpio_is_valid_gpio(gpio_num), "RTC_GPIO number error", ESP_ERR_INVALID_ARG);
  214. portENTER_CRITICAL(&rtc_spinlock);
  215. level = READ_PERI_REG(RTC_GPIO_IN_REG);
  216. portEXIT_CRITICAL(&rtc_spinlock);
  217. return ((level >> (RTC_GPIO_IN_NEXT_S + rtc_gpio_num)) & 0x01);
  218. }
  219. esp_err_t rtc_gpio_set_drive_capability(gpio_num_t gpio_num, gpio_drive_cap_t strength)
  220. {
  221. RTC_MODULE_CHECK(rtc_gpio_is_valid_gpio(gpio_num), "RTC_GPIO number error", ESP_ERR_INVALID_ARG);
  222. RTC_MODULE_CHECK(GPIO_IS_VALID_OUTPUT_GPIO(gpio_num), "Output pad only", ESP_ERR_INVALID_ARG);
  223. RTC_MODULE_CHECK(strength < GPIO_DRIVE_CAP_MAX, "GPIO drive capability error", ESP_ERR_INVALID_ARG);
  224. portENTER_CRITICAL(&rtc_spinlock);
  225. 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);
  226. portEXIT_CRITICAL(&rtc_spinlock);
  227. return ESP_OK;
  228. }
  229. esp_err_t rtc_gpio_get_drive_capability(gpio_num_t gpio_num, gpio_drive_cap_t* strength)
  230. {
  231. RTC_MODULE_CHECK(rtc_gpio_is_valid_gpio(gpio_num), "RTC_GPIO number error", ESP_ERR_INVALID_ARG);
  232. RTC_MODULE_CHECK(GPIO_IS_VALID_OUTPUT_GPIO(gpio_num), "Output pad only", ESP_ERR_INVALID_ARG);
  233. RTC_MODULE_CHECK(strength != NULL, "GPIO drive pointer error", ESP_ERR_INVALID_ARG);
  234. *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);
  235. return ESP_OK;
  236. }
  237. esp_err_t rtc_gpio_set_direction(gpio_num_t gpio_num, rtc_gpio_mode_t mode)
  238. {
  239. RTC_MODULE_CHECK(rtc_gpio_is_valid_gpio(gpio_num), "RTC_GPIO number error", ESP_ERR_INVALID_ARG);
  240. switch (mode) {
  241. case RTC_GPIO_MODE_INPUT_ONLY:
  242. rtc_gpio_output_disable(gpio_num);
  243. rtc_gpio_input_enable(gpio_num);
  244. break;
  245. case RTC_GPIO_MODE_OUTPUT_ONLY:
  246. rtc_gpio_output_enable(gpio_num);
  247. rtc_gpio_input_disable(gpio_num);
  248. break;
  249. case RTC_GPIO_MODE_INPUT_OUTUT:
  250. rtc_gpio_output_enable(gpio_num);
  251. rtc_gpio_input_enable(gpio_num);
  252. break;
  253. case RTC_GPIO_MODE_DISABLED:
  254. rtc_gpio_output_disable(gpio_num);
  255. rtc_gpio_input_disable(gpio_num);
  256. break;
  257. }
  258. return ESP_OK;
  259. }
  260. esp_err_t rtc_gpio_pullup_en(gpio_num_t gpio_num)
  261. {
  262. //this is a digital pad
  263. if (rtc_gpio_desc[gpio_num].pullup == 0) {
  264. return ESP_ERR_INVALID_ARG;
  265. }
  266. //this is a rtc pad
  267. portENTER_CRITICAL(&rtc_spinlock);
  268. SET_PERI_REG_MASK(rtc_gpio_desc[gpio_num].reg, rtc_gpio_desc[gpio_num].pullup);
  269. portEXIT_CRITICAL(&rtc_spinlock);
  270. return ESP_OK;
  271. }
  272. esp_err_t rtc_gpio_pulldown_en(gpio_num_t gpio_num)
  273. {
  274. //this is a digital pad
  275. if (rtc_gpio_desc[gpio_num].pulldown == 0) {
  276. return ESP_ERR_INVALID_ARG;
  277. }
  278. //this is a rtc pad
  279. portENTER_CRITICAL(&rtc_spinlock);
  280. SET_PERI_REG_MASK(rtc_gpio_desc[gpio_num].reg, rtc_gpio_desc[gpio_num].pulldown);
  281. portEXIT_CRITICAL(&rtc_spinlock);
  282. return ESP_OK;
  283. }
  284. esp_err_t rtc_gpio_pullup_dis(gpio_num_t gpio_num)
  285. {
  286. //this is a digital pad
  287. if ( rtc_gpio_desc[gpio_num].pullup == 0 ) {
  288. return ESP_ERR_INVALID_ARG;
  289. }
  290. //this is a rtc pad
  291. portENTER_CRITICAL(&rtc_spinlock);
  292. CLEAR_PERI_REG_MASK(rtc_gpio_desc[gpio_num].reg, rtc_gpio_desc[gpio_num].pullup);
  293. portEXIT_CRITICAL(&rtc_spinlock);
  294. return ESP_OK;
  295. }
  296. esp_err_t rtc_gpio_pulldown_dis(gpio_num_t gpio_num)
  297. {
  298. //this is a digital pad
  299. if (rtc_gpio_desc[gpio_num].pulldown == 0) {
  300. return ESP_ERR_INVALID_ARG;
  301. }
  302. //this is a rtc pad
  303. portENTER_CRITICAL(&rtc_spinlock);
  304. CLEAR_PERI_REG_MASK(rtc_gpio_desc[gpio_num].reg, rtc_gpio_desc[gpio_num].pulldown);
  305. portEXIT_CRITICAL(&rtc_spinlock);
  306. return ESP_OK;
  307. }
  308. esp_err_t rtc_gpio_hold_en(gpio_num_t gpio_num)
  309. {
  310. // check if an RTC IO
  311. if (rtc_gpio_desc[gpio_num].pullup == 0) {
  312. return ESP_ERR_INVALID_ARG;
  313. }
  314. portENTER_CRITICAL(&rtc_spinlock);
  315. SET_PERI_REG_MASK(rtc_gpio_desc[gpio_num].reg, rtc_gpio_desc[gpio_num].hold);
  316. portEXIT_CRITICAL(&rtc_spinlock);
  317. return ESP_OK;
  318. }
  319. esp_err_t rtc_gpio_hold_dis(gpio_num_t gpio_num)
  320. {
  321. // check if an RTC IO
  322. if (rtc_gpio_desc[gpio_num].pullup == 0) {
  323. return ESP_ERR_INVALID_ARG;
  324. }
  325. portENTER_CRITICAL(&rtc_spinlock);
  326. CLEAR_PERI_REG_MASK(rtc_gpio_desc[gpio_num].reg, rtc_gpio_desc[gpio_num].hold);
  327. portEXIT_CRITICAL(&rtc_spinlock);
  328. return ESP_OK;
  329. }
  330. void rtc_gpio_force_hold_dis_all()
  331. {
  332. for (int gpio = 0; gpio < GPIO_PIN_COUNT; ++gpio) {
  333. const rtc_gpio_desc_t* desc = &rtc_gpio_desc[gpio];
  334. if (desc->hold_force != 0) {
  335. REG_CLR_BIT(RTC_CNTL_HOLD_FORCE_REG, desc->hold_force);
  336. }
  337. }
  338. }
  339. /*---------------------------------------------------------------
  340. Touch Pad
  341. ---------------------------------------------------------------*/
  342. esp_err_t touch_pad_isr_handler_register(void (*fn)(void *), void *arg, int no_use, intr_handle_t *handle_no_use)
  343. {
  344. RTC_MODULE_CHECK(fn, "Touch_Pad ISR null", ESP_ERR_INVALID_ARG);
  345. return rtc_isr_register(fn, arg, RTC_CNTL_TOUCH_INT_ST_M);
  346. }
  347. esp_err_t touch_pad_isr_register(intr_handler_t fn, void* arg)
  348. {
  349. RTC_MODULE_CHECK(fn, "Touch_Pad ISR null", ESP_ERR_INVALID_ARG);
  350. return rtc_isr_register(fn, arg, RTC_CNTL_TOUCH_INT_ST_M);
  351. }
  352. esp_err_t touch_pad_isr_deregister(intr_handler_t fn, void *arg)
  353. {
  354. return rtc_isr_deregister(fn, arg);
  355. }
  356. static esp_err_t touch_pad_get_io_num(touch_pad_t touch_num, gpio_num_t *gpio_num)
  357. {
  358. switch (touch_num) {
  359. case TOUCH_PAD_NUM0:
  360. *gpio_num = TOUCH_PAD_NUM0_GPIO_NUM;
  361. break;
  362. case TOUCH_PAD_NUM1:
  363. *gpio_num = TOUCH_PAD_NUM1_GPIO_NUM;
  364. break;
  365. case TOUCH_PAD_NUM2:
  366. *gpio_num = TOUCH_PAD_NUM2_GPIO_NUM;
  367. break;
  368. case TOUCH_PAD_NUM3:
  369. *gpio_num = TOUCH_PAD_NUM3_GPIO_NUM;
  370. break;
  371. case TOUCH_PAD_NUM4:
  372. *gpio_num = TOUCH_PAD_NUM4_GPIO_NUM;
  373. break;
  374. case TOUCH_PAD_NUM5:
  375. *gpio_num = TOUCH_PAD_NUM5_GPIO_NUM;
  376. break;
  377. case TOUCH_PAD_NUM6:
  378. *gpio_num = TOUCH_PAD_NUM6_GPIO_NUM;
  379. break;
  380. case TOUCH_PAD_NUM7:
  381. *gpio_num = TOUCH_PAD_NUM7_GPIO_NUM;
  382. break;
  383. case TOUCH_PAD_NUM8:
  384. *gpio_num = TOUCH_PAD_NUM8_GPIO_NUM;
  385. break;
  386. case TOUCH_PAD_NUM9:
  387. *gpio_num = TOUCH_PAD_NUM9_GPIO_NUM;
  388. break;
  389. default:
  390. return ESP_ERR_INVALID_ARG;
  391. }
  392. return ESP_OK;
  393. }
  394. static uint32_t _touch_filter_iir(uint32_t in_now, uint32_t out_last, uint32_t k)
  395. {
  396. if (k == 0) {
  397. return in_now;
  398. } else {
  399. uint32_t out_now = (in_now + (k - 1) * out_last) / k;
  400. return out_now;
  401. }
  402. }
  403. static void touch_pad_filter_cb(void *arg)
  404. {
  405. if (s_touch_pad_filter == NULL) {
  406. return;
  407. }
  408. uint16_t val;
  409. for (int i = 0; i < TOUCH_PAD_MAX; i++) {
  410. touch_pad_read(i, &val);
  411. 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];
  412. s_touch_pad_filter->filtered_val[i] = _touch_filter_iir((val << TOUCH_PAD_SHIFT_DEFAULT),
  413. s_touch_pad_filter->filtered_val[i], TOUCH_PAD_FILTER_FACTOR_DEFAULT);
  414. }
  415. }
  416. esp_err_t touch_pad_set_meas_time(uint16_t sleep_cycle, uint16_t meas_cycle)
  417. {
  418. xSemaphoreTake(rtc_touch_mux, portMAX_DELAY);
  419. portENTER_CRITICAL(&rtc_spinlock);
  420. //touch sensor sleep cycle Time = sleep_cycle / RTC_SLOW_CLK( can be 150k or 32k depending on the options)
  421. SENS.sar_touch_ctrl2.touch_sleep_cycles = sleep_cycle;
  422. //touch sensor measure time= meas_cycle / 8Mhz
  423. SENS.sar_touch_ctrl1.touch_meas_delay = meas_cycle;
  424. portEXIT_CRITICAL(&rtc_spinlock);
  425. xSemaphoreGive(rtc_touch_mux);
  426. return ESP_OK;
  427. }
  428. esp_err_t touch_pad_get_meas_time(uint16_t *sleep_cycle, uint16_t *meas_cycle)
  429. {
  430. portENTER_CRITICAL(&rtc_spinlock);
  431. if (sleep_cycle) {
  432. *sleep_cycle = SENS.sar_touch_ctrl2.touch_sleep_cycles;
  433. }
  434. if (meas_cycle) {
  435. *meas_cycle = SENS.sar_touch_ctrl1.touch_meas_delay;
  436. }
  437. portEXIT_CRITICAL(&rtc_spinlock);
  438. return ESP_OK;
  439. }
  440. esp_err_t touch_pad_set_voltage(touch_high_volt_t refh, touch_low_volt_t refl, touch_volt_atten_t atten)
  441. {
  442. RTC_MODULE_CHECK(((refh < TOUCH_HVOLT_MAX) && (refh >= (int )TOUCH_HVOLT_KEEP)), "touch refh error",
  443. ESP_ERR_INVALID_ARG);
  444. RTC_MODULE_CHECK(((refl < TOUCH_LVOLT_MAX) && (refh >= (int )TOUCH_LVOLT_KEEP)), "touch refl error",
  445. ESP_ERR_INVALID_ARG);
  446. RTC_MODULE_CHECK(((atten < TOUCH_HVOLT_ATTEN_MAX) && (refh >= (int )TOUCH_HVOLT_ATTEN_KEEP)), "touch atten error",
  447. ESP_ERR_INVALID_ARG);
  448. portENTER_CRITICAL(&rtc_spinlock);
  449. if (refh > TOUCH_HVOLT_KEEP) {
  450. RTCIO.touch_cfg.drefh = refh;
  451. }
  452. if (refl > TOUCH_LVOLT_KEEP) {
  453. RTCIO.touch_cfg.drefl = refl;
  454. }
  455. if (atten > TOUCH_HVOLT_ATTEN_KEEP) {
  456. RTCIO.touch_cfg.drange = atten;
  457. }
  458. portEXIT_CRITICAL(&rtc_spinlock);
  459. return ESP_OK;
  460. }
  461. esp_err_t touch_pad_get_voltage(touch_high_volt_t *refh, touch_low_volt_t *refl, touch_volt_atten_t *atten)
  462. {
  463. portENTER_CRITICAL(&rtc_spinlock);
  464. if (refh) {
  465. *refh = RTCIO.touch_cfg.drefh;
  466. }
  467. if (refl) {
  468. *refl = RTCIO.touch_cfg.drefl;
  469. }
  470. if (atten) {
  471. *atten = RTCIO.touch_cfg.drange;
  472. }
  473. portEXIT_CRITICAL(&rtc_spinlock);
  474. return ESP_OK;
  475. }
  476. esp_err_t touch_pad_set_cnt_mode(touch_pad_t touch_num, touch_cnt_slope_t slope, touch_tie_opt_t opt)
  477. {
  478. RTC_MODULE_CHECK((slope < TOUCH_PAD_SLOPE_MAX), "touch slope error", ESP_ERR_INVALID_ARG);
  479. RTC_MODULE_CHECK((opt < TOUCH_PAD_TIE_OPT_MAX), "touch opt error", ESP_ERR_INVALID_ARG);
  480. portENTER_CRITICAL(&rtc_spinlock);
  481. //set tie opt value, high or low level seem no difference for counter
  482. RTCIO.touch_pad[touch_num].tie_opt = opt;
  483. //workaround for touch pad DAC mismatch on tp8 and tp9
  484. touch_pad_t touch_pad_wrap = touch_num;
  485. if (touch_num == TOUCH_PAD_NUM9) {
  486. touch_pad_wrap = TOUCH_PAD_NUM8;
  487. } else if (touch_num == TOUCH_PAD_NUM8) {
  488. touch_pad_wrap = TOUCH_PAD_NUM9;
  489. }
  490. //touch sensor set slope for charging and discharging.
  491. RTCIO.touch_pad[touch_pad_wrap].dac = slope;
  492. portEXIT_CRITICAL(&rtc_spinlock);
  493. return ESP_OK;
  494. }
  495. esp_err_t touch_pad_get_cnt_mode(touch_pad_t touch_num, touch_cnt_slope_t *slope, touch_tie_opt_t *opt)
  496. {
  497. RTC_MODULE_CHECK((touch_num < TOUCH_PAD_MAX), "touch IO error", ESP_ERR_INVALID_ARG);
  498. portENTER_CRITICAL(&rtc_spinlock);
  499. if (slope) {
  500. //workaround for touch pad DAC mismatch on tp8 and tp9
  501. touch_pad_t touch_pad_wrap = touch_num;
  502. if (touch_num == TOUCH_PAD_NUM9) {
  503. touch_pad_wrap = TOUCH_PAD_NUM8;
  504. } else if (touch_num == TOUCH_PAD_NUM8) {
  505. touch_pad_wrap = TOUCH_PAD_NUM9;
  506. }
  507. *slope = RTCIO.touch_pad[touch_pad_wrap].dac;
  508. }
  509. if (opt) {
  510. *opt = RTCIO.touch_pad[touch_num].tie_opt;
  511. }
  512. portEXIT_CRITICAL(&rtc_spinlock);
  513. return ESP_OK;
  514. }
  515. esp_err_t touch_pad_io_init(touch_pad_t touch_num)
  516. {
  517. RTC_MODULE_CHECK((touch_num < TOUCH_PAD_MAX), "touch IO error", ESP_ERR_INVALID_ARG);
  518. gpio_num_t gpio_num = GPIO_NUM_0;
  519. touch_pad_get_io_num(touch_num, &gpio_num);
  520. rtc_gpio_init(gpio_num);
  521. rtc_gpio_set_direction(gpio_num, RTC_GPIO_MODE_DISABLED);
  522. rtc_gpio_pulldown_dis(gpio_num);
  523. rtc_gpio_pullup_dis(gpio_num);
  524. return ESP_OK;
  525. }
  526. esp_err_t touch_pad_set_fsm_mode(touch_fsm_mode_t mode)
  527. {
  528. RTC_MODULE_CHECK((mode < TOUCH_FSM_MODE_MAX), "touch fsm mode error", ESP_ERR_INVALID_ARG);
  529. portENTER_CRITICAL(&rtc_spinlock);
  530. SENS.sar_touch_ctrl2.touch_start_en = 0;
  531. SENS.sar_touch_ctrl2.touch_start_force = mode;
  532. RTCCNTL.state0.touch_slp_timer_en = (mode == TOUCH_FSM_MODE_TIMER ? 1 : 0);
  533. portEXIT_CRITICAL(&rtc_spinlock);
  534. return ESP_OK;
  535. }
  536. esp_err_t touch_pad_get_fsm_mode(touch_fsm_mode_t *mode)
  537. {
  538. if (mode) {
  539. *mode = SENS.sar_touch_ctrl2.touch_start_force;
  540. }
  541. return ESP_OK;
  542. }
  543. esp_err_t touch_pad_sw_start()
  544. {
  545. portENTER_CRITICAL(&rtc_spinlock);
  546. SENS.sar_touch_ctrl2.touch_start_en = 0;
  547. SENS.sar_touch_ctrl2.touch_start_en = 1;
  548. portEXIT_CRITICAL(&rtc_spinlock);
  549. return ESP_OK;
  550. }
  551. esp_err_t touch_pad_set_thresh(touch_pad_t touch_num, uint16_t threshold)
  552. {
  553. RTC_MODULE_CHECK((touch_num < TOUCH_PAD_MAX), "touch IO error", ESP_ERR_INVALID_ARG);
  554. portENTER_CRITICAL(&rtc_spinlock);
  555. if (touch_num & 0x1) {
  556. SENS.touch_thresh[touch_num / 2].l_thresh = threshold;
  557. } else {
  558. SENS.touch_thresh[touch_num / 2].h_thresh = threshold;
  559. }
  560. portEXIT_CRITICAL(&rtc_spinlock);
  561. return ESP_OK;
  562. }
  563. esp_err_t touch_pad_get_thresh(touch_pad_t touch_num, uint16_t *threshold)
  564. {
  565. RTC_MODULE_CHECK((touch_num < TOUCH_PAD_MAX), "touch IO error", ESP_ERR_INVALID_ARG);
  566. if (threshold) {
  567. *threshold = (touch_num & 0x1 )? \
  568. SENS.touch_thresh[touch_num / 2].l_thresh : \
  569. SENS.touch_thresh[touch_num / 2].h_thresh;
  570. }
  571. return ESP_OK;
  572. }
  573. esp_err_t touch_pad_set_trigger_mode(touch_trigger_mode_t mode)
  574. {
  575. RTC_MODULE_CHECK((mode < TOUCH_TRIGGER_MAX), "touch trigger mode error", ESP_ERR_INVALID_ARG);
  576. portENTER_CRITICAL(&rtc_spinlock);
  577. SENS.sar_touch_ctrl1.touch_out_sel = mode;
  578. portEXIT_CRITICAL(&rtc_spinlock);
  579. return ESP_OK;
  580. }
  581. esp_err_t touch_pad_get_trigger_mode(touch_trigger_mode_t *mode)
  582. {
  583. if (mode) {
  584. *mode = SENS.sar_touch_ctrl1.touch_out_sel;
  585. }
  586. return ESP_OK;
  587. }
  588. esp_err_t touch_pad_set_trigger_source(touch_trigger_src_t src)
  589. {
  590. RTC_MODULE_CHECK((src < TOUCH_TRIGGER_SOURCE_MAX), "touch trigger source error", ESP_ERR_INVALID_ARG);
  591. portENTER_CRITICAL(&rtc_spinlock);
  592. SENS.sar_touch_ctrl1.touch_out_1en = src;
  593. portEXIT_CRITICAL(&rtc_spinlock);
  594. return ESP_OK;
  595. }
  596. esp_err_t touch_pad_get_trigger_source(touch_trigger_src_t *src)
  597. {
  598. if (src) {
  599. *src = SENS.sar_touch_ctrl1.touch_out_1en;
  600. }
  601. return ESP_OK;
  602. }
  603. esp_err_t touch_pad_set_group_mask(uint16_t set1_mask, uint16_t set2_mask, uint16_t en_mask)
  604. {
  605. RTC_MODULE_CHECK((set1_mask <= TOUCH_PAD_BIT_MASK_MAX), "touch set1 bitmask error", ESP_ERR_INVALID_ARG);
  606. RTC_MODULE_CHECK((set2_mask <= TOUCH_PAD_BIT_MASK_MAX), "touch set2 bitmask error", ESP_ERR_INVALID_ARG);
  607. RTC_MODULE_CHECK((en_mask <= TOUCH_PAD_BIT_MASK_MAX), "touch work_en bitmask error", ESP_ERR_INVALID_ARG);
  608. portENTER_CRITICAL(&rtc_spinlock);
  609. SENS.sar_touch_enable.touch_pad_outen1 |= set1_mask;
  610. SENS.sar_touch_enable.touch_pad_outen2 |= set2_mask;
  611. SENS.sar_touch_enable.touch_pad_worken |= en_mask;
  612. portEXIT_CRITICAL(&rtc_spinlock);
  613. return ESP_OK;
  614. }
  615. esp_err_t touch_pad_get_group_mask(uint16_t *set1_mask, uint16_t *set2_mask, uint16_t *en_mask)
  616. {
  617. portENTER_CRITICAL(&rtc_spinlock);
  618. if (set1_mask) {
  619. *set1_mask = SENS.sar_touch_enable.touch_pad_outen1;
  620. }
  621. if (set2_mask) {
  622. *set2_mask = SENS.sar_touch_enable.touch_pad_outen2;
  623. }
  624. if (en_mask) {
  625. *en_mask = SENS.sar_touch_enable.touch_pad_worken;
  626. }
  627. portEXIT_CRITICAL(&rtc_spinlock);
  628. return ESP_OK;
  629. }
  630. esp_err_t touch_pad_clear_group_mask(uint16_t set1_mask, uint16_t set2_mask, uint16_t en_mask)
  631. {
  632. RTC_MODULE_CHECK((set1_mask <= TOUCH_PAD_BIT_MASK_MAX), "touch set1 bitmask error", ESP_ERR_INVALID_ARG);
  633. RTC_MODULE_CHECK((set2_mask <= TOUCH_PAD_BIT_MASK_MAX), "touch set2 bitmask error", ESP_ERR_INVALID_ARG);
  634. RTC_MODULE_CHECK((en_mask <= TOUCH_PAD_BIT_MASK_MAX), "touch work_en bitmask error", ESP_ERR_INVALID_ARG);
  635. portENTER_CRITICAL(&rtc_spinlock);
  636. SENS.sar_touch_enable.touch_pad_outen1 &= (~set1_mask);
  637. SENS.sar_touch_enable.touch_pad_outen2 &= (~set2_mask);
  638. SENS.sar_touch_enable.touch_pad_worken &= (~en_mask);
  639. portEXIT_CRITICAL(&rtc_spinlock);
  640. return ESP_OK;
  641. }
  642. uint32_t IRAM_ATTR touch_pad_get_status()
  643. {
  644. return SENS.sar_touch_ctrl2.touch_meas_en;
  645. }
  646. esp_err_t IRAM_ATTR touch_pad_clear_status()
  647. {
  648. portENTER_CRITICAL(&rtc_spinlock);
  649. SENS.sar_touch_ctrl2.touch_meas_en_clr = 1;
  650. portEXIT_CRITICAL(&rtc_spinlock);
  651. return ESP_OK;
  652. }
  653. esp_err_t touch_pad_intr_enable()
  654. {
  655. portENTER_CRITICAL(&rtc_spinlock);
  656. RTCCNTL.int_ena.rtc_touch = 1;
  657. portEXIT_CRITICAL(&rtc_spinlock);
  658. return ESP_OK;
  659. }
  660. esp_err_t touch_pad_intr_disable()
  661. {
  662. portENTER_CRITICAL(&rtc_spinlock);
  663. RTCCNTL.int_ena.rtc_touch = 0;
  664. portEXIT_CRITICAL(&rtc_spinlock);
  665. return ESP_OK;
  666. }
  667. esp_err_t touch_pad_config(touch_pad_t touch_num, uint16_t threshold)
  668. {
  669. RTC_MODULE_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_FAIL);
  670. RTC_MODULE_CHECK(touch_num < TOUCH_PAD_MAX, "Touch_Pad Num Err", ESP_ERR_INVALID_ARG);
  671. touch_pad_set_thresh(touch_num, threshold);
  672. touch_pad_io_init(touch_num);
  673. touch_pad_set_cnt_mode(touch_num, TOUCH_PAD_SLOPE_7, TOUCH_PAD_TIE_OPT_HIGH);
  674. touch_pad_set_group_mask((1 << touch_num), (1 << touch_num), (1 << touch_num));
  675. return ESP_OK;
  676. }
  677. esp_err_t touch_pad_init()
  678. {
  679. if (rtc_touch_mux == NULL) {
  680. rtc_touch_mux = xSemaphoreCreateMutex();
  681. }
  682. if (rtc_touch_mux == NULL) {
  683. return ESP_FAIL;
  684. }
  685. touch_pad_intr_disable();
  686. touch_pad_set_fsm_mode(TOUCH_FSM_MODE_DEFAULT);
  687. touch_pad_set_trigger_mode(TOUCH_TRIGGER_MODE_DEFAULT);
  688. touch_pad_set_trigger_source(TOUCH_TRIGGER_SOURCE_DEFAULT);
  689. touch_pad_clear_status();
  690. touch_pad_set_meas_time(TOUCH_PAD_SLEEP_CYCLE_DEFAULT, TOUCH_PAD_MEASURE_CYCLE_DEFAULT);
  691. return ESP_OK;
  692. }
  693. esp_err_t touch_pad_deinit()
  694. {
  695. if (rtc_touch_mux == NULL) {
  696. return ESP_FAIL;
  697. }
  698. touch_pad_filter_delete();
  699. touch_pad_set_fsm_mode(TOUCH_FSM_MODE_SW);
  700. touch_pad_clear_status();
  701. touch_pad_intr_disable();
  702. vSemaphoreDelete(rtc_touch_mux);
  703. rtc_touch_mux = NULL;
  704. return ESP_OK;
  705. }
  706. esp_err_t touch_pad_read(touch_pad_t touch_num, uint16_t *touch_value)
  707. {
  708. RTC_MODULE_CHECK(touch_num < TOUCH_PAD_MAX, "Touch_Pad Num Err", ESP_ERR_INVALID_ARG);
  709. RTC_MODULE_CHECK(touch_value != NULL, "touch_value", ESP_ERR_INVALID_ARG);
  710. RTC_MODULE_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_FAIL);
  711. xSemaphoreTake(rtc_touch_mux, portMAX_DELAY);
  712. while (SENS.sar_touch_ctrl2.touch_meas_done == 0) {};
  713. *touch_value = (touch_num & 0x1) ? \
  714. SENS.touch_meas[touch_num / 2].l_val: \
  715. SENS.touch_meas[touch_num / 2].h_val;
  716. xSemaphoreGive(rtc_touch_mux);
  717. return ESP_OK;
  718. }
  719. IRAM_ATTR esp_err_t touch_pad_read_filtered(touch_pad_t touch_num, uint16_t *touch_value)
  720. {
  721. RTC_MODULE_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_FAIL);
  722. RTC_MODULE_CHECK(touch_num < TOUCH_PAD_MAX, "Touch_Pad Num Err", ESP_ERR_INVALID_ARG);
  723. RTC_MODULE_CHECK(touch_value != NULL, "touch_value", ESP_ERR_INVALID_ARG);
  724. RTC_MODULE_CHECK(s_touch_pad_filter != NULL, "Touch pad filter not initialized", ESP_ERR_INVALID_STATE);
  725. *touch_value = (s_touch_pad_filter->filtered_val[touch_num] >> TOUCH_PAD_SHIFT_DEFAULT);
  726. return ESP_OK;
  727. }
  728. esp_err_t touch_pad_set_filter_period(uint32_t new_period_ms)
  729. {
  730. RTC_MODULE_CHECK(s_touch_pad_filter != NULL, "Touch pad filter not initialized", ESP_ERR_INVALID_STATE);
  731. RTC_MODULE_CHECK(new_period_ms > 0, "Touch pad filter period error", ESP_ERR_INVALID_ARG);
  732. RTC_MODULE_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_ERR_INVALID_STATE);
  733. esp_err_t ret = ESP_OK;
  734. xSemaphoreTake(rtc_touch_mux, portMAX_DELAY);
  735. if (s_touch_pad_filter != NULL) {
  736. xTimerChangePeriod(s_touch_pad_filter->timer, new_period_ms / portTICK_PERIOD_MS, portMAX_DELAY);
  737. s_touch_pad_filter->period = new_period_ms;
  738. } else {
  739. ESP_LOGE(RTC_MODULE_TAG, "Touch pad filter deleted");
  740. ret = ESP_ERR_INVALID_STATE;
  741. }
  742. xSemaphoreGive(rtc_touch_mux);
  743. return ret;
  744. }
  745. esp_err_t touch_pad_get_filter_period(uint32_t* p_period_ms)
  746. {
  747. RTC_MODULE_CHECK(s_touch_pad_filter != NULL, "Touch pad filter not initialized", ESP_ERR_INVALID_STATE);
  748. RTC_MODULE_CHECK(p_period_ms != NULL, "Touch pad period pointer error", ESP_ERR_INVALID_ARG);
  749. RTC_MODULE_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_ERR_INVALID_STATE);
  750. esp_err_t ret = ESP_OK;
  751. xSemaphoreTake(rtc_touch_mux, portMAX_DELAY);
  752. if (s_touch_pad_filter != NULL) {
  753. *p_period_ms = s_touch_pad_filter->period;
  754. } else {
  755. ESP_LOGE(RTC_MODULE_TAG, "Touch pad filter deleted");
  756. ret = ESP_ERR_INVALID_STATE;
  757. }
  758. xSemaphoreGive(rtc_touch_mux);
  759. return ret;
  760. }
  761. esp_err_t touch_pad_filter_start(uint32_t filter_period_ms)
  762. {
  763. RTC_MODULE_CHECK(filter_period_ms >= portTICK_PERIOD_MS, "Touch pad filter period error", ESP_ERR_INVALID_ARG);
  764. RTC_MODULE_CHECK(rtc_touch_mux != NULL, "Touch pad not initialized", ESP_ERR_INVALID_STATE);
  765. esp_err_t ret = ESP_OK;
  766. xSemaphoreTake(rtc_touch_mux, portMAX_DELAY);
  767. if (s_touch_pad_filter == NULL) {
  768. s_touch_pad_filter = (touch_pad_filter_t *) calloc(1, sizeof(touch_pad_filter_t));
  769. if (s_touch_pad_filter == NULL) {
  770. ret = ESP_ERR_NO_MEM;
  771. }
  772. }
  773. if (s_touch_pad_filter->timer == NULL) {
  774. s_touch_pad_filter->timer = xTimerCreate("filter_tmr", filter_period_ms / portTICK_PERIOD_MS, pdTRUE,
  775. NULL, touch_pad_filter_cb);
  776. if (s_touch_pad_filter->timer == NULL) {
  777. ret = ESP_ERR_NO_MEM;
  778. }
  779. xTimerStart(s_touch_pad_filter->timer, portMAX_DELAY);
  780. s_touch_pad_filter->enable = true;
  781. } else {
  782. xTimerChangePeriod(s_touch_pad_filter->timer, filter_period_ms / portTICK_PERIOD_MS, portMAX_DELAY);
  783. s_touch_pad_filter->period = filter_period_ms;
  784. xTimerStart(s_touch_pad_filter->timer, portMAX_DELAY);
  785. }
  786. xSemaphoreGive(rtc_touch_mux);
  787. return ret;
  788. }
  789. esp_err_t touch_pad_filter_stop()
  790. {
  791. RTC_MODULE_CHECK(s_touch_pad_filter != NULL, "Touch pad filter not initialized", ESP_ERR_INVALID_STATE);
  792. esp_err_t ret = ESP_OK;
  793. xSemaphoreTake(rtc_touch_mux, portMAX_DELAY);
  794. if (s_touch_pad_filter != NULL) {
  795. xTimerStop(s_touch_pad_filter->timer, portMAX_DELAY);
  796. s_touch_pad_filter->enable = false;
  797. } else {
  798. ESP_LOGE(RTC_MODULE_TAG, "Touch pad filter deleted");
  799. ret = ESP_ERR_INVALID_STATE;
  800. }
  801. xSemaphoreGive(rtc_touch_mux);
  802. return ret;
  803. }
  804. esp_err_t touch_pad_filter_delete()
  805. {
  806. RTC_MODULE_CHECK(s_touch_pad_filter != NULL, "Touch pad filter not initialized", ESP_ERR_INVALID_STATE);
  807. xSemaphoreTake(rtc_touch_mux, portMAX_DELAY);
  808. if (s_touch_pad_filter != NULL) {
  809. if (s_touch_pad_filter->timer != NULL) {
  810. xTimerStop(s_touch_pad_filter->timer, portMAX_DELAY);
  811. xTimerDelete(s_touch_pad_filter->timer, portMAX_DELAY);
  812. s_touch_pad_filter->timer = NULL;
  813. }
  814. free(s_touch_pad_filter);
  815. s_touch_pad_filter = NULL;
  816. }
  817. xSemaphoreGive(rtc_touch_mux);
  818. return ESP_OK;
  819. }
  820. /*---------------------------------------------------------------
  821. ADC Common
  822. ---------------------------------------------------------------*/
  823. static esp_err_t adc_set_fsm_time(int rst_wait, int start_wait, int standby_wait, int sample_cycle)
  824. {
  825. portENTER_CRITICAL(&rtc_spinlock);
  826. // Internal FSM reset wait time
  827. if (rst_wait >= 0) {
  828. SYSCON.saradc_fsm.rstb_wait = rst_wait;
  829. }
  830. // Internal FSM start wait time
  831. if (start_wait >= 0) {
  832. SYSCON.saradc_fsm.start_wait = start_wait;
  833. }
  834. // Internal FSM standby wait time
  835. if (standby_wait >= 0) {
  836. SYSCON.saradc_fsm.standby_wait = standby_wait;
  837. }
  838. // Internal FSM standby sample cycle
  839. if (sample_cycle >= 0) {
  840. SYSCON.saradc_fsm.sample_cycle = sample_cycle;
  841. }
  842. portEXIT_CRITICAL(&rtc_spinlock);
  843. return ESP_OK;
  844. }
  845. static esp_err_t adc_set_data_format(adc_i2s_encode_t mode)
  846. {
  847. portENTER_CRITICAL(&rtc_spinlock);
  848. //data format:
  849. //0: ADC_ENCODE_12BIT [15:12]-channel [11:0]-12 bits ADC data
  850. //1: ADC_ENCODE_11BIT [15]-1 [14:11]-channel [10:0]-11 bits ADC data, the resolution should not be larger than 11 bits in this case.
  851. SYSCON.saradc_ctrl.data_sar_sel = mode;
  852. portEXIT_CRITICAL(&rtc_spinlock);
  853. return ESP_OK;
  854. }
  855. static esp_err_t adc_set_measure_limit(uint8_t meas_num, bool lim_en)
  856. {
  857. portENTER_CRITICAL(&rtc_spinlock);
  858. // Set max measure number
  859. SYSCON.saradc_ctrl2.max_meas_num = meas_num;
  860. // Enable max measure number limit
  861. SYSCON.saradc_ctrl2.meas_num_limit = lim_en;
  862. portEXIT_CRITICAL(&rtc_spinlock);
  863. return ESP_OK;
  864. }
  865. static esp_err_t adc_set_work_mode(adc_unit_t adc_unit)
  866. {
  867. portENTER_CRITICAL(&rtc_spinlock);
  868. if (adc_unit == ADC_UNIT_1) {
  869. // saradc mode sel : 0--single saradc; 1--double saradc; 2--alternative saradc
  870. SYSCON.saradc_ctrl.work_mode = 0;
  871. //ENABLE ADC 0: ADC1 1: ADC2, only work for single SAR mode
  872. SYSCON.saradc_ctrl.sar_sel = 0;
  873. } else if (adc_unit == ADC_UNIT_2) {
  874. // saradc mode sel : 0--single saradc; 1--double saradc; 2--alternative saradc
  875. SYSCON.saradc_ctrl.work_mode = 0;
  876. //ENABLE ADC1 0: SAR1 1: SAR2 only work for single SAR mode
  877. SYSCON.saradc_ctrl.sar_sel = 1;
  878. } else if (adc_unit == ADC_UNIT_BOTH) {
  879. // saradc mode sel : 0--single saradc; 1--double saradc; 2--alternative saradc
  880. SYSCON.saradc_ctrl.work_mode = 1;
  881. } else if (adc_unit == ADC_UNIT_ALTER) {
  882. // saradc mode sel : 0--single saradc; 1--double saradc; 2--alternative saradc
  883. SYSCON.saradc_ctrl.work_mode = 2;
  884. }
  885. portEXIT_CRITICAL(&rtc_spinlock);
  886. return ESP_OK;
  887. }
  888. static esp_err_t adc_set_atten(adc_unit_t adc_unit, adc_channel_t channel, adc_atten_t atten)
  889. {
  890. ADC_CHECK_UNIT(adc_unit);
  891. if (adc_unit & ADC_UNIT_1) {
  892. RTC_MODULE_CHECK((adc1_channel_t)channel < ADC1_CHANNEL_MAX, "ADC Channel Err", ESP_ERR_INVALID_ARG);
  893. }
  894. RTC_MODULE_CHECK(atten < ADC_ATTEN_MAX, "ADC Atten Err", ESP_ERR_INVALID_ARG);
  895. portENTER_CRITICAL(&rtc_spinlock);
  896. if (adc_unit & ADC_UNIT_1) {
  897. //SAR1_atten
  898. SET_PERI_REG_BITS(SENS_SAR_ATTEN1_REG, SENS_SAR1_ATTEN_VAL_MASK, atten, (channel * 2));
  899. }
  900. if (adc_unit & ADC_UNIT_2) {
  901. //SAR2_atten
  902. SET_PERI_REG_BITS(SENS_SAR_ATTEN2_REG, SENS_SAR2_ATTEN_VAL_MASK, atten, (channel * 2));
  903. }
  904. portEXIT_CRITICAL(&rtc_spinlock);
  905. return ESP_OK;
  906. }
  907. void adc_power_on()
  908. {
  909. portENTER_CRITICAL(&rtc_spinlock);
  910. SENS.sar_meas_wait2.force_xpd_sar = ADC_FORCE_FSM;
  911. portEXIT_CRITICAL(&rtc_spinlock);
  912. }
  913. void adc_power_off()
  914. {
  915. portENTER_CRITICAL(&rtc_spinlock);
  916. //Bit1 0:Fsm 1: SW mode
  917. //Bit0 0:SW mode power down 1: SW mode power on
  918. SENS.sar_meas_wait2.force_xpd_sar = ADC_FORCE_DISABLE;
  919. portEXIT_CRITICAL(&rtc_spinlock);
  920. }
  921. esp_err_t adc_set_clk_div(uint8_t clk_div)
  922. {
  923. portENTER_CRITICAL(&rtc_spinlock);
  924. // ADC clock devided from APB clk, 80 / 2 = 40Mhz,
  925. SYSCON.saradc_ctrl.sar_clk_div = clk_div;
  926. portEXIT_CRITICAL(&rtc_spinlock);
  927. return ESP_OK;
  928. }
  929. esp_err_t adc_set_i2s_data_source(adc_i2s_source_t src)
  930. {
  931. RTC_MODULE_CHECK(src < ADC_I2S_DATA_SRC_MAX, "ADC i2s data source error", ESP_ERR_INVALID_ARG);
  932. portENTER_CRITICAL(&rtc_spinlock);
  933. // 1: I2S input data is from SAR ADC (for DMA) 0: I2S input data is from GPIO matrix
  934. SYSCON.saradc_ctrl.data_to_i2s = src;
  935. portEXIT_CRITICAL(&rtc_spinlock);
  936. return ESP_OK;
  937. }
  938. esp_err_t adc_gpio_init(adc_unit_t adc_unit, adc_channel_t channel)
  939. {
  940. ADC_CHECK_UNIT(adc_unit);
  941. gpio_num_t gpio_num = 0;
  942. if (adc_unit & ADC_UNIT_1) {
  943. RTC_MODULE_CHECK((adc1_channel_t) channel < ADC1_CHANNEL_MAX, "ADC1 channel error", ESP_ERR_INVALID_ARG);
  944. ADC1_CHECK_FUNCTION_RET(adc1_pad_get_io_num((adc1_channel_t) channel, &gpio_num));
  945. ADC1_CHECK_FUNCTION_RET(rtc_gpio_init(gpio_num));
  946. ADC1_CHECK_FUNCTION_RET(rtc_gpio_output_disable(gpio_num));
  947. ADC1_CHECK_FUNCTION_RET(rtc_gpio_input_disable(gpio_num));
  948. ADC1_CHECK_FUNCTION_RET(gpio_set_pull_mode(gpio_num, GPIO_FLOATING));
  949. }
  950. return ESP_OK;
  951. }
  952. esp_err_t adc_set_data_inv(adc_unit_t adc_unit, bool inv_en)
  953. {
  954. portENTER_CRITICAL(&rtc_spinlock);
  955. if (adc_unit & ADC_UNIT_1) {
  956. // Enable ADC data invert
  957. SENS.sar_read_ctrl.sar1_data_inv = inv_en;
  958. }
  959. if (adc_unit & ADC_UNIT_2) {
  960. // Enable ADC data invert
  961. SENS.sar_read_ctrl2.sar2_data_inv = inv_en;
  962. }
  963. portEXIT_CRITICAL(&rtc_spinlock);
  964. return ESP_OK;
  965. }
  966. esp_err_t adc_set_data_width(adc_unit_t adc_unit, adc_bits_width_t bits)
  967. {
  968. ADC_CHECK_UNIT(adc_unit);
  969. RTC_MODULE_CHECK(bits < ADC_WIDTH_MAX, "ADC bit width error", ESP_ERR_INVALID_ARG);
  970. portENTER_CRITICAL(&rtc_spinlock);
  971. if (adc_unit & ADC_UNIT_1) {
  972. SENS.sar_start_force.sar1_bit_width = bits;
  973. SENS.sar_read_ctrl.sar1_sample_bit = bits;
  974. }
  975. if (adc_unit & ADC_UNIT_2) {
  976. SENS.sar_start_force.sar2_bit_width = bits;
  977. SENS.sar_read_ctrl2.sar2_sample_bit = bits;
  978. }
  979. portEXIT_CRITICAL(&rtc_spinlock);
  980. return ESP_OK;
  981. }
  982. /*-------------------------------------------------------------------------------------
  983. * ADC I2S
  984. *------------------------------------------------------------------------------------*/
  985. static esp_err_t adc_set_i2s_data_len(adc_unit_t adc_unit, int patt_len)
  986. {
  987. ADC_CHECK_UNIT(adc_unit);
  988. RTC_MODULE_CHECK((patt_len < ADC_PATT_LEN_MAX) && (patt_len > 0), "ADC pattern length error", ESP_ERR_INVALID_ARG);
  989. portENTER_CRITICAL(&rtc_spinlock);
  990. if(adc_unit & ADC_UNIT_1) {
  991. SYSCON.saradc_ctrl.sar1_patt_len = patt_len - 1;
  992. }
  993. if(adc_unit & ADC_UNIT_2) {
  994. SYSCON.saradc_ctrl.sar2_patt_len = patt_len - 1;
  995. }
  996. portEXIT_CRITICAL(&rtc_spinlock);
  997. return ESP_OK;
  998. }
  999. static esp_err_t adc_set_i2s_data_pattern(adc_unit_t adc_unit, int seq_num, adc_channel_t channel, adc_bits_width_t bits, adc_atten_t atten)
  1000. {
  1001. ADC_CHECK_UNIT(adc_unit);
  1002. if (adc_unit & ADC_UNIT_1) {
  1003. RTC_MODULE_CHECK((adc1_channel_t) channel < ADC1_CHANNEL_MAX, "ADC1 channel error", ESP_ERR_INVALID_ARG);
  1004. }
  1005. RTC_MODULE_CHECK(bits < ADC_WIDTH_MAX, "ADC bit width error", ESP_ERR_INVALID_ARG);
  1006. RTC_MODULE_CHECK(atten < ADC_ATTEN_MAX, "ADC Atten Err", ESP_ERR_INVALID_ARG);
  1007. portENTER_CRITICAL(&rtc_spinlock);
  1008. //Configure pattern table, each 8 bit defines one channel
  1009. //[7:4]-channel [3:2]-bit width [1:0]- attenuation
  1010. //BIT WIDTH: 3: 12BIT 2: 11BIT 1: 10BIT 0: 9BIT
  1011. //ATTEN: 3: ATTEN = 11dB 2: 6dB 1: 2.5dB 0: 0dB
  1012. uint8_t val = (channel << 4) | (bits << 2) | (atten << 0);
  1013. if (adc_unit & ADC_UNIT_1) {
  1014. SYSCON.saradc_sar1_patt_tab[seq_num / 4] &= (~(0xff << ((3 - (seq_num % 4)) * 8)));
  1015. SYSCON.saradc_sar1_patt_tab[seq_num / 4] |= (val << ((3 - (seq_num % 4)) * 8));
  1016. }
  1017. if (adc_unit & ADC_UNIT_2) {
  1018. SYSCON.saradc_sar2_patt_tab[seq_num / 4] &= (~(0xff << ((3 - (seq_num % 4)) * 8)));
  1019. SYSCON.saradc_sar2_patt_tab[seq_num / 4] |= (val << ((3 - (seq_num % 4)) * 8));
  1020. }
  1021. portEXIT_CRITICAL(&rtc_spinlock);
  1022. return ESP_OK;
  1023. }
  1024. esp_err_t adc_i2s_mode_init(adc_unit_t adc_unit, adc_channel_t channel)
  1025. {
  1026. ADC_CHECK_UNIT(adc_unit);
  1027. if (adc_unit & ADC_UNIT_1) {
  1028. RTC_MODULE_CHECK((adc1_channel_t) channel < ADC1_CHANNEL_MAX, "ADC1 channel error", ESP_ERR_INVALID_ARG);
  1029. }
  1030. uint8_t table_len = 1;
  1031. //POWER ON SAR
  1032. adc_power_on();
  1033. adc_gpio_init(adc_unit, channel);
  1034. adc_set_i2s_data_len(adc_unit, table_len);
  1035. adc_set_i2s_data_pattern(adc_unit, 0, channel, ADC_WIDTH_BIT_12, ADC_ATTEN_DB_11);
  1036. portENTER_CRITICAL(&rtc_spinlock);
  1037. if (adc_unit & ADC_UNIT_1) {
  1038. //switch SARADC into DIG channel
  1039. SENS.sar_read_ctrl.sar1_dig_force = 1;
  1040. }
  1041. if (adc_unit & ADC_UNIT_2) {
  1042. //switch SARADC into DIG channel
  1043. SENS.sar_read_ctrl2.sar2_dig_force = 1;
  1044. //1: SAR ADC2 is controlled by DIG ADC2 CTRL 0: SAR ADC2 is controlled by PWDET CTRL
  1045. SYSCON.saradc_ctrl.sar2_mux = 1;
  1046. }
  1047. portEXIT_CRITICAL(&rtc_spinlock);
  1048. adc_set_i2s_data_source(ADC_I2S_DATA_SRC_ADC);
  1049. adc_set_clk_div(SAR_ADC_CLK_DIV_DEFUALT);
  1050. // Set internal FSM wait time.
  1051. adc_set_fsm_time(ADC_FSM_RSTB_WAIT_DEFAULT, ADC_FSM_START_WAIT_DEFAULT, ADC_FSM_STANDBY_WAIT_DEFAULT,
  1052. ADC_FSM_TIME_KEEP);
  1053. adc_set_work_mode(adc_unit);
  1054. adc_set_data_format(ADC_ENCODE_12BIT);
  1055. adc_set_measure_limit(ADC_MAX_MEAS_NUM_DEFAULT, ADC_MEAS_NUM_LIM_DEFAULT);
  1056. //Invert The Level, Invert SAR ADC1 data
  1057. adc_set_data_inv(adc_unit, true);
  1058. return ESP_OK;
  1059. }
  1060. /*-------------------------------------------------------------------------------------
  1061. * ADC1
  1062. *------------------------------------------------------------------------------------*/
  1063. esp_err_t adc1_pad_get_io_num(adc1_channel_t channel, gpio_num_t *gpio_num)
  1064. {
  1065. RTC_MODULE_CHECK(channel < ADC1_CHANNEL_MAX, "ADC1 Channel Err", ESP_ERR_INVALID_ARG);
  1066. switch (channel) {
  1067. case ADC1_CHANNEL_0:
  1068. *gpio_num = ADC1_CHANNEL_0_GPIO_NUM;
  1069. break;
  1070. case ADC1_CHANNEL_1:
  1071. *gpio_num = ADC1_CHANNEL_1_GPIO_NUM;
  1072. break;
  1073. case ADC1_CHANNEL_2:
  1074. *gpio_num = ADC1_CHANNEL_2_GPIO_NUM;
  1075. break;
  1076. case ADC1_CHANNEL_3:
  1077. *gpio_num = ADC1_CHANNEL_3_GPIO_NUM;
  1078. break;
  1079. case ADC1_CHANNEL_4:
  1080. *gpio_num = ADC1_CHANNEL_4_GPIO_NUM;
  1081. break;
  1082. case ADC1_CHANNEL_5:
  1083. *gpio_num = ADC1_CHANNEL_5_GPIO_NUM;
  1084. break;
  1085. case ADC1_CHANNEL_6:
  1086. *gpio_num = ADC1_CHANNEL_6_GPIO_NUM;
  1087. break;
  1088. case ADC1_CHANNEL_7:
  1089. *gpio_num = ADC1_CHANNEL_7_GPIO_NUM;
  1090. break;
  1091. default:
  1092. return ESP_ERR_INVALID_ARG;
  1093. }
  1094. return ESP_OK;
  1095. }
  1096. esp_err_t adc1_config_channel_atten(adc1_channel_t channel, adc_atten_t atten)
  1097. {
  1098. RTC_MODULE_CHECK(channel < ADC1_CHANNEL_MAX, "ADC Channel Err", ESP_ERR_INVALID_ARG);
  1099. RTC_MODULE_CHECK(atten < ADC_ATTEN_MAX, "ADC Atten Err", ESP_ERR_INVALID_ARG);
  1100. adc_gpio_init(ADC_UNIT_1, channel);
  1101. adc_set_atten(ADC_UNIT_1, channel, atten);
  1102. return ESP_OK;
  1103. }
  1104. esp_err_t adc1_config_width(adc_bits_width_t width_bit)
  1105. {
  1106. RTC_MODULE_CHECK(width_bit < ADC_WIDTH_MAX, "ADC bit width error", ESP_ERR_INVALID_ARG);
  1107. adc_set_data_width(ADC_UNIT_1, width_bit);
  1108. adc_set_data_inv(ADC_UNIT_1, true);
  1109. return ESP_OK;
  1110. }
  1111. int adc1_get_raw(adc1_channel_t channel)
  1112. {
  1113. uint16_t adc_value;
  1114. RTC_MODULE_CHECK(channel < ADC1_CHANNEL_MAX, "ADC Channel Err", ESP_ERR_INVALID_ARG);
  1115. adc_power_on();
  1116. portENTER_CRITICAL(&rtc_spinlock);
  1117. //Adc Controler is Rtc module,not ulp coprocessor
  1118. SENS.sar_meas_start1.meas1_start_force = 1;
  1119. //Disable Amp Bit1=0:Fsm Bit1=1(Bit0=0:PownDown Bit10=1:Powerup)
  1120. SENS.sar_meas_wait2.force_xpd_amp = 0x2;
  1121. //Open the ADC1 Data port Not ulp coprocessor
  1122. SENS.sar_meas_start1.sar1_en_pad_force = 1;
  1123. //Select channel
  1124. SENS.sar_meas_start1.sar1_en_pad = (1 << channel);
  1125. SENS.sar_meas_ctrl.amp_rst_fb_fsm = 0;
  1126. SENS.sar_meas_ctrl.amp_short_ref_fsm = 0;
  1127. SENS.sar_meas_ctrl.amp_short_ref_gnd_fsm = 0;
  1128. SENS.sar_meas_wait1.sar_amp_wait1 = 1;
  1129. SENS.sar_meas_wait1.sar_amp_wait2 = 1;
  1130. SENS.sar_meas_wait2.sar_amp_wait3 = 1;
  1131. while (SENS.sar_slave_addr1.meas_status != 0);
  1132. SENS.sar_meas_start1.meas1_start_sar = 0;
  1133. SENS.sar_meas_start1.meas1_start_sar = 1;
  1134. while (SENS.sar_meas_start1.meas1_done_sar == 0);
  1135. adc_value = SENS.sar_meas_start1.meas1_data_sar;
  1136. portEXIT_CRITICAL(&rtc_spinlock);
  1137. return adc_value;
  1138. }
  1139. int adc1_get_voltage(adc1_channel_t channel) //Deprecated. Use adc1_get_raw() instead
  1140. {
  1141. return adc1_get_raw(channel);
  1142. }
  1143. void adc1_ulp_enable(void)
  1144. {
  1145. adc_power_on();
  1146. portENTER_CRITICAL(&rtc_spinlock);
  1147. SENS.sar_meas_start1.meas1_start_force = 0;
  1148. SENS.sar_meas_start1.sar1_en_pad_force = 0;
  1149. SENS.sar_meas_wait2.force_xpd_amp = 0x2;
  1150. SENS.sar_meas_ctrl.amp_rst_fb_fsm = 0;
  1151. SENS.sar_meas_ctrl.amp_short_ref_fsm = 0;
  1152. SENS.sar_meas_ctrl.amp_short_ref_gnd_fsm = 0;
  1153. SENS.sar_meas_wait1.sar_amp_wait1 = 0x1;
  1154. SENS.sar_meas_wait1.sar_amp_wait2 = 0x1;
  1155. SENS.sar_meas_wait2.sar_amp_wait3 = 0x1;
  1156. portEXIT_CRITICAL(&rtc_spinlock);
  1157. }
  1158. /*---------------------------------------------------------------
  1159. ADC2
  1160. ---------------------------------------------------------------*/
  1161. esp_err_t adc2_pad_get_io_num(adc2_channel_t channel, gpio_num_t *gpio_num)
  1162. {
  1163. RTC_MODULE_CHECK(channel < ADC2_CHANNEL_MAX, "ADC2 Channel Err", ESP_ERR_INVALID_ARG);
  1164. switch (channel) {
  1165. case ADC2_CHANNEL_0:
  1166. *gpio_num = ADC2_CHANNEL_0_GPIO_NUM;
  1167. break;
  1168. case ADC2_CHANNEL_1:
  1169. *gpio_num = ADC2_CHANNEL_1_GPIO_NUM;
  1170. break;
  1171. case ADC2_CHANNEL_2:
  1172. *gpio_num = ADC2_CHANNEL_2_GPIO_NUM;
  1173. break;
  1174. case ADC2_CHANNEL_3:
  1175. *gpio_num = ADC2_CHANNEL_3_GPIO_NUM;
  1176. break;
  1177. case ADC2_CHANNEL_4:
  1178. *gpio_num = ADC2_CHANNEL_4_GPIO_NUM;
  1179. break;
  1180. case ADC2_CHANNEL_5:
  1181. *gpio_num = ADC2_CHANNEL_5_GPIO_NUM;
  1182. break;
  1183. case ADC2_CHANNEL_6:
  1184. *gpio_num = ADC2_CHANNEL_6_GPIO_NUM;
  1185. break;
  1186. case ADC2_CHANNEL_7:
  1187. *gpio_num = ADC2_CHANNEL_7_GPIO_NUM;
  1188. break;
  1189. case ADC2_CHANNEL_8:
  1190. *gpio_num = ADC2_CHANNEL_8_GPIO_NUM;
  1191. break;
  1192. case ADC2_CHANNEL_9:
  1193. *gpio_num = ADC2_CHANNEL_9_GPIO_NUM;
  1194. break;
  1195. default:
  1196. return ESP_ERR_INVALID_ARG;
  1197. }
  1198. return ESP_OK;
  1199. }
  1200. esp_err_t adc2_wifi_acquire()
  1201. {
  1202. //lazy initialization
  1203. //for wifi, block until acquire the lock
  1204. _lock_acquire( &adc2_wifi_lock );
  1205. ESP_LOGD( RTC_MODULE_TAG, "Wi-Fi takes adc2 lock." );
  1206. return ESP_OK;
  1207. }
  1208. esp_err_t adc2_wifi_release()
  1209. {
  1210. RTC_MODULE_CHECK((uint32_t*)adc2_wifi_lock != NULL, "wifi release called before acquire", ESP_ERR_INVALID_STATE );
  1211. _lock_release( &adc2_wifi_lock );
  1212. ESP_LOGD( RTC_MODULE_TAG, "Wi-Fi returns adc2 lock." );
  1213. return ESP_OK;
  1214. }
  1215. static esp_err_t adc2_pad_init(adc2_channel_t channel)
  1216. {
  1217. gpio_num_t gpio_num = 0;
  1218. ADC2_CHECK_FUNCTION_RET(adc2_pad_get_io_num(channel, &gpio_num));
  1219. ADC2_CHECK_FUNCTION_RET(rtc_gpio_init(gpio_num));
  1220. ADC2_CHECK_FUNCTION_RET(rtc_gpio_output_disable(gpio_num));
  1221. ADC2_CHECK_FUNCTION_RET(rtc_gpio_input_disable(gpio_num));
  1222. ADC2_CHECK_FUNCTION_RET(gpio_set_pull_mode(gpio_num, GPIO_FLOATING));
  1223. return ESP_OK;
  1224. }
  1225. esp_err_t adc2_config_channel_atten(adc2_channel_t channel, adc_atten_t atten)
  1226. {
  1227. RTC_MODULE_CHECK(channel < ADC2_CHANNEL_MAX, "ADC2 Channel Err", ESP_ERR_INVALID_ARG);
  1228. RTC_MODULE_CHECK(atten <= ADC_ATTEN_11db, "ADC2 Atten Err", ESP_ERR_INVALID_ARG);
  1229. adc2_pad_init(channel);
  1230. portENTER_CRITICAL( &adc2_spinlock );
  1231. //lazy initialization
  1232. //avoid collision with other tasks
  1233. if ( _lock_try_acquire( &adc2_wifi_lock ) == -1 ) {
  1234. //try the lock, return if failed (wifi using).
  1235. portEXIT_CRITICAL( &adc2_spinlock );
  1236. return ESP_ERR_TIMEOUT;
  1237. }
  1238. SENS.sar_atten2 = ( SENS.sar_atten2 & ~(3<<(channel*2)) ) | ((atten&3) << (channel*2));
  1239. _lock_release( &adc2_wifi_lock );
  1240. portEXIT_CRITICAL( &adc2_spinlock );
  1241. return ESP_OK;
  1242. }
  1243. static inline void adc2_config_width(adc_bits_width_t width_bit)
  1244. {
  1245. portENTER_CRITICAL(&rtc_spinlock);
  1246. //sar_start_force shared with ADC1
  1247. SENS.sar_start_force.sar2_bit_width = width_bit;
  1248. portEXIT_CRITICAL(&rtc_spinlock);
  1249. //Invert the adc value,the Output value is invert
  1250. SENS.sar_read_ctrl2.sar2_data_inv = 1;
  1251. //Set The adc sample width,invert adc value,must digital sar2_bit_width[1:0]=3
  1252. SENS.sar_read_ctrl2.sar2_sample_bit = width_bit;
  1253. //Take the control from WIFI
  1254. SENS.sar_read_ctrl2.sar2_pwdet_force = 0;
  1255. }
  1256. //registers in critical section with adc1:
  1257. //SENS_SAR_START_FORCE_REG,
  1258. esp_err_t adc2_get_raw(adc2_channel_t channel, adc_bits_width_t width_bit, int* raw_out)
  1259. {
  1260. uint16_t adc_value = 0;
  1261. RTC_MODULE_CHECK(channel < ADC2_CHANNEL_MAX, "ADC Channel Err", ESP_ERR_INVALID_ARG);
  1262. //in critical section with whole rtc module
  1263. adc_power_on();
  1264. //avoid collision with other tasks
  1265. portENTER_CRITICAL(&adc2_spinlock);
  1266. //lazy initialization
  1267. //try the lock, return if failed (wifi using).
  1268. if ( _lock_try_acquire( &adc2_wifi_lock ) == -1 ) {
  1269. portEXIT_CRITICAL( &adc2_spinlock );
  1270. return ESP_ERR_TIMEOUT;
  1271. }
  1272. //in critical section with whole rtc module
  1273. adc2_config_width( width_bit );
  1274. //Adc Controler is Rtc module,not ulp coprocessor
  1275. SENS.sar_meas_start2.meas2_start_force = 1; //force pad mux and force start
  1276. //Open the ADC2 Data port Not ulp coprocessor
  1277. SENS.sar_meas_start2.sar2_en_pad_force = 1; //open the ADC2 data port
  1278. //Select channel
  1279. SENS.sar_meas_start2.sar2_en_pad = 1 << channel; //pad enable
  1280. SENS.sar_meas_start2.meas2_start_sar = 0; //start force 0
  1281. SENS.sar_meas_start2.meas2_start_sar = 1; //start force 1
  1282. while (SENS.sar_meas_start2.meas2_done_sar == 0) {}; //read done
  1283. adc_value = SENS.sar_meas_start2.meas2_data_sar;
  1284. _lock_release( &adc2_wifi_lock );
  1285. portEXIT_CRITICAL(&adc2_spinlock);
  1286. *raw_out = (int)adc_value;
  1287. return ESP_OK;
  1288. }
  1289. esp_err_t adc2_vref_to_gpio(gpio_num_t gpio)
  1290. {
  1291. int channel;
  1292. if(gpio == GPIO_NUM_25){
  1293. channel = 8; //Channel 8 bit
  1294. }else if (gpio == GPIO_NUM_26){
  1295. channel = 9; //Channel 9 bit
  1296. }else if (gpio == GPIO_NUM_27){
  1297. channel = 7; //Channel 7 bit
  1298. }else{
  1299. return ESP_ERR_INVALID_ARG;
  1300. }
  1301. //Configure RTC gpio
  1302. rtc_gpio_init(gpio);
  1303. rtc_gpio_output_disable(gpio);
  1304. rtc_gpio_input_disable(gpio);
  1305. rtc_gpio_pullup_dis(gpio);
  1306. rtc_gpio_pulldown_dis(gpio);
  1307. RTCCNTL.bias_conf.dbg_atten = 0; //Check DBG effect outside sleep mode
  1308. //set dtest (MUX_SEL : 0 -> RTC; 1-> vdd_sar2)
  1309. RTCCNTL.test_mux.dtest_rtc = 1; //Config test mux to route v_ref to ADC2 Channels
  1310. //set ent
  1311. RTCCNTL.test_mux.ent_rtc = 1;
  1312. //set sar2_en_test
  1313. SENS.sar_start_force.sar2_en_test = 1;
  1314. //force fsm
  1315. SENS.sar_meas_wait2.force_xpd_sar = ADC_FORCE_ENABLE; //Select power source of ADC
  1316. //set sar2 en force
  1317. SENS.sar_meas_start2.sar2_en_pad_force = 1; //Pad bitmap controlled by SW
  1318. //set en_pad for channels 7,8,9 (bits 0x380)
  1319. SENS.sar_meas_start2.sar2_en_pad = 1<<channel;
  1320. return ESP_OK;
  1321. }
  1322. /*---------------------------------------------------------------
  1323. DAC
  1324. ---------------------------------------------------------------*/
  1325. esp_err_t dac_pad_get_io_num(dac_channel_t channel, gpio_num_t *gpio_num)
  1326. {
  1327. RTC_MODULE_CHECK((channel >= DAC_CHANNEL_1) && (channel < DAC_CHANNEL_MAX), DAC_ERR_STR_CHANNEL_ERROR, ESP_ERR_INVALID_ARG);
  1328. RTC_MODULE_CHECK(gpio_num, "Param null", ESP_ERR_INVALID_ARG);
  1329. switch (channel) {
  1330. case DAC_CHANNEL_1:
  1331. *gpio_num = DAC_CHANNEL_1_GPIO_NUM;
  1332. break;
  1333. case DAC_CHANNEL_2:
  1334. *gpio_num = DAC_CHANNEL_2_GPIO_NUM;
  1335. break;
  1336. default:
  1337. return ESP_ERR_INVALID_ARG;
  1338. }
  1339. return ESP_OK;
  1340. }
  1341. static esp_err_t dac_rtc_pad_init(dac_channel_t channel)
  1342. {
  1343. RTC_MODULE_CHECK((channel >= DAC_CHANNEL_1) && (channel < DAC_CHANNEL_MAX), DAC_ERR_STR_CHANNEL_ERROR, ESP_ERR_INVALID_ARG);
  1344. gpio_num_t gpio_num = 0;
  1345. dac_pad_get_io_num(channel, &gpio_num);
  1346. rtc_gpio_init(gpio_num);
  1347. rtc_gpio_output_disable(gpio_num);
  1348. rtc_gpio_input_disable(gpio_num);
  1349. rtc_gpio_pullup_dis(gpio_num);
  1350. rtc_gpio_pulldown_dis(gpio_num);
  1351. return ESP_OK;
  1352. }
  1353. esp_err_t dac_output_enable(dac_channel_t channel)
  1354. {
  1355. RTC_MODULE_CHECK((channel >= DAC_CHANNEL_1) && (channel < DAC_CHANNEL_MAX), DAC_ERR_STR_CHANNEL_ERROR, ESP_ERR_INVALID_ARG);
  1356. dac_rtc_pad_init(channel);
  1357. portENTER_CRITICAL(&rtc_spinlock);
  1358. if (channel == DAC_CHANNEL_1) {
  1359. SET_PERI_REG_MASK(RTC_IO_PAD_DAC1_REG, RTC_IO_PDAC1_XPD_DAC | RTC_IO_PDAC1_DAC_XPD_FORCE);
  1360. } else if (channel == DAC_CHANNEL_2) {
  1361. SET_PERI_REG_MASK(RTC_IO_PAD_DAC2_REG, RTC_IO_PDAC2_XPD_DAC | RTC_IO_PDAC2_DAC_XPD_FORCE);
  1362. }
  1363. portEXIT_CRITICAL(&rtc_spinlock);
  1364. return ESP_OK;
  1365. }
  1366. esp_err_t dac_output_disable(dac_channel_t channel)
  1367. {
  1368. RTC_MODULE_CHECK((channel >= DAC_CHANNEL_1) && (channel < DAC_CHANNEL_MAX), DAC_ERR_STR_CHANNEL_ERROR, ESP_ERR_INVALID_ARG);
  1369. portENTER_CRITICAL(&rtc_spinlock);
  1370. if (channel == DAC_CHANNEL_1) {
  1371. CLEAR_PERI_REG_MASK(RTC_IO_PAD_DAC1_REG, RTC_IO_PDAC1_XPD_DAC | RTC_IO_PDAC1_DAC_XPD_FORCE);
  1372. } else if (channel == DAC_CHANNEL_2) {
  1373. CLEAR_PERI_REG_MASK(RTC_IO_PAD_DAC2_REG, RTC_IO_PDAC2_XPD_DAC | RTC_IO_PDAC2_DAC_XPD_FORCE);
  1374. }
  1375. portEXIT_CRITICAL(&rtc_spinlock);
  1376. return ESP_OK;
  1377. }
  1378. esp_err_t dac_output_voltage(dac_channel_t channel, uint8_t dac_value)
  1379. {
  1380. RTC_MODULE_CHECK((channel >= DAC_CHANNEL_1) && (channel < DAC_CHANNEL_MAX), DAC_ERR_STR_CHANNEL_ERROR, ESP_ERR_INVALID_ARG);
  1381. portENTER_CRITICAL(&rtc_spinlock);
  1382. //Disable Tone
  1383. CLEAR_PERI_REG_MASK(SENS_SAR_DAC_CTRL1_REG, SENS_SW_TONE_EN);
  1384. //Disable Channel Tone
  1385. if (channel == DAC_CHANNEL_1) {
  1386. CLEAR_PERI_REG_MASK(SENS_SAR_DAC_CTRL2_REG, SENS_DAC_CW_EN1_M);
  1387. } else if (channel == DAC_CHANNEL_2) {
  1388. CLEAR_PERI_REG_MASK(SENS_SAR_DAC_CTRL2_REG, SENS_DAC_CW_EN2_M);
  1389. }
  1390. //Set the Dac value
  1391. if (channel == DAC_CHANNEL_1) {
  1392. SET_PERI_REG_BITS(RTC_IO_PAD_DAC1_REG, RTC_IO_PDAC1_DAC, dac_value, RTC_IO_PDAC1_DAC_S); //dac_output
  1393. } else if (channel == DAC_CHANNEL_2) {
  1394. SET_PERI_REG_BITS(RTC_IO_PAD_DAC2_REG, RTC_IO_PDAC2_DAC, dac_value, RTC_IO_PDAC2_DAC_S); //dac_output
  1395. }
  1396. portEXIT_CRITICAL(&rtc_spinlock);
  1397. return ESP_OK;
  1398. }
  1399. esp_err_t dac_out_voltage(dac_channel_t channel, uint8_t dac_value)
  1400. {
  1401. RTC_MODULE_CHECK((channel >= DAC_CHANNEL_1) && (channel < DAC_CHANNEL_MAX), DAC_ERR_STR_CHANNEL_ERROR, ESP_ERR_INVALID_ARG);
  1402. portENTER_CRITICAL(&rtc_spinlock);
  1403. //Disable Tone
  1404. CLEAR_PERI_REG_MASK(SENS_SAR_DAC_CTRL1_REG, SENS_SW_TONE_EN);
  1405. //Disable Channel Tone
  1406. if (channel == DAC_CHANNEL_1) {
  1407. CLEAR_PERI_REG_MASK(SENS_SAR_DAC_CTRL2_REG, SENS_DAC_CW_EN1_M);
  1408. } else if (channel == DAC_CHANNEL_2) {
  1409. CLEAR_PERI_REG_MASK(SENS_SAR_DAC_CTRL2_REG, SENS_DAC_CW_EN2_M);
  1410. }
  1411. //Set the Dac value
  1412. if (channel == DAC_CHANNEL_1) {
  1413. SET_PERI_REG_BITS(RTC_IO_PAD_DAC1_REG, RTC_IO_PDAC1_DAC, dac_value, RTC_IO_PDAC1_DAC_S); //dac_output
  1414. } else if (channel == DAC_CHANNEL_2) {
  1415. SET_PERI_REG_BITS(RTC_IO_PAD_DAC2_REG, RTC_IO_PDAC2_DAC, dac_value, RTC_IO_PDAC2_DAC_S); //dac_output
  1416. }
  1417. portEXIT_CRITICAL(&rtc_spinlock);
  1418. //dac pad init
  1419. dac_rtc_pad_init(channel);
  1420. dac_output_enable(channel);
  1421. return ESP_OK;
  1422. }
  1423. esp_err_t dac_i2s_enable()
  1424. {
  1425. portENTER_CRITICAL(&rtc_spinlock);
  1426. SET_PERI_REG_MASK(SENS_SAR_DAC_CTRL1_REG, SENS_DAC_DIG_FORCE_M | SENS_DAC_CLK_INV_M);
  1427. portEXIT_CRITICAL(&rtc_spinlock);
  1428. return ESP_OK;
  1429. }
  1430. esp_err_t dac_i2s_disable()
  1431. {
  1432. portENTER_CRITICAL(&rtc_spinlock);
  1433. CLEAR_PERI_REG_MASK(SENS_SAR_DAC_CTRL1_REG, SENS_DAC_DIG_FORCE_M | SENS_DAC_CLK_INV_M);
  1434. portEXIT_CRITICAL(&rtc_spinlock);
  1435. return ESP_OK;
  1436. }
  1437. /*---------------------------------------------------------------
  1438. HALL SENSOR
  1439. ---------------------------------------------------------------*/
  1440. static int hall_sensor_get_value() //hall sensor without LNA
  1441. {
  1442. int Sens_Vp0;
  1443. int Sens_Vn0;
  1444. int Sens_Vp1;
  1445. int Sens_Vn1;
  1446. int hall_value;
  1447. adc_power_on();
  1448. portENTER_CRITICAL(&rtc_spinlock);
  1449. SENS.sar_touch_ctrl1.xpd_hall_force = 1; // hall sens force enable
  1450. RTCIO.hall_sens.xpd_hall = 1; // xpd hall
  1451. SENS.sar_touch_ctrl1.hall_phase_force = 1; // phase force
  1452. RTCIO.hall_sens.hall_phase = 0; // hall phase
  1453. Sens_Vp0 = adc1_get_raw(ADC1_CHANNEL_0);
  1454. Sens_Vn0 = adc1_get_raw(ADC1_CHANNEL_3);
  1455. RTCIO.hall_sens.hall_phase = 1;
  1456. Sens_Vp1 = adc1_get_raw(ADC1_CHANNEL_0);
  1457. Sens_Vn1 = adc1_get_raw(ADC1_CHANNEL_3);
  1458. SENS.sar_touch_ctrl1.xpd_hall_force = 0;
  1459. SENS.sar_touch_ctrl1.hall_phase_force = 0;
  1460. portEXIT_CRITICAL(&rtc_spinlock);
  1461. hall_value = (Sens_Vp1 - Sens_Vp0) - (Sens_Vn1 - Sens_Vn0);
  1462. return hall_value;
  1463. }
  1464. int hall_sensor_read()
  1465. {
  1466. adc_gpio_init(ADC_UNIT_1, ADC1_CHANNEL_0);
  1467. adc_gpio_init(ADC_UNIT_1, ADC1_CHANNEL_3);
  1468. adc1_config_channel_atten(ADC1_CHANNEL_0, ADC_ATTEN_DB_0);
  1469. adc1_config_channel_atten(ADC1_CHANNEL_3, ADC_ATTEN_DB_0);
  1470. return hall_sensor_get_value();
  1471. }
  1472. /*---------------------------------------------------------------
  1473. INTERRUPT HANDLER
  1474. ---------------------------------------------------------------*/
  1475. typedef struct rtc_isr_handler_ {
  1476. uint32_t mask;
  1477. intr_handler_t handler;
  1478. void* handler_arg;
  1479. SLIST_ENTRY(rtc_isr_handler_) next;
  1480. } rtc_isr_handler_t;
  1481. static SLIST_HEAD(rtc_isr_handler_list_, rtc_isr_handler_) s_rtc_isr_handler_list =
  1482. SLIST_HEAD_INITIALIZER(s_rtc_isr_handler_list);
  1483. portMUX_TYPE s_rtc_isr_handler_list_lock = portMUX_INITIALIZER_UNLOCKED;
  1484. static intr_handle_t s_rtc_isr_handle;
  1485. static void rtc_isr(void* arg)
  1486. {
  1487. uint32_t status = REG_READ(RTC_CNTL_INT_ST_REG);
  1488. rtc_isr_handler_t* it;
  1489. portENTER_CRITICAL(&s_rtc_isr_handler_list_lock);
  1490. SLIST_FOREACH(it, &s_rtc_isr_handler_list, next) {
  1491. if (it->mask & status) {
  1492. portEXIT_CRITICAL(&s_rtc_isr_handler_list_lock);
  1493. (*it->handler)(it->handler_arg);
  1494. portENTER_CRITICAL(&s_rtc_isr_handler_list_lock);
  1495. }
  1496. }
  1497. portEXIT_CRITICAL(&s_rtc_isr_handler_list_lock);
  1498. REG_WRITE(RTC_CNTL_INT_CLR_REG, status);
  1499. }
  1500. static esp_err_t rtc_isr_ensure_installed()
  1501. {
  1502. esp_err_t err = ESP_OK;
  1503. portENTER_CRITICAL(&s_rtc_isr_handler_list_lock);
  1504. if (s_rtc_isr_handle) {
  1505. goto out;
  1506. }
  1507. REG_WRITE(RTC_CNTL_INT_ENA_REG, 0);
  1508. REG_WRITE(RTC_CNTL_INT_CLR_REG, UINT32_MAX);
  1509. err = esp_intr_alloc(ETS_RTC_CORE_INTR_SOURCE, 0, &rtc_isr, NULL, &s_rtc_isr_handle);
  1510. if (err != ESP_OK) {
  1511. goto out;
  1512. }
  1513. out:
  1514. portEXIT_CRITICAL(&s_rtc_isr_handler_list_lock);
  1515. return err;
  1516. }
  1517. esp_err_t rtc_isr_register(intr_handler_t handler, void* handler_arg, uint32_t rtc_intr_mask)
  1518. {
  1519. esp_err_t err = rtc_isr_ensure_installed();
  1520. if (err != ESP_OK) {
  1521. return err;
  1522. }
  1523. rtc_isr_handler_t* item = malloc(sizeof(*item));
  1524. if (item == NULL) {
  1525. return ESP_ERR_NO_MEM;
  1526. }
  1527. item->handler = handler;
  1528. item->handler_arg = handler_arg;
  1529. item->mask = rtc_intr_mask;
  1530. portENTER_CRITICAL(&s_rtc_isr_handler_list_lock);
  1531. SLIST_INSERT_HEAD(&s_rtc_isr_handler_list, item, next);
  1532. portEXIT_CRITICAL(&s_rtc_isr_handler_list_lock);
  1533. return ESP_OK;
  1534. }
  1535. esp_err_t rtc_isr_deregister(intr_handler_t handler, void* handler_arg)
  1536. {
  1537. rtc_isr_handler_t* it;
  1538. rtc_isr_handler_t* prev = NULL;
  1539. bool found = false;
  1540. portENTER_CRITICAL(&s_rtc_isr_handler_list_lock);
  1541. SLIST_FOREACH(it, &s_rtc_isr_handler_list, next) {
  1542. if (it->handler == handler && it->handler_arg == handler_arg) {
  1543. if (it == SLIST_FIRST(&s_rtc_isr_handler_list)) {
  1544. SLIST_REMOVE_HEAD(&s_rtc_isr_handler_list, next);
  1545. } else {
  1546. SLIST_REMOVE_AFTER(prev, next);
  1547. }
  1548. found = true;
  1549. break;
  1550. }
  1551. prev = it;
  1552. }
  1553. portEXIT_CRITICAL(&s_rtc_isr_handler_list_lock);
  1554. return found ? ESP_OK : ESP_ERR_INVALID_STATE;
  1555. }