|
|
@@ -19,7 +19,6 @@
|
|
|
#include "hal/adc_types.h"
|
|
|
#include "hal/adc_hal_conf.h"
|
|
|
#include "esp_log.h"
|
|
|
-#include "esp32s2/esp_efuse_rtc_table.h"
|
|
|
|
|
|
/*---------------------------------------------------------------
|
|
|
Digital controller setting
|
|
|
@@ -44,12 +43,6 @@ void adc_hal_digi_deinit(void)
|
|
|
adc_hal_deinit();
|
|
|
}
|
|
|
|
|
|
-static inline void adc_set_init_code(adc_ll_num_t adc_n, adc_channel_t channel, adc_atten_t atten)
|
|
|
-{
|
|
|
- uint32_t cal_val = adc_hal_calibration(adc_n, channel, atten, true, false);
|
|
|
- adc_hal_set_calibration_param(adc_n, cal_val);
|
|
|
-}
|
|
|
-
|
|
|
void adc_hal_digi_controller_config(const adc_digi_config_t *cfg)
|
|
|
{
|
|
|
/* If enable digtal controller, adc xpd should always on. */
|
|
|
@@ -62,7 +55,6 @@ void adc_hal_digi_controller_config(const adc_digi_config_t *cfg)
|
|
|
adc_ll_digi_set_pattern_table_len(ADC_NUM_1, cfg->adc1_pattern_len);
|
|
|
for (int i = 0; i < cfg->adc1_pattern_len; i++) {
|
|
|
adc_ll_digi_set_pattern_table(ADC_NUM_1, i, cfg->adc1_pattern[i]);
|
|
|
- adc_set_init_code(ADC_NUM_1, cfg->adc1_pattern[i].channel, cfg->adc1_pattern[i].atten);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -72,7 +64,6 @@ void adc_hal_digi_controller_config(const adc_digi_config_t *cfg)
|
|
|
adc_ll_digi_set_pattern_table_len(ADC_NUM_2, cfg->adc2_pattern_len);
|
|
|
for (int i = 0; i < cfg->adc2_pattern_len; i++) {
|
|
|
adc_ll_digi_set_pattern_table(ADC_NUM_2, i, cfg->adc2_pattern[i]);
|
|
|
- adc_set_init_code(ADC_NUM_2, cfg->adc2_pattern[i].channel, cfg->adc2_pattern[i].atten);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -166,106 +157,82 @@ void adc_hal_arbiter_config(adc_arbiter_t *config)
|
|
|
/*---------------------------------------------------------------
|
|
|
ADC calibration setting
|
|
|
---------------------------------------------------------------*/
|
|
|
-
|
|
|
-#define ADC_HAL_CAL_OFFSET_RANGE (4096)
|
|
|
#define ADC_HAL_CAL_TIMES (10)
|
|
|
+#define ADC_HAL_CAL_OFFSET_RANGE (4096)
|
|
|
|
|
|
-static uint16_t s_adc_cali_param[ADC_NUM_MAX][ADC_ATTEN_MAX] = { {0}, {0} };
|
|
|
-
|
|
|
-static uint32_t adc_hal_read_self_cal(adc_ll_num_t adc_n, int channel)
|
|
|
+static uint32_t read_cal_channel(adc_ll_num_t adc_n, int channel)
|
|
|
{
|
|
|
adc_ll_rtc_start_convert(adc_n, channel);
|
|
|
while (adc_ll_rtc_convert_is_done(adc_n) != true);
|
|
|
return (uint32_t)adc_ll_rtc_get_convert_value(adc_n);
|
|
|
}
|
|
|
|
|
|
-uint32_t adc_hal_calibration(adc_ll_num_t adc_n, adc_channel_t channel, adc_atten_t atten, bool internal_gnd, bool force_cal)
|
|
|
+uint32_t adc_hal_self_calibration(adc_ll_num_t adc_n, adc_channel_t channel, adc_atten_t atten, bool internal_gnd)
|
|
|
{
|
|
|
-#ifdef CONFIG_IDF_ENV_FPGA
|
|
|
- return 0;
|
|
|
-#endif
|
|
|
-
|
|
|
- if (!force_cal) {
|
|
|
- if (s_adc_cali_param[adc_n][atten]) {
|
|
|
- return (uint32_t)s_adc_cali_param[adc_n][atten];
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
adc_hal_set_power_manage(ADC_POWER_SW_ON);
|
|
|
+
|
|
|
if (adc_n == ADC_NUM_2) {
|
|
|
adc_arbiter_t config = ADC_ARBITER_CONFIG_DEFAULT();
|
|
|
adc_hal_arbiter_config(&config);
|
|
|
}
|
|
|
adc_hal_set_controller(adc_n, ADC_CTRL_RTC); //Set controller
|
|
|
|
|
|
- // adc_hal_arbiter_config(adc_arbiter_t *config)
|
|
|
- adc_ll_calibration_prepare(adc_n, channel, internal_gnd);
|
|
|
|
|
|
- uint32_t dout = 0;
|
|
|
- // check if we can fetch the values from eFuse.
|
|
|
- int version = esp_efuse_rtc_table_read_calib_version();
|
|
|
- if (version == 2) {
|
|
|
- int tag = esp_efuse_rtc_table_get_tag(version, adc_n + 1, atten, RTCCALIB_V2_PARAM_VINIT);
|
|
|
- dout = esp_efuse_rtc_table_get_parsed_efuse_value(tag, false);
|
|
|
+ adc_ll_calibration_prepare(adc_n, channel, internal_gnd);
|
|
|
+ /* Enable/disable internal connect GND (for calibration). */
|
|
|
+ if (internal_gnd) {
|
|
|
+ adc_ll_rtc_disable_channel(adc_n, channel);
|
|
|
+ adc_ll_set_atten(adc_n, 0, atten); // Note: when disable all channel, HW auto select channel0 atten param.
|
|
|
} else {
|
|
|
- uint32_t code_list[ADC_HAL_CAL_TIMES] = {0};
|
|
|
- uint32_t code_sum = 0;
|
|
|
- uint32_t code_h = 0;
|
|
|
- uint32_t code_l = 0;
|
|
|
- uint32_t chk_code = 0;
|
|
|
-
|
|
|
- /* Enable/disable internal connect GND (for calibration). */
|
|
|
- if (internal_gnd) {
|
|
|
- adc_ll_rtc_disable_channel(adc_n, channel);
|
|
|
- adc_ll_set_atten(adc_n, 0, atten); // Note: when disable all channel, HW auto select channel0 atten param.
|
|
|
- } else {
|
|
|
- adc_ll_rtc_enable_channel(adc_n, channel);
|
|
|
- adc_ll_set_atten(adc_n, channel, atten);
|
|
|
- }
|
|
|
+ adc_ll_rtc_enable_channel(adc_n, channel);
|
|
|
+ adc_ll_set_atten(adc_n, channel, atten);
|
|
|
+ }
|
|
|
|
|
|
- for (uint8_t rpt = 0 ; rpt < ADC_HAL_CAL_TIMES ; rpt ++) {
|
|
|
- code_h = ADC_HAL_CAL_OFFSET_RANGE;
|
|
|
- code_l = 0;
|
|
|
+ uint32_t code_list[ADC_HAL_CAL_TIMES] = {0};
|
|
|
+ uint32_t code_sum = 0;
|
|
|
+ uint32_t code_h = 0;
|
|
|
+ uint32_t code_l = 0;
|
|
|
+ uint32_t chk_code = 0;
|
|
|
+
|
|
|
+ for (uint8_t rpt = 0 ; rpt < ADC_HAL_CAL_TIMES ; rpt ++) {
|
|
|
+ code_h = ADC_HAL_CAL_OFFSET_RANGE;
|
|
|
+ code_l = 0;
|
|
|
+ chk_code = (code_h + code_l) / 2;
|
|
|
+ adc_ll_set_calibration_param(adc_n, chk_code);
|
|
|
+ uint32_t self_cal = read_cal_channel(adc_n, channel);
|
|
|
+ while (code_h - code_l > 1) {
|
|
|
+ if (self_cal == 0) {
|
|
|
+ code_h = chk_code;
|
|
|
+ } else {
|
|
|
+ code_l = chk_code;
|
|
|
+ }
|
|
|
chk_code = (code_h + code_l) / 2;
|
|
|
adc_ll_set_calibration_param(adc_n, chk_code);
|
|
|
- dout = adc_hal_read_self_cal(adc_n, channel);
|
|
|
- while (code_h - code_l > 1) {
|
|
|
- if (dout == 0) {
|
|
|
- code_h = chk_code;
|
|
|
- } else {
|
|
|
- code_l = chk_code;
|
|
|
- }
|
|
|
- chk_code = (code_h + code_l) / 2;
|
|
|
+ self_cal = read_cal_channel(adc_n, channel);
|
|
|
+ if ((code_h - code_l == 1)) {
|
|
|
+ chk_code += 1;
|
|
|
adc_ll_set_calibration_param(adc_n, chk_code);
|
|
|
- dout = adc_hal_read_self_cal(adc_n, channel);
|
|
|
- if ((code_h - code_l == 1)) {
|
|
|
- chk_code += 1;
|
|
|
- adc_ll_set_calibration_param(adc_n, chk_code);
|
|
|
- dout = adc_hal_read_self_cal(adc_n, channel);
|
|
|
- }
|
|
|
+ self_cal = read_cal_channel(adc_n, channel);
|
|
|
}
|
|
|
- code_list[rpt] = chk_code;
|
|
|
- code_sum += chk_code;
|
|
|
}
|
|
|
- code_l = code_list[0];
|
|
|
- code_h = code_list[0];
|
|
|
- for (uint8_t i = 0 ; i < ADC_HAL_CAL_TIMES ; i++) {
|
|
|
- if (code_l > code_list[i]) {
|
|
|
- code_l = code_list[i];
|
|
|
- }
|
|
|
- if (code_h < code_list[i]) {
|
|
|
- code_h = code_list[i];
|
|
|
- }
|
|
|
+ code_list[rpt] = chk_code;
|
|
|
+ code_sum += chk_code;
|
|
|
+ }
|
|
|
+ code_l = code_list[0];
|
|
|
+ code_h = code_list[0];
|
|
|
+ for (uint8_t i = 0 ; i < ADC_HAL_CAL_TIMES ; i++) {
|
|
|
+ if (code_l > code_list[i]) {
|
|
|
+ code_l = code_list[i];
|
|
|
+ }
|
|
|
+ if (code_h < code_list[i]) {
|
|
|
+ code_h = code_list[i];
|
|
|
}
|
|
|
- chk_code = code_h + code_l;
|
|
|
- dout = ((code_sum - chk_code) % (ADC_HAL_CAL_TIMES - 2) < 4)
|
|
|
- ? (code_sum - chk_code) / (ADC_HAL_CAL_TIMES - 2)
|
|
|
-
|
|
|
- : (code_sum - chk_code) / (ADC_HAL_CAL_TIMES - 2) + 1;
|
|
|
}
|
|
|
- adc_ll_set_calibration_param(adc_n, dout);
|
|
|
- adc_ll_calibration_finish(adc_n);
|
|
|
- s_adc_cali_param[adc_n][atten] = (uint16_t)dout;
|
|
|
+ chk_code = code_h + code_l;
|
|
|
+ uint32_t ret = ((code_sum - chk_code) % (ADC_HAL_CAL_TIMES - 2) < 4)
|
|
|
+ ? (code_sum - chk_code) / (ADC_HAL_CAL_TIMES - 2)
|
|
|
+ : (code_sum - chk_code) / (ADC_HAL_CAL_TIMES - 2) + 1;
|
|
|
|
|
|
- return dout;
|
|
|
+ adc_ll_calibration_finish(adc_n);
|
|
|
+ return ret;
|
|
|
}
|