1
6
7
15
16
17
18
19
20
21
25
26
27
28
29
31
32
33
34
41
42
47
48
49
50
51
52
53
55
56
57
58
59
60
61
62
65
66
79
80
81
82
83
84
85
86
87
89
90
91
92
93
94
95
96
101
102
103
104
105
106
107
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
142
143
144
145
146
147
148
151
152
153
154
161
162
163
164
165
166
169
170
171
172
176
179
180
181
190
199
200
201
202
/* ... */
#include <sys/param.h>
#include "sdkconfig.h"
#include "soc/soc_caps.h"
#include "hal/adc_oneshot_hal.h"
#include "hal/adc_hal_common.h"
#include "hal/adc_ll.h"
#include "hal/assert.h"
#include "hal/log.h"8 includes
#if SOC_DAC_SUPPORTED
#include "hal/dac_ll.h"
#endif
#if SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED
/* ... */
#include "esp_rom_sys.h"/* ... */
#endif
#if CONFIG_ADC_DISABLE_DAC_OUTPUT
static void s_disable_dac(adc_oneshot_hal_ctx_t *hal, adc_channel_t channel);/* ... */
#endif
void adc_oneshot_hal_init(adc_oneshot_hal_ctx_t *hal, const adc_oneshot_hal_cfg_t *config)
{
hal->unit = config->unit;
hal->work_mode = config->work_mode;
hal->clk_src = config->clk_src;
hal->clk_src_freq_hz = config->clk_src_freq_hz;
}{ ... }
void adc_oneshot_hal_channel_config(adc_oneshot_hal_ctx_t *hal, const adc_oneshot_hal_chan_cfg_t *config, adc_channel_t chan)
{
hal->chan_configs[chan].atten = config->atten;
hal->chan_configs[chan].bitwidth = config->bitwidth;
}{ ... }
void adc_oneshot_hal_setup(adc_oneshot_hal_ctx_t *hal, adc_channel_t chan)
{
adc_unit_t unit = hal->unit;
#ifdef CONFIG_IDF_TARGET_ESP32
adc_ll_hall_disable();
adc_ll_amp_disable(); /* ... */
#endif
#if CONFIG_ADC_DISABLE_DAC_OUTPUT
s_disable_dac(hal, chan);
#endif
#if SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED
adc_ll_digi_clk_sel(hal->clk_src);
adc_ll_digi_controller_clk_div(ADC_LL_CLKM_DIV_NUM_DEFAULT, ADC_LL_CLKM_DIV_A_DEFAULT, ADC_LL_CLKM_DIV_B_DEFAULT);
adc_ll_digi_set_clk_div(ADC_LL_DIGI_SAR_CLK_DIV_DEFAULT);/* ... */
#else
#if SOC_LP_ADC_SUPPORTED
if (hal->work_mode == ADC_HAL_LP_MODE) {
adc_ll_set_sar_clk_div(unit, LP_ADC_LL_SAR_CLK_DIV_DEFAULT(unit));
}{...} else {
adc_ll_set_sar_clk_div(unit, ADC_LL_SAR_CLK_DIV_DEFAULT(unit));
}{...}
#else/* ... */
adc_ll_set_sar_clk_div(unit, ADC_LL_SAR_CLK_DIV_DEFAULT(unit));
#endif
if (unit == ADC_UNIT_2) {
adc_ll_pwdet_set_cct(ADC_LL_PWDET_CCT_DEFAULT);
}{...}
#endif/* ... */
adc_oneshot_ll_output_invert(unit, ADC_LL_DATA_INVERT_DEFAULT(unit));
adc_oneshot_ll_set_atten(unit, chan, hal->chan_configs[chan].atten);
adc_oneshot_ll_set_output_bits(unit, hal->chan_configs[chan].bitwidth);
adc_oneshot_ll_set_channel(unit, chan);
adc_hal_set_controller(unit, hal->work_mode);
#if SOC_ADC_ARBITER_SUPPORTED
adc_arbiter_t config = ADC_ARBITER_CONFIG_DEFAULT();
adc_hal_arbiter_config(&config);/* ... */
#endif
}{ ... }
static void adc_hal_onetime_start(adc_unit_t unit, uint32_t clk_src_freq_hz, uint32_t *read_delay_us)
{
#if SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED
(void)unit;
/* ... */
uint32_t adc_ctrl_clk = clk_src_freq_hz / (ADC_LL_CLKM_DIV_NUM_DEFAULT + ADC_LL_CLKM_DIV_A_DEFAULT / ADC_LL_CLKM_DIV_B_DEFAULT + 1);
uint32_t sample_delay_us = ((1000 * 1000) / adc_ctrl_clk + 1) * 3;
HAL_EARLY_LOGD("adc_hal", "clk_src_freq_hz: %"PRIu32", adc_ctrl_clk: %"PRIu32", sample_delay_us: %"PRIu32"", clk_src_freq_hz, adc_ctrl_clk, sample_delay_us);
if (adc_ctrl_clk >= APB_CLK_FREQ/8) {
sample_delay_us = 0;
}{...}
HAL_EARLY_LOGD("adc_hal", "delay for `onetime_start` signal captured: %"PRIu32"", sample_delay_us);
adc_oneshot_ll_start(false);
esp_rom_delay_us(sample_delay_us);
adc_oneshot_ll_start(true);
#if ADC_LL_DELAY_CYCLE_AFTER_DONE_SIGNAL
/* ... */
uint32_t sar_clk = adc_ctrl_clk / ADC_LL_DIGI_SAR_CLK_DIV_DEFAULT;
*read_delay_us = ((1000 * 1000) / sar_clk + 1) * ADC_LL_DELAY_CYCLE_AFTER_DONE_SIGNAL;
HAL_EARLY_LOGD("adc_hal", "clk_src_freq_hz: %"PRIu32", sar_clk: %"PRIu32", read_delay_us: %"PRIu32"", clk_src_freq_hz, sar_clk, read_delay_us);/* ... */
#endif
/* ... */
#else
adc_oneshot_ll_start(unit);
#endif
}{ ... }
bool adc_oneshot_hal_convert(adc_oneshot_hal_ctx_t *hal, int *out_raw)
{
bool valid = true;
uint32_t event = 0;
uint32_t read_delay_us = 0;
if (hal->unit == ADC_UNIT_1) {
event = ADC_LL_EVENT_ADC1_ONESHOT_DONE;
}{...} else {
event = ADC_LL_EVENT_ADC2_ONESHOT_DONE;
}{...}
adc_oneshot_ll_clear_event(event);
adc_oneshot_ll_disable_all_unit();
adc_oneshot_ll_enable(hal->unit);
adc_hal_onetime_start(hal->unit, hal->clk_src_freq_hz, &read_delay_us);
while (!adc_oneshot_ll_get_event(event)) {
;
}{...}
esp_rom_delay_us(read_delay_us);
*out_raw = adc_oneshot_ll_get_raw_result(hal->unit);
#if SOC_ADC_ARBITER_SUPPORTED
if (hal->unit == ADC_UNIT_2) {
valid = adc_oneshot_ll_raw_check_valid(ADC_UNIT_2, *out_raw);
if (!valid) {
*out_raw = -1;
}{...}
}{...}
#endif/* ... */
adc_oneshot_ll_disable_all_unit();
return valid;
}{ ... }
/* ... */
#if CONFIG_ADC_DISABLE_DAC_OUTPUT
static void s_disable_dac(adc_oneshot_hal_ctx_t *hal, adc_channel_t channel)
{
/* ... */
if (hal->unit == ADC_UNIT_1) {
dac_ll_rtc_sync_by_adc(false);
}{...}
#if CONFIG_IDF_TARGET_ESP32
if (hal->unit == ADC_UNIT_2) {
if (channel == ADC_CHANNEL_8) {
dac_ll_power_down(DAC_CHAN_0);
}{...}
if (channel == ADC_CHANNEL_9) {
dac_ll_power_down(DAC_CHAN_1);
}{...}
}{...}
#elif/* ... */ CONFIG_IDF_TARGET_ESP32S2
if (hal->unit == ADC_UNIT_2) {
if (channel == ADC_CHANNEL_6) {
dac_ll_power_down(DAC_CHAN_0);
}{...}
if (channel == ADC_CHANNEL_7) {
dac_ll_power_down(DAC_CHAN_1);
}{...}
}{...}
#else/* ... */
#endif
}{ ... }
/* ... */#endif