adc_hal.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668
  1. /*
  2. * SPDX-FileCopyrightText: 2019-2021 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include <sys/param.h>
  7. #include "sdkconfig.h"
  8. #include "hal/adc_hal.h"
  9. #include "hal/adc_hal_conf.h"
  10. #include "hal/assert.h"
  11. #include "soc/lldesc.h"
  12. #include "soc/soc_caps.h"
  13. #if CONFIG_IDF_TARGET_ESP32
  14. //ADC utilises I2S0 DMA on ESP32
  15. #include "hal/i2s_ll.h"
  16. #include "hal/i2s_types.h"
  17. #include "soc/i2s_struct.h"
  18. #endif
  19. #if CONFIG_IDF_TARGET_ESP32S2
  20. //ADC utilises SPI3 DMA on ESP32S2
  21. #include "hal/spi_ll.h"
  22. #include "soc/spi_struct.h"
  23. #endif
  24. #if SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED
  25. /*---------------------------------------------------------------
  26. Single Read
  27. ---------------------------------------------------------------*/
  28. /**
  29. * For chips without RTC controller, Digital controller is used to trigger an ADC single read.
  30. */
  31. #include "esp_rom_sys.h"
  32. typedef enum {
  33. ADC_EVENT_ADC1_DONE = BIT(0),
  34. ADC_EVENT_ADC2_DONE = BIT(1),
  35. } adc_hal_event_t;
  36. #endif //SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED
  37. /*---------------------------------------------------------------
  38. Define all ADC DMA required operations here
  39. ---------------------------------------------------------------*/
  40. #if SOC_GDMA_SUPPORTED
  41. #define adc_dma_ll_rx_clear_intr(dev, chan, mask) gdma_ll_rx_clear_interrupt_status(dev, chan, mask)
  42. #define adc_dma_ll_rx_enable_intr(dev, chan, mask) gdma_ll_rx_enable_interrupt(dev, chan, mask, true)
  43. #define adc_dma_ll_rx_disable_intr(dev, chan, mask) gdma_ll_rx_enable_interrupt(dev, chan, mask, false)
  44. #define adc_dma_ll_rx_reset_channel(dev, chan) gdma_ll_rx_reset_channel(dev, chan)
  45. #define adc_dma_ll_rx_stop(dev, chan) gdma_ll_rx_stop(dev, chan)
  46. #define adc_dma_ll_rx_start(dev, chan, addr) do { \
  47. gdma_ll_rx_set_desc_addr(dev, chan, (uint32_t)addr); \
  48. gdma_ll_rx_start(dev, chan); \
  49. } while (0)
  50. #define adc_ll_digi_dma_set_eof_num(dev, num) adc_ll_digi_dma_set_eof_num(num)
  51. #define adc_ll_digi_reset(dev) adc_ll_digi_reset()
  52. #define adc_ll_digi_trigger_enable(dev) adc_ll_digi_trigger_enable()
  53. #define adc_ll_digi_trigger_disable(dev) adc_ll_digi_trigger_disable()
  54. //ADC utilises SPI3 DMA on ESP32S2
  55. #elif CONFIG_IDF_TARGET_ESP32S2
  56. #define adc_dma_ll_rx_get_intr(dev, mask) spi_ll_get_intr(dev, mask)
  57. #define adc_dma_ll_rx_clear_intr(dev, chan, mask) spi_ll_clear_intr(dev, mask)
  58. #define adc_dma_ll_rx_enable_intr(dev, chan, mask) spi_ll_enable_intr(dev, mask)
  59. #define adc_dma_ll_rx_disable_intr(dev, chan, mask) spi_ll_disable_intr(dev, mask)
  60. #define adc_dma_ll_rx_reset_channel(dev, chan) spi_dma_ll_rx_reset(dev, chan)
  61. #define adc_dma_ll_rx_stop(dev, chan) spi_dma_ll_rx_stop(dev, chan)
  62. #define adc_dma_ll_rx_start(dev, chan, addr) spi_dma_ll_rx_start(dev, chan, addr)
  63. #define adc_dma_ll_get_in_suc_eof_desc_addr(dev, chan) spi_dma_ll_get_in_suc_eof_desc_addr(dev, chan)
  64. #define adc_ll_digi_dma_set_eof_num(dev, num) adc_ll_digi_dma_set_eof_num(num)
  65. #define adc_ll_digi_reset(dev) adc_ll_digi_reset()
  66. #define adc_ll_digi_trigger_enable(dev) adc_ll_digi_trigger_enable()
  67. #define adc_ll_digi_trigger_disable(dev) adc_ll_digi_trigger_disable()
  68. //ADC utilises I2S0 DMA on ESP32
  69. #else //CONFIG_IDF_TARGET_ESP32
  70. #define adc_dma_ll_rx_get_intr(dev, mask) ({i2s_ll_get_intr_status(dev) & mask;})
  71. #define adc_dma_ll_rx_clear_intr(dev, chan, mask) i2s_ll_clear_intr_status(dev, mask)
  72. #define adc_dma_ll_rx_enable_intr(dev, chan, mask) do {((i2s_dev_t *)(dev))->int_ena.val |= mask;} while (0)
  73. #define adc_dma_ll_rx_disable_intr(dev, chan, mask) do {((i2s_dev_t *)(dev))->int_ena.val &= ~mask;} while (0)
  74. #define adc_dma_ll_rx_reset_channel(dev, chan) i2s_ll_rx_reset_dma(dev)
  75. #define adc_dma_ll_rx_stop(dev, chan) i2s_ll_rx_stop_link(dev)
  76. #define adc_dma_ll_rx_start(dev, chan, address) do { \
  77. ((i2s_dev_t *)(dev))->in_link.addr = (uint32_t)(address); \
  78. i2s_ll_enable_dma(dev, 1); \
  79. ((i2s_dev_t *)(dev))->in_link.start = 1; \
  80. } while (0)
  81. #define adc_dma_ll_get_in_suc_eof_desc_addr(dev, chan) ({uint32_t addr; i2s_ll_rx_get_eof_des_addr(dev, &addr); addr;})
  82. #define adc_ll_digi_dma_set_eof_num(dev, num) do {((i2s_dev_t *)(dev))->rx_eof_num = num;} while (0)
  83. #define adc_ll_digi_reset(dev) do { \
  84. i2s_ll_rx_reset(dev); \
  85. i2s_ll_rx_reset_fifo(dev); \
  86. } while (0)
  87. #define adc_ll_digi_trigger_enable(dev) i2s_ll_rx_start(dev)
  88. #define adc_ll_digi_trigger_disable(dev) i2s_ll_rx_stop(dev)
  89. #define adc_ll_digi_dma_enable() adc_ll_digi_set_data_source(1) //Will this influence I2S0
  90. #define adc_ll_digi_dma_disable() adc_ll_digi_set_data_source(0)
  91. //ESP32 ADC uses the DMA through I2S. The I2S needs to be configured.
  92. #define I2S_BASE_CLK (2*APB_CLK_FREQ)
  93. #define SAMPLE_BITS 16
  94. #define ADC_LL_CLKM_DIV_NUM_DEFAULT 2
  95. #define ADC_LL_CLKM_DIV_B_DEFAULT 0
  96. #define ADC_LL_CLKM_DIV_A_DEFAULT 1
  97. #endif
  98. void adc_hal_init(void)
  99. {
  100. // Set internal FSM wait time, fixed value.
  101. adc_ll_digi_set_fsm_time(SOC_ADC_FSM_RSTB_WAIT_DEFAULT, SOC_ADC_FSM_START_WAIT_DEFAULT,
  102. SOC_ADC_FSM_STANDBY_WAIT_DEFAULT);
  103. adc_ll_set_sample_cycle(ADC_FSM_SAMPLE_CYCLE_DEFAULT);
  104. adc_hal_pwdet_set_cct(SOC_ADC_PWDET_CCT_DEFAULT);
  105. adc_ll_digi_output_invert(ADC_NUM_1, SOC_ADC_DIGI_DATA_INVERT_DEFAULT(ADC_NUM_1));
  106. adc_ll_digi_output_invert(ADC_NUM_2, SOC_ADC_DIGI_DATA_INVERT_DEFAULT(ADC_NUM_2));
  107. adc_ll_digi_set_clk_div(SOC_ADC_DIGI_SAR_CLK_DIV_DEFAULT);
  108. }
  109. #if SOC_ADC_ARBITER_SUPPORTED
  110. void adc_hal_arbiter_config(adc_arbiter_t *config)
  111. {
  112. adc_ll_set_arbiter_work_mode(config->mode);
  113. adc_ll_set_arbiter_priority(config->rtc_pri, config->dig_pri, config->pwdet_pri);
  114. }
  115. #endif // #if SOC_ADC_ARBITER_SUPPORTED
  116. void adc_hal_digi_deinit(adc_hal_context_t *hal)
  117. {
  118. adc_ll_digi_trigger_disable(hal->dev);
  119. adc_ll_digi_dma_disable();
  120. adc_ll_digi_clear_pattern_table(ADC_NUM_1);
  121. adc_ll_digi_clear_pattern_table(ADC_NUM_2);
  122. adc_ll_digi_reset(hal->dev);
  123. adc_ll_digi_controller_clk_disable();
  124. }
  125. /*---------------------------------------------------------------
  126. Controller Setting
  127. ---------------------------------------------------------------*/
  128. static adc_ll_controller_t get_controller(adc_ll_num_t unit, adc_hal_work_mode_t work_mode)
  129. {
  130. if (unit == ADC_NUM_1) {
  131. switch (work_mode) {
  132. #if SOC_ULP_SUPPORTED
  133. case ADC_HAL_ULP_MODE:
  134. return ADC_LL_CTRL_ULP;
  135. #endif
  136. case ADC_HAL_SINGLE_READ_MODE:
  137. #if SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED
  138. return ADC_LL_CTRL_DIG;
  139. #elif SOC_ADC_RTC_CTRL_SUPPORTED
  140. return ADC_LL_CTRL_RTC;
  141. #endif
  142. case ADC_HAL_CONTINUOUS_READ_MODE:
  143. return ADC_LL_CTRL_DIG;
  144. default:
  145. abort();
  146. }
  147. } else {
  148. switch (work_mode) {
  149. #if SOC_ULP_SUPPORTED
  150. case ADC_HAL_ULP_MODE:
  151. return ADC_LL_CTRL_ULP;
  152. #endif
  153. #if !SOC_ADC_ARBITER_SUPPORTED //No ADC2 arbiter on ESP32
  154. case ADC_HAL_SINGLE_READ_MODE:
  155. return ADC_LL_CTRL_RTC;
  156. case ADC_HAL_CONTINUOUS_READ_MODE:
  157. return ADC_LL_CTRL_DIG;
  158. case ADC_HAL_PWDET_MODE:
  159. return ADC_LL_CTRL_PWDET;
  160. default:
  161. abort();
  162. #else
  163. default:
  164. return ADC_LL_CTRL_ARB;
  165. #endif
  166. }
  167. }
  168. }
  169. void adc_hal_set_controller(adc_ll_num_t unit, adc_hal_work_mode_t work_mode)
  170. {
  171. adc_ll_controller_t ctrlr = get_controller(unit, work_mode);
  172. adc_ll_set_controller(unit, ctrlr);
  173. }
  174. /*---------------------------------------------------------------
  175. DMA read
  176. ---------------------------------------------------------------*/
  177. static adc_ll_digi_convert_mode_t get_convert_mode(adc_digi_convert_mode_t convert_mode)
  178. {
  179. #if CONFIG_IDF_TARGET_ESP32
  180. return ADC_LL_DIGI_CONV_ONLY_ADC1;
  181. #endif
  182. #if (SOC_ADC_DIGI_CONTROLLER_NUM == 1)
  183. return ADC_LL_DIGI_CONV_ALTER_UNIT;
  184. #elif (SOC_ADC_DIGI_CONTROLLER_NUM >= 2)
  185. switch (convert_mode) {
  186. case ADC_CONV_SINGLE_UNIT_1:
  187. return ADC_LL_DIGI_CONV_ONLY_ADC1;
  188. case ADC_CONV_SINGLE_UNIT_2:
  189. return ADC_LL_DIGI_CONV_ONLY_ADC2;
  190. case ADC_CONV_BOTH_UNIT:
  191. return ADC_LL_DIGI_CONV_BOTH_UNIT;
  192. case ADC_CONV_ALTER_UNIT:
  193. return ADC_LL_DIGI_CONV_ALTER_UNIT;
  194. default:
  195. abort();
  196. }
  197. #endif
  198. }
  199. /**
  200. * For esp32s2 and later chips
  201. * - Set ADC digital controller clock division factor. The clock is divided from `APLL` or `APB` clock.
  202. * Expression: controller_clk = APLL/APB * (div_num + div_a / div_b + 1).
  203. * - Enable clock and select clock source for ADC digital controller.
  204. * For esp32, use I2S clock
  205. */
  206. static void adc_hal_digi_sample_freq_config(adc_hal_context_t *hal, uint32_t freq)
  207. {
  208. #if !CONFIG_IDF_TARGET_ESP32
  209. uint32_t interval = APB_CLK_FREQ / (ADC_LL_CLKM_DIV_NUM_DEFAULT + ADC_LL_CLKM_DIV_A_DEFAULT / ADC_LL_CLKM_DIV_B_DEFAULT + 1) / 2 / freq;
  210. //set sample interval
  211. adc_ll_digi_set_trigger_interval(interval);
  212. //Here we set the clock divider factor to make the digital clock to 5M Hz
  213. adc_ll_digi_controller_clk_div(ADC_LL_CLKM_DIV_NUM_DEFAULT, ADC_LL_CLKM_DIV_B_DEFAULT, ADC_LL_CLKM_DIV_A_DEFAULT);
  214. adc_ll_digi_clk_sel(0); //use APB
  215. #else
  216. i2s_ll_rx_clk_set_src(hal->dev, I2S_CLK_D2CLK); /*!< Clock from PLL_D2_CLK(160M)*/
  217. uint32_t bck = I2S_BASE_CLK / (ADC_LL_CLKM_DIV_NUM_DEFAULT + ADC_LL_CLKM_DIV_B_DEFAULT / ADC_LL_CLKM_DIV_A_DEFAULT) / 2 / freq;
  218. i2s_ll_mclk_div_t clk = {
  219. .mclk_div = ADC_LL_CLKM_DIV_NUM_DEFAULT,
  220. .a = ADC_LL_CLKM_DIV_A_DEFAULT,
  221. .b = ADC_LL_CLKM_DIV_B_DEFAULT,
  222. };
  223. i2s_ll_rx_set_clk(hal->dev, &clk);
  224. i2s_ll_rx_set_bck_div_num(hal->dev, bck);
  225. #endif
  226. }
  227. void adc_hal_digi_controller_config(adc_hal_context_t *hal, const adc_hal_digi_ctrlr_cfg_t *cfg)
  228. {
  229. #if (SOC_ADC_DIGI_CONTROLLER_NUM == 1)
  230. //Only one pattern table, this variable is for readability
  231. const int pattern_both = 0;
  232. adc_ll_digi_clear_pattern_table(pattern_both);
  233. adc_ll_digi_set_pattern_table_len(pattern_both, cfg->adc_pattern_len);
  234. for (int i = 0; i < cfg->adc_pattern_len; i++) {
  235. adc_ll_digi_set_pattern_table(pattern_both, i, cfg->adc_pattern[i]);
  236. }
  237. #elif (SOC_ADC_DIGI_CONTROLLER_NUM >= 2)
  238. uint32_t adc1_pattern_idx = 0;
  239. uint32_t adc2_pattern_idx = 0;
  240. adc_ll_digi_clear_pattern_table(ADC_NUM_1);
  241. adc_ll_digi_clear_pattern_table(ADC_NUM_2);
  242. for (int i = 0; i < cfg->adc_pattern_len; i++) {
  243. if (cfg->adc_pattern[i].unit == ADC_NUM_1) {
  244. adc_ll_digi_set_pattern_table(ADC_NUM_1, adc1_pattern_idx, cfg->adc_pattern[i]);
  245. adc1_pattern_idx++;
  246. } else if (cfg->adc_pattern[i].unit == ADC_NUM_2) {
  247. adc_ll_digi_set_pattern_table(ADC_NUM_2, adc2_pattern_idx, cfg->adc_pattern[i]);
  248. adc2_pattern_idx++;
  249. } else {
  250. abort();
  251. }
  252. }
  253. adc_ll_digi_set_pattern_table_len(ADC_NUM_1, adc1_pattern_idx);
  254. adc_ll_digi_set_pattern_table_len(ADC_NUM_2, adc2_pattern_idx);
  255. #endif
  256. if (cfg->conv_limit_en) {
  257. adc_ll_digi_set_convert_limit_num(cfg->conv_limit_num);
  258. adc_ll_digi_convert_limit_enable();
  259. } else {
  260. adc_ll_digi_convert_limit_disable();
  261. }
  262. adc_ll_digi_set_convert_mode(get_convert_mode(cfg->conv_mode));
  263. //clock and sample frequency
  264. adc_hal_digi_sample_freq_config(hal, cfg->sample_freq_hz);
  265. }
  266. void adc_hal_context_config(adc_hal_context_t *hal, const adc_hal_config_t *config)
  267. {
  268. hal->desc_dummy_head.next = hal->rx_desc;
  269. hal->dev = config->dev;
  270. hal->desc_max_num = config->desc_max_num;
  271. hal->dma_chan = config->dma_chan;
  272. hal->eof_num = config->eof_num;
  273. }
  274. void adc_hal_digi_init(adc_hal_context_t *hal)
  275. {
  276. adc_dma_ll_rx_clear_intr(hal->dev, hal->dma_chan, ADC_HAL_DMA_INTR_MASK);
  277. adc_dma_ll_rx_enable_intr(hal->dev, hal->dma_chan, ADC_HAL_DMA_INTR_MASK);
  278. adc_ll_digi_dma_set_eof_num(hal->dev, hal->eof_num);
  279. #if CONFIG_IDF_TARGET_ESP32
  280. i2s_ll_rx_set_sample_bit(hal->dev, SAMPLE_BITS, SAMPLE_BITS);
  281. i2s_ll_rx_enable_mono_mode(hal->dev, 1);
  282. i2s_ll_rx_force_enable_fifo_mod(hal->dev, 1);
  283. i2s_ll_enable_builtin_adc(hal->dev, 1);
  284. #endif
  285. #if CONFIG_IDF_TARGET_ESP32C3
  286. adc_ll_onetime_sample_enable(ADC_NUM_1, false);
  287. adc_ll_onetime_sample_enable(ADC_NUM_2, false);
  288. #endif
  289. }
  290. static void adc_hal_digi_dma_link_descriptors(dma_descriptor_t *desc, uint8_t *data_buf, uint32_t size, uint32_t num)
  291. {
  292. HAL_ASSERT(((uint32_t)data_buf % 4) == 0);
  293. HAL_ASSERT((size % 4) == 0);
  294. uint32_t n = 0;
  295. while (num--) {
  296. desc[n] = (dma_descriptor_t) {
  297. .dw0.size = size,
  298. .dw0.length = 0,
  299. .dw0.suc_eof = 0,
  300. .dw0.owner = 1,
  301. .buffer = data_buf,
  302. .next = &desc[n+1]
  303. };
  304. data_buf += size;
  305. n++;
  306. }
  307. desc[n-1].next = NULL;
  308. }
  309. void adc_hal_digi_start(adc_hal_context_t *hal, uint8_t *data_buf)
  310. {
  311. //stop peripheral and DMA
  312. adc_hal_digi_stop(hal);
  313. //reset DMA
  314. adc_dma_ll_rx_reset_channel(hal->dev, hal->dma_chan);
  315. //reset peripheral
  316. adc_ll_digi_reset(hal->dev);
  317. //reset the current descriptor address
  318. hal->cur_desc_ptr = &hal->desc_dummy_head;
  319. adc_hal_digi_dma_link_descriptors(hal->rx_desc, data_buf, hal->eof_num * ADC_HAL_DATA_LEN_PER_CONV, hal->desc_max_num);
  320. //start DMA
  321. adc_dma_ll_rx_start(hal->dev, hal->dma_chan, (lldesc_t *)hal->rx_desc);
  322. //connect DMA and peripheral
  323. adc_ll_digi_dma_enable();
  324. //start ADC
  325. adc_ll_digi_trigger_enable(hal->dev);
  326. }
  327. #if !SOC_GDMA_SUPPORTED
  328. intptr_t adc_hal_get_desc_addr(adc_hal_context_t *hal)
  329. {
  330. return adc_dma_ll_get_in_suc_eof_desc_addr(hal->dev, hal->dma_chan);
  331. }
  332. bool adc_hal_check_event(adc_hal_context_t *hal, uint32_t mask)
  333. {
  334. return adc_dma_ll_rx_get_intr(hal->dev, mask);
  335. }
  336. #endif //#if !SOC_GDMA_SUPPORTED
  337. adc_hal_dma_desc_status_t adc_hal_get_reading_result(adc_hal_context_t *hal, const intptr_t eof_desc_addr, dma_descriptor_t **cur_desc)
  338. {
  339. HAL_ASSERT(hal->cur_desc_ptr);
  340. if (!hal->cur_desc_ptr->next) {
  341. return ADC_HAL_DMA_DESC_NULL;
  342. }
  343. if ((intptr_t)hal->cur_desc_ptr == eof_desc_addr) {
  344. return ADC_HAL_DMA_DESC_WAITING;
  345. }
  346. hal->cur_desc_ptr = hal->cur_desc_ptr->next;
  347. *cur_desc = hal->cur_desc_ptr;
  348. return ADC_HAL_DMA_DESC_VALID;
  349. }
  350. void adc_hal_digi_clr_intr(adc_hal_context_t *hal, uint32_t mask)
  351. {
  352. adc_dma_ll_rx_clear_intr(hal->dev, hal->dma_chan, mask);
  353. }
  354. void adc_hal_digi_dis_intr(adc_hal_context_t *hal, uint32_t mask)
  355. {
  356. adc_dma_ll_rx_disable_intr(hal->dev, hal->dma_chan, mask);
  357. }
  358. void adc_hal_digi_stop(adc_hal_context_t *hal)
  359. {
  360. //stop ADC
  361. adc_ll_digi_trigger_disable(hal->dev);
  362. //stop DMA
  363. adc_dma_ll_rx_stop(hal->dev, hal->dma_chan);
  364. //disconnect DMA and peripheral
  365. adc_ll_digi_dma_disable();
  366. }
  367. #if SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED
  368. /*---------------------------------------------------------------
  369. Single Read
  370. ---------------------------------------------------------------*/
  371. /**
  372. * For chips without RTC controller, Digital controller is used to trigger an ADC single read.
  373. */
  374. //--------------------INTR-------------------------------//
  375. static adc_ll_intr_t get_event_intr(adc_hal_event_t event)
  376. {
  377. adc_ll_intr_t intr_mask = 0;
  378. if (event & ADC_EVENT_ADC1_DONE) {
  379. intr_mask |= ADC_LL_INTR_ADC1_DONE;
  380. }
  381. if (event & ADC_EVENT_ADC2_DONE) {
  382. intr_mask |= ADC_LL_INTR_ADC2_DONE;
  383. }
  384. return intr_mask;
  385. }
  386. static void adc_hal_intr_clear(adc_hal_event_t event)
  387. {
  388. adc_ll_intr_clear(get_event_intr(event));
  389. }
  390. static bool adc_hal_intr_get_raw(adc_hal_event_t event)
  391. {
  392. return adc_ll_intr_get_raw(get_event_intr(event));
  393. }
  394. //--------------------Single Read-------------------------------//
  395. static void adc_hal_onetime_start(void)
  396. {
  397. /**
  398. * There is a hardware limitation. If the APB clock frequency is high, the step of this reg signal: ``onetime_start`` may not be captured by the
  399. * ADC digital controller (when its clock frequency is too slow). A rough estimate for this step should be at least 3 ADC digital controller
  400. * clock cycle.
  401. *
  402. * This limitation will be removed in hardware future versions.
  403. *
  404. */
  405. uint32_t digi_clk = APB_CLK_FREQ / (ADC_LL_CLKM_DIV_NUM_DEFAULT + ADC_LL_CLKM_DIV_A_DEFAULT / ADC_LL_CLKM_DIV_B_DEFAULT + 1);
  406. //Convert frequency to time (us). Since decimals are removed by this division operation. Add 1 here in case of the fact that delay is not enough.
  407. uint32_t delay = (1000 * 1000) / digi_clk + 1;
  408. //3 ADC digital controller clock cycle
  409. delay = delay * 3;
  410. //This coefficient (8) is got from test. When digi_clk is not smaller than ``APB_CLK_FREQ/8``, no delay is needed.
  411. if (digi_clk >= APB_CLK_FREQ/8) {
  412. delay = 0;
  413. }
  414. adc_ll_onetime_start(false);
  415. esp_rom_delay_us(delay);
  416. adc_ll_onetime_start(true);
  417. //No need to delay here. Becuase if the start signal is not seen, there won't be a done intr.
  418. }
  419. static esp_err_t adc_hal_single_read(adc_ll_num_t adc_n, int *out_raw)
  420. {
  421. if (adc_n == ADC_NUM_1) {
  422. *out_raw = adc_ll_adc1_read();
  423. } else if (adc_n == ADC_NUM_2) {
  424. *out_raw = adc_ll_adc2_read();
  425. if (adc_ll_analysis_raw_data(adc_n, *out_raw)) {
  426. return ESP_ERR_INVALID_STATE;
  427. }
  428. }
  429. return ESP_OK;
  430. }
  431. esp_err_t adc_hal_convert(adc_ll_num_t adc_n, int channel, int *out_raw)
  432. {
  433. esp_err_t ret;
  434. adc_hal_event_t event;
  435. if (adc_n == ADC_NUM_1) {
  436. event = ADC_EVENT_ADC1_DONE;
  437. } else {
  438. event = ADC_EVENT_ADC2_DONE;
  439. }
  440. adc_hal_intr_clear(event);
  441. adc_ll_onetime_sample_enable(ADC_NUM_1, false);
  442. adc_ll_onetime_sample_enable(ADC_NUM_2, false);
  443. adc_ll_onetime_sample_enable(adc_n, true);
  444. adc_ll_onetime_set_channel(adc_n, channel);
  445. //Trigger single read.
  446. adc_hal_onetime_start();
  447. while (!adc_hal_intr_get_raw(event));
  448. ret = adc_hal_single_read(adc_n, out_raw);
  449. //HW workaround: when enabling periph clock, this should be false
  450. adc_ll_onetime_sample_enable(adc_n, false);
  451. return ret;
  452. }
  453. #else // #if SOC_ADC_RTC_CTRL_SUPPORTED
  454. esp_err_t adc_hal_convert(adc_ll_num_t adc_n, int channel, int *out_raw)
  455. {
  456. adc_ll_rtc_enable_channel(adc_n, channel);
  457. adc_ll_rtc_start_convert(adc_n, channel);
  458. while (adc_ll_rtc_convert_is_done(adc_n) != true);
  459. *out_raw = adc_ll_rtc_get_convert_value(adc_n);
  460. if ((int)adc_ll_rtc_analysis_raw_data(adc_n, (uint16_t)(*out_raw))) {
  461. return ESP_ERR_INVALID_STATE;
  462. }
  463. return ESP_OK;
  464. }
  465. #endif //#if SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED
  466. /*---------------------------------------------------------------
  467. ADC calibration setting
  468. ---------------------------------------------------------------*/
  469. #if SOC_ADC_CALIBRATION_V1_SUPPORTED
  470. void adc_hal_calibration_init(adc_ll_num_t adc_n)
  471. {
  472. adc_ll_calibration_init(adc_n);
  473. }
  474. static uint32_t s_previous_init_code[SOC_ADC_PERIPH_NUM] = {-1, -1};
  475. void adc_hal_set_calibration_param(adc_ll_num_t adc_n, uint32_t param)
  476. {
  477. if (param != s_previous_init_code[adc_n]) {
  478. adc_ll_set_calibration_param(adc_n, param);
  479. s_previous_init_code[adc_n] = param;
  480. }
  481. }
  482. #if SOC_ADC_RTC_CTRL_SUPPORTED
  483. static void cal_setup(adc_ll_num_t adc_n, adc_channel_t channel, adc_atten_t atten, bool internal_gnd)
  484. {
  485. adc_hal_set_controller(adc_n, ADC_HAL_SINGLE_READ_MODE); //Set controller
  486. /* Enable/disable internal connect GND (for calibration). */
  487. if (internal_gnd) {
  488. adc_ll_rtc_disable_channel(adc_n);
  489. adc_ll_set_atten(adc_n, 0, atten); // Note: when disable all channel, HW auto select channel0 atten param.
  490. } else {
  491. adc_ll_rtc_enable_channel(adc_n, channel);
  492. adc_ll_set_atten(adc_n, channel, atten);
  493. }
  494. }
  495. static uint32_t read_cal_channel(adc_ll_num_t adc_n, int channel)
  496. {
  497. adc_ll_rtc_start_convert(adc_n, channel);
  498. while (adc_ll_rtc_convert_is_done(adc_n) != true);
  499. return (uint32_t)adc_ll_rtc_get_convert_value(adc_n);
  500. }
  501. #elif SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED
  502. //For those RTC controller not supported chips, they use digital controller to do the single read. e.g.: esp32c3
  503. static void cal_setup(adc_ll_num_t adc_n, adc_channel_t channel, adc_atten_t atten, bool internal_gnd)
  504. {
  505. adc_ll_onetime_sample_enable(ADC_NUM_1, false);
  506. adc_ll_onetime_sample_enable(ADC_NUM_2, false);
  507. /* Enable/disable internal connect GND (for calibration). */
  508. if (internal_gnd) {
  509. const int esp32c3_invalid_chan = (adc_n == ADC_NUM_1)? 0xF: 0x1;
  510. adc_ll_onetime_set_channel(adc_n, esp32c3_invalid_chan);
  511. } else {
  512. adc_ll_onetime_set_channel(adc_n, channel);
  513. }
  514. adc_ll_onetime_set_atten(atten);
  515. adc_ll_onetime_sample_enable(adc_n, true);
  516. }
  517. static uint32_t read_cal_channel(adc_ll_num_t adc_n, int channel)
  518. {
  519. adc_ll_intr_clear(ADC_LL_INTR_ADC1_DONE | ADC_LL_INTR_ADC2_DONE);
  520. adc_ll_onetime_start(false);
  521. esp_rom_delay_us(5);
  522. adc_ll_onetime_start(true);
  523. while(!adc_ll_intr_get_raw(ADC_LL_INTR_ADC1_DONE | ADC_LL_INTR_ADC2_DONE));
  524. uint32_t read_val = -1;
  525. if (adc_n == ADC_NUM_1) {
  526. read_val = adc_ll_adc1_read();
  527. } else if (adc_n == ADC_NUM_2) {
  528. read_val = adc_ll_adc2_read();
  529. if (adc_ll_analysis_raw_data(adc_n, read_val)) {
  530. return -1;
  531. }
  532. }
  533. return read_val;
  534. }
  535. #endif //Do single read via DIGI controller or RTC controller
  536. #define ADC_HAL_CAL_TIMES (10)
  537. #define ADC_HAL_CAL_OFFSET_RANGE (4096)
  538. uint32_t adc_hal_self_calibration(adc_ll_num_t adc_n, adc_channel_t channel, adc_atten_t atten, bool internal_gnd)
  539. {
  540. if (adc_n == ADC_NUM_2) {
  541. adc_arbiter_t config = ADC_ARBITER_CONFIG_DEFAULT();
  542. adc_hal_arbiter_config(&config);
  543. }
  544. cal_setup(adc_n, channel, atten, internal_gnd);
  545. adc_ll_calibration_prepare(adc_n, channel, internal_gnd);
  546. uint32_t code_list[ADC_HAL_CAL_TIMES] = {0};
  547. uint32_t code_sum = 0;
  548. uint32_t code_h = 0;
  549. uint32_t code_l = 0;
  550. uint32_t chk_code = 0;
  551. for (uint8_t rpt = 0 ; rpt < ADC_HAL_CAL_TIMES ; rpt ++) {
  552. code_h = ADC_HAL_CAL_OFFSET_RANGE;
  553. code_l = 0;
  554. chk_code = (code_h + code_l) / 2;
  555. adc_ll_set_calibration_param(adc_n, chk_code);
  556. uint32_t self_cal = read_cal_channel(adc_n, channel);
  557. while (code_h - code_l > 1) {
  558. if (self_cal == 0) {
  559. code_h = chk_code;
  560. } else {
  561. code_l = chk_code;
  562. }
  563. chk_code = (code_h + code_l) / 2;
  564. adc_ll_set_calibration_param(adc_n, chk_code);
  565. self_cal = read_cal_channel(adc_n, channel);
  566. if ((code_h - code_l == 1)) {
  567. chk_code += 1;
  568. adc_ll_set_calibration_param(adc_n, chk_code);
  569. self_cal = read_cal_channel(adc_n, channel);
  570. }
  571. }
  572. code_list[rpt] = chk_code;
  573. code_sum += chk_code;
  574. }
  575. code_l = code_list[0];
  576. code_h = code_list[0];
  577. for (uint8_t i = 0 ; i < ADC_HAL_CAL_TIMES ; i++) {
  578. code_l = MIN(code_l, code_list[i]);
  579. code_h = MAX(code_h, code_list[i]);
  580. }
  581. chk_code = code_h + code_l;
  582. uint32_t ret = ((code_sum - chk_code) % (ADC_HAL_CAL_TIMES - 2) < 4)
  583. ? (code_sum - chk_code) / (ADC_HAL_CAL_TIMES - 2)
  584. : (code_sum - chk_code) / (ADC_HAL_CAL_TIMES - 2) + 1;
  585. adc_ll_calibration_finish(adc_n);
  586. return ret;
  587. }
  588. #endif //SOC_ADC_CALIBRATION_V1_SUPPORTED