2121#include "esp_adc/adc_continuous.h"
2222#include "esp_adc/adc_cali_scheme.h"
2323
24+ #if CONFIG_IDF_TARGET_ESP32P4 && CONFIG_ESP32P4_REV_MIN_FULL >= 300
25+ // NOTE: These weak definitions allow successful linkage if the real efuse calibration functions are missing.
26+ // This is a workaround for the ESP32P4 rev 3.0+, which is missing efuse calibration functions in the IDF.
27+ __attribute__((weak )) uint32_t esp_efuse_rtc_calib_get_ver (void ) {
28+ return 0 ;
29+ }
30+
31+ __attribute__((weak )) uint32_t esp_efuse_rtc_calib_get_init_code (uint32_t atten , uint32_t * code ) {
32+ if (code ) {
33+ * code = 0 ;
34+ }
35+ return 0 ; // 0 means success in ESP-IDF conventions
36+ }
37+
38+ __attribute__((weak )) uint32_t esp_efuse_rtc_calib_get_chan_compens (uint32_t atten , uint32_t * comp ) {
39+ if (comp ) {
40+ * comp = 0 ;
41+ }
42+ return 0 ;
43+ }
44+
45+ __attribute__((weak )) uint32_t esp_efuse_rtc_calib_get_cal_voltage (uint32_t atten , uint32_t * voltage ) {
46+ if (voltage ) {
47+ * voltage = 0 ;
48+ }
49+ return 0 ;
50+ }
51+ #endif
52+
2453// ESP32-C2 does not define those two for some reason
2554#ifndef SOC_ADC_DIGI_RESULT_BYTES
2655#define SOC_ADC_DIGI_RESULT_BYTES (4)
@@ -75,11 +104,14 @@ static bool adcDetachBus(void *pin) {
75104 if (err != ESP_OK ) {
76105 return false;
77106 }
78- #elif (!defined( CONFIG_IDF_TARGET_ESP32H2 ) && !defined( CONFIG_IDF_TARGET_ESP32P4 ))
107+ #elif ADC_CALI_SCHEME_LINE_FITTING_SUPPORTED
79108 err = adc_cali_delete_scheme_line_fitting (adc_handle [adc_unit ].adc_cali_handle );
80109 if (err != ESP_OK ) {
81110 return false;
82111 }
112+ #else
113+ log_e ("ADC Calibration scheme is not supported!" );
114+ return false;
83115#endif
84116 }
85117 adc_handle [adc_unit ].adc_cali_handle = NULL ;
@@ -127,7 +159,7 @@ esp_err_t __analogChannelConfig(adc_bitwidth_t width, adc_attenuation_t atten, i
127159 log_e ("adc_cali_create_scheme_curve_fitting failed with error: %d" , err );
128160 return err ;
129161 }
130- #elif (!defined( CONFIG_IDF_TARGET_ESP32H2 ) && !defined( CONFIG_IDF_TARGET_ESP32P4 )) // ADC_CALI_SCHEME_LINE_FITTING_SUPPORTED
162+ #elif ADC_CALI_SCHEME_LINE_FITTING_SUPPORTED
131163 log_d ("Deleting ADC_UNIT_%d line cali handle" , adc_unit );
132164 err = adc_cali_delete_scheme_line_fitting (adc_handle [adc_unit ].adc_cali_handle );
133165 if (err != ESP_OK ) {
@@ -145,6 +177,9 @@ esp_err_t __analogChannelConfig(adc_bitwidth_t width, adc_attenuation_t atten, i
145177 log_e ("adc_cali_create_scheme_line_fitting failed with error: %d" , err );
146178 return err ;
147179 }
180+ #else
181+ log_e ("ADC Calibration scheme is not supported!" );
182+ return ESP_ERR_NOT_SUPPORTED ;
148183#endif
149184 }
150185 }
@@ -310,13 +345,16 @@ uint32_t __analogReadMilliVolts(uint8_t pin) {
310345 .bitwidth = __analogWidth ,
311346 };
312347 err = adc_cali_create_scheme_curve_fitting (& cali_config , & adc_handle [adc_unit ].adc_cali_handle );
313- #elif (!defined( CONFIG_IDF_TARGET_ESP32H2 ) && !defined( CONFIG_IDF_TARGET_ESP32P4 )) // ADC_CALI_SCHEME_LINE_FITTING_SUPPORTED
348+ #elif ADC_CALI_SCHEME_LINE_FITTING_SUPPORTED
314349 adc_cali_line_fitting_config_t cali_config = {
315350 .unit_id = adc_unit ,
316351 .bitwidth = __analogWidth ,
317352 .atten = __analogAttenuation ,
318353 };
319354 err = adc_cali_create_scheme_line_fitting (& cali_config , & adc_handle [adc_unit ].adc_cali_handle );
355+ #else
356+ log_e ("ADC Calibration scheme is not supported!" );
357+ return value ;
320358#endif
321359 if (err != ESP_OK ) {
322360 log_e ("adc_cali_create_scheme_x failed!" );
@@ -360,7 +398,7 @@ static uint8_t __adcContinuousAtten = ADC_11db;
360398static uint8_t __adcContinuousWidth = SOC_ADC_DIGI_MAX_BITWIDTH ;
361399
362400static uint8_t used_adc_channels = 0 ;
363- adc_continuous_data_t * adc_result = NULL ;
401+ adc_continuous_result_t * adc_result = NULL ;
364402
365403static bool adcContinuousDetachBus (void * adc_unit_number ) {
366404 adc_unit_t adc_unit = (adc_unit_t )adc_unit_number - 1 ;
@@ -379,11 +417,14 @@ static bool adcContinuousDetachBus(void *adc_unit_number) {
379417 if (err != ESP_OK ) {
380418 return false;
381419 }
382- #elif (!defined( CONFIG_IDF_TARGET_ESP32H2 ) && !defined( CONFIG_IDF_TARGET_ESP32P4 ))
420+ #elif ADC_CALI_SCHEME_LINE_FITTING_SUPPORTED
383421 err = adc_cali_delete_scheme_line_fitting (adc_handle [adc_unit ].adc_cali_handle );
384422 if (err != ESP_OK ) {
385423 return false;
386424 }
425+ #else
426+ log_e ("ADC Calibration scheme is not supported!" );
427+ return false;
387428#endif
388429 }
389430 adc_handle [adc_unit ].adc_cali_handle = NULL ;
@@ -536,7 +577,7 @@ bool analogContinuous(const uint8_t pins[], size_t pins_count, uint32_t conversi
536577 }
537578
538579 //Allocate and prepare result structure for adc readings
539- adc_result = malloc (pins_count * sizeof (adc_continuous_data_t ));
580+ adc_result = malloc (pins_count * sizeof (adc_continuous_result_t ));
540581 for (int k = 0 ; k < pins_count ; k ++ ) {
541582 adc_result [k ].pin = pins [k ];
542583 adc_result [k ].channel = channel [k ];
@@ -552,13 +593,16 @@ bool analogContinuous(const uint8_t pins[], size_t pins_count, uint32_t conversi
552593 .bitwidth = __adcContinuousWidth ,
553594 };
554595 err = adc_cali_create_scheme_curve_fitting (& cali_config , & adc_handle [adc_unit ].adc_cali_handle );
555- #elif (!defined( CONFIG_IDF_TARGET_ESP32H2 ) && !defined( CONFIG_IDF_TARGET_ESP32P4 )) // ADC_CALI_SCHEME_LINE_FITTING_SUPPORTED
596+ #elif ADC_CALI_SCHEME_LINE_FITTING_SUPPORTED
556597 adc_cali_line_fitting_config_t cali_config = {
557598 .unit_id = adc_unit ,
558599 .bitwidth = __adcContinuousWidth ,
559600 .atten = __adcContinuousAtten ,
560601 };
561602 err = adc_cali_create_scheme_line_fitting (& cali_config , & adc_handle [adc_unit ].adc_cali_handle );
603+ #else
604+ log_e ("ADC Calibration scheme is not supported!" );
605+ return false;
562606#endif
563607 if (err != ESP_OK ) {
564608 log_e ("adc_cali_create_scheme_x failed!" );
@@ -577,7 +621,7 @@ bool analogContinuous(const uint8_t pins[], size_t pins_count, uint32_t conversi
577621 return true;
578622}
579623
580- bool analogContinuousRead (adc_continuous_data_t * * buffer , uint32_t timeout_ms ) {
624+ bool analogContinuousRead (adc_continuous_result_t * * buffer , uint32_t timeout_ms ) {
581625 if (adc_handle [ADC_UNIT_1 ].adc_continuous_handle != NULL ) {
582626 uint32_t bytes_read = 0 ;
583627 uint32_t read_raw [used_adc_channels ];
0 commit comments