adc.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725
  1. // Copyright 2016-2020 Espressif Systems (Shanghai) PTE LTD
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #include <esp_types.h>
  15. #include <stdlib.h>
  16. #include <ctype.h>
  17. #include <string.h>
  18. #include "sdkconfig.h"
  19. #include "esp_intr_alloc.h"
  20. #include "esp_log.h"
  21. #include "esp_pm.h"
  22. #include "sys/lock.h"
  23. #include "freertos/FreeRTOS.h"
  24. #include "freertos/semphr.h"
  25. #include "freertos/timers.h"
  26. #include "freertos/ringbuf.h"
  27. #include "esp32c3/rom/ets_sys.h"
  28. #include "driver/periph_ctrl.h"
  29. #include "driver/gpio.h"
  30. #include "driver/adc.h"
  31. #include "hal/adc_types.h"
  32. #include "hal/adc_hal.h"
  33. #include "hal/dma_types.h"
  34. #include "esp32c3/esp_efuse_rtc_calib.h"
  35. #include "esp_private/gdma.h"
  36. #define ADC_CHECK_RET(fun_ret) ({ \
  37. if (fun_ret != ESP_OK) { \
  38. ESP_LOGE(ADC_TAG,"%s:%d\n",__FUNCTION__,__LINE__); \
  39. return ESP_FAIL; \
  40. } \
  41. })
  42. static const char *ADC_TAG = "ADC";
  43. #define ADC_CHECK(a, str, ret_val) ({ \
  44. if (!(a)) { \
  45. ESP_LOGE(ADC_TAG,"%s:%d (%s):%s", __FILE__, __LINE__, __FUNCTION__, str); \
  46. return (ret_val); \
  47. } \
  48. })
  49. #define ADC_GET_IO_NUM(periph, channel) (adc_channel_io_map[periph][channel])
  50. #define ADC_CHANNEL_CHECK(periph, channel) ADC_CHECK(channel < SOC_ADC_CHANNEL_NUM(periph), "ADC"#periph" channel error", ESP_ERR_INVALID_ARG)
  51. extern portMUX_TYPE rtc_spinlock; //TODO: Will be placed in the appropriate position after the rtc module is finished.
  52. #define ADC_ENTER_CRITICAL() portENTER_CRITICAL(&rtc_spinlock)
  53. #define ADC_EXIT_CRITICAL() portEXIT_CRITICAL(&rtc_spinlock)
  54. /**
  55. * 1. sar_adc1_lock: this mutex lock is to protect the SARADC1 module.
  56. * 2. sar_adc2_lock: this mutex lock is to protect the SARADC2 module. On C3, it is controlled by the digital controller
  57. * and PWDET controller.
  58. * 3. adc_reg_lock: this spin lock is to protect the shared registers used by ADC1 / ADC2 single read mode.
  59. */
  60. static _lock_t sar_adc1_lock;
  61. #define SAR_ADC1_LOCK_ACQUIRE() _lock_acquire(&sar_adc1_lock)
  62. #define SAR_ADC1_LOCK_RELEASE() _lock_release(&sar_adc1_lock)
  63. static _lock_t sar_adc2_lock;
  64. #define SAR_ADC2_LOCK_ACQUIRE() _lock_acquire(&sar_adc2_lock)
  65. #define SAR_ADC2_LOCK_RELEASE() _lock_release(&sar_adc2_lock)
  66. portMUX_TYPE adc_reg_lock = portMUX_INITIALIZER_UNLOCKED;
  67. #define ADC_REG_LOCK_ENTER() portENTER_CRITICAL(&adc_reg_lock)
  68. #define ADC_REG_LOCK_EXIT() portEXIT_CRITICAL(&adc_reg_lock)
  69. #define INTERNAL_BUF_NUM 5
  70. #define IN_SUC_EOF_BIT GDMA_LL_EVENT_RX_SUC_EOF
  71. /*---------------------------------------------------------------
  72. Digital Controller Context
  73. ---------------------------------------------------------------*/
  74. typedef struct adc_digi_context_t {
  75. uint8_t *rx_dma_buf; //dma buffer
  76. adc_hal_context_t hal; //hal context
  77. gdma_channel_handle_t rx_dma_channel; //dma rx channel handle
  78. RingbufHandle_t ringbuf_hdl; //RX ringbuffer handler
  79. intptr_t rx_eof_desc_addr; //eof descriptor address of RX channel
  80. bool ringbuf_overflow_flag; //1: ringbuffer overflow
  81. bool driver_start_flag; //1: driver is started; 0: driver is stoped
  82. bool use_adc1; //1: ADC unit1 will be used; 0: ADC unit1 won't be used.
  83. bool use_adc2; //1: ADC unit2 will be used; 0: ADC unit2 won't be used. This determines whether to acquire sar_adc2_mutex lock or not.
  84. adc_atten_t adc1_atten; //Attenuation for ADC1. On this chip each ADC can only support one attenuation.
  85. adc_atten_t adc2_atten; //Attenuation for ADC2. On this chip each ADC can only support one attenuation.
  86. adc_digi_config_t digi_controller_config; //Digital Controller Configuration
  87. esp_pm_lock_handle_t pm_lock; //For power management
  88. } adc_digi_context_t;
  89. static adc_digi_context_t *s_adc_digi_ctx = NULL;
  90. static uint32_t adc_get_calibration_offset(adc_ll_num_t adc_n, adc_channel_t chan, adc_atten_t atten);
  91. /*---------------------------------------------------------------
  92. ADC Continuous Read Mode (via DMA)
  93. ---------------------------------------------------------------*/
  94. static IRAM_ATTR bool adc_dma_in_suc_eof_callback(gdma_channel_handle_t dma_chan, gdma_event_data_t *event_data, void *user_data);
  95. static int8_t adc_digi_get_io_num(uint8_t adc_unit, uint8_t adc_channel)
  96. {
  97. return adc_channel_io_map[adc_unit][adc_channel];
  98. }
  99. static esp_err_t adc_digi_gpio_init(adc_unit_t adc_unit, uint16_t channel_mask)
  100. {
  101. esp_err_t ret = ESP_OK;
  102. uint64_t gpio_mask = 0;
  103. uint32_t n = 0;
  104. int8_t io = 0;
  105. while (channel_mask) {
  106. if (channel_mask & 0x1) {
  107. io = adc_digi_get_io_num(adc_unit, n);
  108. if (io < 0) {
  109. return ESP_ERR_INVALID_ARG;
  110. }
  111. gpio_mask |= BIT64(io);
  112. }
  113. channel_mask = channel_mask >> 1;
  114. n++;
  115. }
  116. gpio_config_t cfg = {
  117. .pin_bit_mask = gpio_mask,
  118. .mode = GPIO_MODE_DISABLE,
  119. };
  120. ret = gpio_config(&cfg);
  121. return ret;
  122. }
  123. esp_err_t adc_digi_initialize(const adc_digi_init_config_t *init_config)
  124. {
  125. esp_err_t ret = ESP_OK;
  126. s_adc_digi_ctx = calloc(1, sizeof(adc_digi_context_t));
  127. if (s_adc_digi_ctx == NULL) {
  128. ret = ESP_ERR_NO_MEM;
  129. goto cleanup;
  130. }
  131. //ringbuffer
  132. s_adc_digi_ctx->ringbuf_hdl = xRingbufferCreate(init_config->max_store_buf_size, RINGBUF_TYPE_BYTEBUF);
  133. if (!s_adc_digi_ctx->ringbuf_hdl) {
  134. ret = ESP_ERR_NO_MEM;
  135. goto cleanup;
  136. }
  137. //malloc internal buffer used by DMA
  138. s_adc_digi_ctx->rx_dma_buf = heap_caps_calloc(1, init_config->conv_num_each_intr * INTERNAL_BUF_NUM, MALLOC_CAP_INTERNAL);
  139. if (!s_adc_digi_ctx->rx_dma_buf) {
  140. ret = ESP_ERR_NO_MEM;
  141. goto cleanup;
  142. }
  143. //malloc dma descriptor
  144. s_adc_digi_ctx->hal.rx_desc = heap_caps_calloc(1, (sizeof(dma_descriptor_t)) * INTERNAL_BUF_NUM, MALLOC_CAP_DMA);
  145. if (!s_adc_digi_ctx->hal.rx_desc) {
  146. ret = ESP_ERR_NO_MEM;
  147. goto cleanup;
  148. }
  149. //malloc pattern table
  150. s_adc_digi_ctx->digi_controller_config.adc_pattern = calloc(1, SOC_ADC_PATT_LEN_MAX * sizeof(adc_digi_pattern_table_t));
  151. if (!s_adc_digi_ctx->digi_controller_config.adc_pattern) {
  152. ret = ESP_ERR_NO_MEM;
  153. goto cleanup;
  154. }
  155. #if CONFIG_PM_ENABLE
  156. ret = esp_pm_lock_create(ESP_PM_APB_FREQ_MAX, 0, "adc_dma", &s_adc_digi_ctx->pm_lock);
  157. if (ret != ESP_OK) {
  158. goto cleanup;
  159. }
  160. #endif //CONFIG_PM_ENABLE
  161. //init gpio pins
  162. if (init_config->adc1_chan_mask) {
  163. ret = adc_digi_gpio_init(ADC_NUM_1, init_config->adc1_chan_mask);
  164. if (ret != ESP_OK) {
  165. goto cleanup;
  166. }
  167. }
  168. if (init_config->adc2_chan_mask) {
  169. ret = adc_digi_gpio_init(ADC_NUM_2, init_config->adc2_chan_mask);
  170. if (ret != ESP_OK) {
  171. goto cleanup;
  172. }
  173. }
  174. //alloc rx gdma channel
  175. gdma_channel_alloc_config_t rx_alloc_config = {
  176. .direction = GDMA_CHANNEL_DIRECTION_RX,
  177. };
  178. ret = gdma_new_channel(&rx_alloc_config, &s_adc_digi_ctx->rx_dma_channel);
  179. if (ret != ESP_OK) {
  180. goto cleanup;
  181. }
  182. gdma_connect(s_adc_digi_ctx->rx_dma_channel, GDMA_MAKE_TRIGGER(GDMA_TRIG_PERIPH_ADC, 0));
  183. gdma_strategy_config_t strategy_config = {
  184. .auto_update_desc = true,
  185. .owner_check = true
  186. };
  187. gdma_apply_strategy(s_adc_digi_ctx->rx_dma_channel, &strategy_config);
  188. gdma_rx_event_callbacks_t cbs = {
  189. .on_recv_eof = adc_dma_in_suc_eof_callback
  190. };
  191. gdma_register_rx_event_callbacks(s_adc_digi_ctx->rx_dma_channel, &cbs, s_adc_digi_ctx);
  192. int dma_chan;
  193. gdma_get_channel_id(s_adc_digi_ctx->rx_dma_channel, &dma_chan);
  194. adc_hal_config_t config = {
  195. .desc_max_num = INTERNAL_BUF_NUM,
  196. .dma_chan = dma_chan,
  197. .eof_num = init_config->conv_num_each_intr / ADC_HAL_DATA_LEN_PER_CONV
  198. };
  199. adc_hal_context_config(&s_adc_digi_ctx->hal, &config);
  200. //enable SARADC module clock
  201. periph_module_enable(PERIPH_SARADC_MODULE);
  202. adc_hal_calibration_init(ADC_NUM_1);
  203. adc_hal_calibration_init(ADC_NUM_2);
  204. return ret;
  205. cleanup:
  206. adc_digi_deinitialize();
  207. return ret;
  208. }
  209. static IRAM_ATTR bool adc_dma_intr(adc_digi_context_t *adc_digi_ctx);
  210. static IRAM_ATTR bool adc_dma_in_suc_eof_callback(gdma_channel_handle_t dma_chan, gdma_event_data_t *event_data, void *user_data)
  211. {
  212. assert(event_data);
  213. adc_digi_context_t *adc_digi_ctx = (adc_digi_context_t *)user_data;
  214. adc_digi_ctx->rx_eof_desc_addr = event_data->rx_eof_desc_addr;
  215. return adc_dma_intr(adc_digi_ctx);
  216. }
  217. static IRAM_ATTR bool adc_dma_intr(adc_digi_context_t *adc_digi_ctx)
  218. {
  219. portBASE_TYPE taskAwoken = 0;
  220. BaseType_t ret;
  221. adc_hal_dma_desc_status_t status = false;
  222. dma_descriptor_t *current_desc = NULL;
  223. while (1) {
  224. status = adc_hal_get_reading_result(&adc_digi_ctx->hal, adc_digi_ctx->rx_eof_desc_addr, &current_desc);
  225. if (status != ADC_HAL_DMA_DESC_VALID) {
  226. break;
  227. }
  228. ret = xRingbufferSendFromISR(adc_digi_ctx->ringbuf_hdl, current_desc->buffer, current_desc->dw0.length, &taskAwoken);
  229. if (ret == pdFALSE) {
  230. //ringbuffer overflow
  231. adc_digi_ctx->ringbuf_overflow_flag = 1;
  232. }
  233. }
  234. if (status == ADC_HAL_DMA_DESC_NULL) {
  235. //start next turns of dma operation
  236. adc_hal_digi_rxdma_start(&adc_digi_ctx->hal, adc_digi_ctx->rx_dma_buf);
  237. }
  238. return (taskAwoken == pdTRUE);
  239. }
  240. esp_err_t adc_digi_start(void)
  241. {
  242. if (s_adc_digi_ctx->driver_start_flag != 0) {
  243. ESP_LOGE(ADC_TAG, "The driver is already started");
  244. return ESP_ERR_INVALID_STATE;
  245. }
  246. adc_power_acquire();
  247. //reset flags
  248. s_adc_digi_ctx->ringbuf_overflow_flag = 0;
  249. s_adc_digi_ctx->driver_start_flag = 1;
  250. if (s_adc_digi_ctx->use_adc1) {
  251. SAR_ADC1_LOCK_ACQUIRE();
  252. }
  253. if (s_adc_digi_ctx->use_adc2) {
  254. SAR_ADC2_LOCK_ACQUIRE();
  255. }
  256. #if CONFIG_PM_ENABLE
  257. // Lock APB frequency while ADC driver is in use
  258. esp_pm_lock_acquire(s_adc_digi_ctx->pm_lock);
  259. #endif
  260. adc_arbiter_t config = ADC_ARBITER_CONFIG_DEFAULT();
  261. if (s_adc_digi_ctx->use_adc1) {
  262. uint32_t cal_val = adc_get_calibration_offset(ADC_NUM_1, ADC_CHANNEL_MAX, s_adc_digi_ctx->adc1_atten);
  263. adc_hal_set_calibration_param(ADC_NUM_1, cal_val);
  264. }
  265. if (s_adc_digi_ctx->use_adc2) {
  266. uint32_t cal_val = adc_get_calibration_offset(ADC_NUM_2, ADC_CHANNEL_MAX, s_adc_digi_ctx->adc2_atten);
  267. adc_hal_set_calibration_param(ADC_NUM_2, cal_val);
  268. }
  269. adc_hal_init();
  270. adc_hal_arbiter_config(&config);
  271. adc_hal_digi_init(&s_adc_digi_ctx->hal);
  272. adc_hal_digi_controller_config(&s_adc_digi_ctx->digi_controller_config);
  273. //reset ADC and DMA
  274. adc_hal_fifo_reset(&s_adc_digi_ctx->hal);
  275. //start DMA
  276. adc_hal_digi_rxdma_start(&s_adc_digi_ctx->hal, s_adc_digi_ctx->rx_dma_buf);
  277. //start ADC
  278. adc_hal_digi_start(&s_adc_digi_ctx->hal);
  279. return ESP_OK;
  280. }
  281. esp_err_t adc_digi_stop(void)
  282. {
  283. if (s_adc_digi_ctx->driver_start_flag != 1) {
  284. ESP_LOGE(ADC_TAG, "The driver is already stopped");
  285. return ESP_ERR_INVALID_STATE;
  286. }
  287. s_adc_digi_ctx->driver_start_flag = 0;
  288. //disable the in suc eof intrrupt
  289. adc_hal_digi_dis_intr(&s_adc_digi_ctx->hal, IN_SUC_EOF_BIT);
  290. //clear the in suc eof interrupt
  291. adc_hal_digi_clr_intr(&s_adc_digi_ctx->hal, IN_SUC_EOF_BIT);
  292. //stop ADC
  293. adc_hal_digi_stop(&s_adc_digi_ctx->hal);
  294. //stop DMA
  295. adc_hal_digi_rxdma_stop(&s_adc_digi_ctx->hal);
  296. adc_hal_digi_deinit();
  297. #if CONFIG_PM_ENABLE
  298. if (s_adc_digi_ctx->pm_lock) {
  299. esp_pm_lock_release(s_adc_digi_ctx->pm_lock);
  300. }
  301. #endif //CONFIG_PM_ENABLE
  302. if (s_adc_digi_ctx->use_adc1) {
  303. SAR_ADC1_LOCK_RELEASE();
  304. }
  305. if (s_adc_digi_ctx->use_adc2) {
  306. SAR_ADC2_LOCK_RELEASE();
  307. }
  308. adc_power_release();
  309. return ESP_OK;
  310. }
  311. esp_err_t adc_digi_read_bytes(uint8_t *buf, uint32_t length_max, uint32_t *out_length, uint32_t timeout_ms)
  312. {
  313. TickType_t ticks_to_wait;
  314. esp_err_t ret = ESP_OK;
  315. uint8_t *data = NULL;
  316. size_t size = 0;
  317. ticks_to_wait = timeout_ms / portTICK_RATE_MS;
  318. if (timeout_ms == ADC_MAX_DELAY) {
  319. ticks_to_wait = portMAX_DELAY;
  320. }
  321. data = xRingbufferReceiveUpTo(s_adc_digi_ctx->ringbuf_hdl, &size, ticks_to_wait, length_max);
  322. if (!data) {
  323. ESP_LOGV(ADC_TAG, "No data, increase timeout or reduce conv_num_each_intr");
  324. ret = ESP_ERR_TIMEOUT;
  325. *out_length = 0;
  326. return ret;
  327. }
  328. memcpy(buf, data, size);
  329. vRingbufferReturnItem(s_adc_digi_ctx->ringbuf_hdl, data);
  330. assert((size % 4) == 0);
  331. *out_length = size;
  332. if (s_adc_digi_ctx->ringbuf_overflow_flag) {
  333. ret = ESP_ERR_INVALID_STATE;
  334. }
  335. return ret;
  336. }
  337. esp_err_t adc_digi_deinitialize(void)
  338. {
  339. if (!s_adc_digi_ctx) {
  340. return ESP_ERR_INVALID_STATE;
  341. }
  342. if (s_adc_digi_ctx->driver_start_flag != 0) {
  343. ESP_LOGE(ADC_TAG, "The driver is not stopped");
  344. return ESP_ERR_INVALID_STATE;
  345. }
  346. if (s_adc_digi_ctx->ringbuf_hdl) {
  347. vRingbufferDelete(s_adc_digi_ctx->ringbuf_hdl);
  348. s_adc_digi_ctx->ringbuf_hdl = NULL;
  349. }
  350. #if CONFIG_PM_ENABLE
  351. if (s_adc_digi_ctx->pm_lock) {
  352. esp_pm_lock_delete(s_adc_digi_ctx->pm_lock);
  353. }
  354. #endif //CONFIG_PM_ENABLE
  355. free(s_adc_digi_ctx->rx_dma_buf);
  356. free(s_adc_digi_ctx->hal.rx_desc);
  357. free(s_adc_digi_ctx->digi_controller_config.adc_pattern);
  358. gdma_disconnect(s_adc_digi_ctx->rx_dma_channel);
  359. gdma_del_channel(s_adc_digi_ctx->rx_dma_channel);
  360. free(s_adc_digi_ctx);
  361. s_adc_digi_ctx = NULL;
  362. periph_module_disable(PERIPH_SARADC_MODULE);
  363. return ESP_OK;
  364. }
  365. /*---------------------------------------------------------------
  366. ADC Single Read Mode
  367. ---------------------------------------------------------------*/
  368. static adc_atten_t s_atten1_single[ADC1_CHANNEL_MAX]; //Array saving attenuate of each channel of ADC1, used by single read API
  369. static adc_atten_t s_atten2_single[ADC2_CHANNEL_MAX]; //Array saving attenuate of each channel of ADC2, used by single read API
  370. esp_err_t adc_vref_to_gpio(adc_unit_t adc_unit, gpio_num_t gpio)
  371. {
  372. esp_err_t ret;
  373. uint32_t channel = ADC2_CHANNEL_MAX;
  374. if (adc_unit == ADC_UNIT_2) {
  375. for (int i = 0; i < ADC2_CHANNEL_MAX; i++) {
  376. if (gpio == ADC_GET_IO_NUM(ADC_NUM_2, i)) {
  377. channel = i;
  378. break;
  379. }
  380. }
  381. if (channel == ADC2_CHANNEL_MAX) {
  382. return ESP_ERR_INVALID_ARG;
  383. }
  384. }
  385. adc_power_acquire();
  386. if (adc_unit & ADC_UNIT_1) {
  387. ADC_ENTER_CRITICAL();
  388. adc_hal_vref_output(ADC_NUM_1, channel, true);
  389. ADC_EXIT_CRITICAL()
  390. } else if (adc_unit & ADC_UNIT_2) {
  391. ADC_ENTER_CRITICAL();
  392. adc_hal_vref_output(ADC_NUM_2, channel, true);
  393. ADC_EXIT_CRITICAL()
  394. }
  395. ret = adc_digi_gpio_init(ADC_NUM_2, BIT(channel));
  396. return ret;
  397. }
  398. esp_err_t adc1_config_width(adc_bits_width_t width_bit)
  399. {
  400. //On ESP32C3, the data width is always 12-bits.
  401. if (width_bit != ADC_WIDTH_BIT_12) {
  402. return ESP_ERR_INVALID_ARG;
  403. }
  404. return ESP_OK;
  405. }
  406. esp_err_t adc1_config_channel_atten(adc1_channel_t channel, adc_atten_t atten)
  407. {
  408. ADC_CHANNEL_CHECK(ADC_NUM_1, channel);
  409. ADC_CHECK(atten < ADC_ATTEN_MAX, "ADC Atten Err", ESP_ERR_INVALID_ARG);
  410. esp_err_t ret = ESP_OK;
  411. s_atten1_single[channel] = atten;
  412. ret = adc_digi_gpio_init(ADC_NUM_1, BIT(channel));
  413. adc_hal_calibration_init(ADC_NUM_1);
  414. return ret;
  415. }
  416. int adc1_get_raw(adc1_channel_t channel)
  417. {
  418. int raw_out = 0;
  419. periph_module_enable(PERIPH_SARADC_MODULE);
  420. adc_power_acquire();
  421. SAR_ADC1_LOCK_ACQUIRE();
  422. adc_atten_t atten = s_atten1_single[channel];
  423. uint32_t cal_val = adc_get_calibration_offset(ADC_NUM_1, channel, atten);
  424. adc_hal_set_calibration_param(ADC_NUM_1, cal_val);
  425. ADC_REG_LOCK_ENTER();
  426. adc_hal_set_atten(ADC_NUM_2, channel, atten);
  427. adc_hal_convert(ADC_NUM_1, channel, &raw_out);
  428. ADC_REG_LOCK_EXIT();
  429. SAR_ADC1_LOCK_RELEASE();
  430. adc_power_release();
  431. periph_module_disable(PERIPH_SARADC_MODULE);
  432. return raw_out;
  433. }
  434. esp_err_t adc2_config_channel_atten(adc2_channel_t channel, adc_atten_t atten)
  435. {
  436. ADC_CHANNEL_CHECK(ADC_NUM_2, channel);
  437. ADC_CHECK(atten <= ADC_ATTEN_11db, "ADC2 Atten Err", ESP_ERR_INVALID_ARG);
  438. esp_err_t ret = ESP_OK;
  439. s_atten2_single[channel] = atten;
  440. ret = adc_digi_gpio_init(ADC_NUM_2, BIT(channel));
  441. adc_hal_calibration_init(ADC_NUM_2);
  442. return ret;
  443. }
  444. esp_err_t adc2_get_raw(adc2_channel_t channel, adc_bits_width_t width_bit, int *raw_out)
  445. {
  446. //On ESP32C3, the data width is always 12-bits.
  447. if (width_bit != ADC_WIDTH_BIT_12) {
  448. return ESP_ERR_INVALID_ARG;
  449. }
  450. esp_err_t ret = ESP_OK;
  451. periph_module_enable(PERIPH_SARADC_MODULE);
  452. adc_power_acquire();
  453. SAR_ADC2_LOCK_ACQUIRE();
  454. adc_atten_t atten = s_atten2_single[channel];
  455. uint32_t cal_val = adc_get_calibration_offset(ADC_NUM_2, channel, atten);
  456. adc_hal_set_calibration_param(ADC_NUM_2, cal_val);
  457. ADC_REG_LOCK_ENTER();
  458. adc_hal_set_atten(ADC_NUM_2, channel, atten);
  459. ret = adc_hal_convert(ADC_NUM_2, channel, raw_out);
  460. ADC_REG_LOCK_EXIT();
  461. SAR_ADC2_LOCK_RELEASE();
  462. adc_power_release();
  463. periph_module_disable(PERIPH_SARADC_MODULE);
  464. return ret;
  465. }
  466. /*---------------------------------------------------------------
  467. Digital controller setting
  468. ---------------------------------------------------------------*/
  469. esp_err_t adc_digi_controller_config(const adc_digi_config_t *config)
  470. {
  471. if (!s_adc_digi_ctx) {
  472. return ESP_ERR_INVALID_STATE;
  473. }
  474. ADC_CHECK(config->sample_freq_hz <= SOC_ADC_SAMPLE_FREQ_THRES_HIGH && config->sample_freq_hz >= SOC_ADC_SAMPLE_FREQ_THRES_LOW, "ADC sampling frequency out of range", ESP_ERR_INVALID_ARG);
  475. s_adc_digi_ctx->digi_controller_config.conv_limit_en = config->conv_limit_en;
  476. s_adc_digi_ctx->digi_controller_config.conv_limit_num = config->conv_limit_num;
  477. s_adc_digi_ctx->digi_controller_config.adc_pattern_len = config->adc_pattern_len;
  478. s_adc_digi_ctx->digi_controller_config.sample_freq_hz = config->sample_freq_hz;
  479. memcpy(s_adc_digi_ctx->digi_controller_config.adc_pattern, config->adc_pattern, config->adc_pattern_len * sizeof(adc_digi_pattern_table_t));
  480. const int atten_uninitialised = 999;
  481. s_adc_digi_ctx->adc1_atten = atten_uninitialised;
  482. s_adc_digi_ctx->adc2_atten = atten_uninitialised;
  483. s_adc_digi_ctx->use_adc1 = 0;
  484. s_adc_digi_ctx->use_adc2 = 0;
  485. for (int i = 0; i < config->adc_pattern_len; i++) {
  486. const adc_digi_pattern_table_t *pat = &config->adc_pattern[i];
  487. if (pat->unit == ADC_NUM_1) {
  488. s_adc_digi_ctx->use_adc1 = 1;
  489. if (s_adc_digi_ctx->adc1_atten == atten_uninitialised) {
  490. s_adc_digi_ctx->adc1_atten = pat->atten;
  491. } else if (s_adc_digi_ctx->adc1_atten != pat->atten) {
  492. return ESP_ERR_INVALID_ARG;
  493. }
  494. } else if (pat->unit == ADC_NUM_2) {
  495. //See whether ADC2 will be used or not. If yes, the ``sar_adc2_mutex`` should be acquired in the continuous read driver
  496. s_adc_digi_ctx->use_adc2 = 1;
  497. if (s_adc_digi_ctx->adc2_atten == atten_uninitialised) {
  498. s_adc_digi_ctx->adc2_atten = pat->atten;
  499. } else if (s_adc_digi_ctx->adc2_atten != pat->atten) {
  500. return ESP_ERR_INVALID_ARG;
  501. }
  502. }
  503. }
  504. return ESP_OK;
  505. }
  506. /*************************************/
  507. /* Digital controller filter setting */
  508. /*************************************/
  509. esp_err_t adc_digi_filter_reset(adc_digi_filter_idx_t idx)
  510. {
  511. ADC_ENTER_CRITICAL();
  512. adc_hal_digi_filter_reset(idx);
  513. ADC_EXIT_CRITICAL();
  514. return ESP_OK;
  515. }
  516. esp_err_t adc_digi_filter_set_config(adc_digi_filter_idx_t idx, adc_digi_filter_t *config)
  517. {
  518. ADC_ENTER_CRITICAL();
  519. adc_hal_digi_filter_set_factor(idx, config);
  520. ADC_EXIT_CRITICAL();
  521. return ESP_OK;
  522. }
  523. esp_err_t adc_digi_filter_get_config(adc_digi_filter_idx_t idx, adc_digi_filter_t *config)
  524. {
  525. ADC_ENTER_CRITICAL();
  526. adc_hal_digi_filter_get_factor(idx, config);
  527. ADC_EXIT_CRITICAL();
  528. return ESP_OK;
  529. }
  530. esp_err_t adc_digi_filter_enable(adc_digi_filter_idx_t idx, bool enable)
  531. {
  532. ADC_ENTER_CRITICAL();
  533. adc_hal_digi_filter_enable(idx, enable);
  534. ADC_EXIT_CRITICAL();
  535. return ESP_OK;
  536. }
  537. /**************************************/
  538. /* Digital controller monitor setting */
  539. /**************************************/
  540. esp_err_t adc_digi_monitor_set_config(adc_digi_monitor_idx_t idx, adc_digi_monitor_t *config)
  541. {
  542. ADC_ENTER_CRITICAL();
  543. adc_hal_digi_monitor_config(idx, config);
  544. ADC_EXIT_CRITICAL();
  545. return ESP_OK;
  546. }
  547. esp_err_t adc_digi_monitor_enable(adc_digi_monitor_idx_t idx, bool enable)
  548. {
  549. ADC_ENTER_CRITICAL();
  550. adc_hal_digi_monitor_enable(idx, enable);
  551. ADC_EXIT_CRITICAL();
  552. return ESP_OK;
  553. }
  554. /*---------------------------------------------------------------
  555. RTC controller setting
  556. ---------------------------------------------------------------*/
  557. static uint16_t s_adc_cali_param[ADC_UNIT_MAX][ADC_ATTEN_MAX] = {};
  558. //NOTE: according to calibration version, different types of lock may be taken during the process:
  559. // 1. Semaphore when reading efuse
  560. // 2. Lock (Spinlock, or Mutex) if we actually do ADC calibration in the future
  561. //This function shoudn't be called inside critical section or ISR
  562. static uint32_t adc_get_calibration_offset(adc_ll_num_t adc_n, adc_channel_t channel, adc_atten_t atten)
  563. {
  564. const bool no_cal = false;
  565. if (s_adc_cali_param[adc_n][atten]) {
  566. return (uint32_t)s_adc_cali_param[adc_n][atten];
  567. }
  568. if (no_cal) {
  569. return 0; //indicating failure
  570. }
  571. // check if we can fetch the values from eFuse.
  572. int version = esp_efuse_rtc_calib_get_ver();
  573. uint32_t init_code = 0;
  574. if (version == 1) {
  575. //for calibration v1, both ADC units use the same init code (calibrated by ADC1)
  576. init_code = esp_efuse_rtc_calib_get_init_code(version, atten);
  577. ESP_LOGD(ADC_TAG, "Calib(V%d) ADC0, 1 atten=%d: %04X", version, atten, init_code);
  578. s_adc_cali_param[0][atten] = init_code;
  579. s_adc_cali_param[1][atten] = init_code;
  580. } else {
  581. adc_power_acquire();
  582. ADC_ENTER_CRITICAL();
  583. const bool internal_gnd = true;
  584. init_code = adc_hal_self_calibration(adc_n, channel, atten, internal_gnd);
  585. ADC_EXIT_CRITICAL();
  586. adc_power_release();
  587. ESP_LOGD(ADC_TAG, "Calib(V%d) ADC%d atten=%d: %04X", version, adc_n, atten, init_code);
  588. s_adc_cali_param[adc_n][atten] = init_code;
  589. }
  590. return init_code;
  591. }
  592. // Internal function to calibrate PWDET for WiFi
  593. esp_err_t adc_cal_offset(adc_ll_num_t adc_n, adc_channel_t channel, adc_atten_t atten)
  594. {
  595. adc_hal_calibration_init(adc_n);
  596. uint32_t cal_val = adc_get_calibration_offset(adc_n, channel, atten);
  597. ADC_ENTER_CRITICAL();
  598. adc_hal_set_calibration_param(adc_n, cal_val);
  599. ADC_EXIT_CRITICAL();
  600. return ESP_OK;
  601. }