Skip to content

Commit 071e974

Browse files
me-no-devJason2866pre-commit-ci-lite[bot]P-R-O-C-H-Y
authored
feat(core): Add option to support chip variants (#12036)
* feat(core): Add option to support chip variants * add `chip_variant` to pioarduino-build.py * Refactor build_mcu and chip_variant assignment logic * fix(adc): Rename data struct as its used in idf * IDF release/v5.5 8d036f2e * fix(adc): Add weak definitions for p4 rev 3 * fix(adc): Calibration fix for unsupported socs --------- Co-authored-by: Jason2866 <24528715+Jason2866@users.noreply.github.com> Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Co-authored-by: Jan Procházka <90197375+P-R-O-C-H-Y@users.noreply.github.com>
1 parent d39181b commit 071e974

File tree

9 files changed

+179
-129
lines changed

9 files changed

+179
-129
lines changed

boards.txt

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ menu.EraseFlash=Erase All Flash Before Sketch Upload
1919
menu.JTAGAdapter=JTAG Adapter
2020
menu.ZigbeeMode=Zigbee Mode
2121
menu.PinNumbers=Pin Numbering
22+
menu.ChipVariant=Chip Variant
2223

2324
# Custom options
2425
menu.Revision=Board Revision
@@ -398,6 +399,7 @@ esp32p4.build.target=esp
398399
esp32p4.build.mcu=esp32p4
399400
esp32p4.build.core=esp32
400401
esp32p4.build.variant=esp32p4
402+
esp32p4.build.chip_variant=esp32p4_es
401403
esp32p4.build.board=ESP32P4_DEV
402404
esp32p4.build.bootloader_addr=0x2000
403405

@@ -414,6 +416,13 @@ esp32p4.build.boot=qio
414416
esp32p4.build.partitions=default
415417
esp32p4.build.defines=
416418

419+
esp32p4.menu.ChipVariant.prev3=Before v3.00
420+
esp32p4.menu.ChipVariant.prev3.build.chip_variant=esp32p4_es
421+
esp32p4.menu.ChipVariant.prev3.build.f_cpu=360000000L
422+
esp32p4.menu.ChipVariant.postv3=v3.00 or newer
423+
esp32p4.menu.ChipVariant.postv3.build.chip_variant=esp32p4
424+
esp32p4.menu.ChipVariant.postv3.build.f_cpu=400000000L
425+
417426
## IDE 2.0 Seems to not update the value
418427
esp32p4.menu.JTAGAdapter.default=Disabled
419428
esp32p4.menu.JTAGAdapter.default.build.copy_jtag_files=0
@@ -512,12 +521,6 @@ esp32p4.menu.PartitionScheme.custom=Custom
512521
esp32p4.menu.PartitionScheme.custom.build.partitions=
513522
esp32p4.menu.PartitionScheme.custom.upload.maximum_size=16777216
514523

515-
## From https://docs.espressif.com/projects/esp-idf/en/latest/esp32p4/api-reference/kconfig.html#config-esp-default-cpu-freq-mhz
516-
esp32p4.menu.CPUFreq.360=360MHz
517-
esp32p4.menu.CPUFreq.360.build.f_cpu=360000000L
518-
esp32p4.menu.CPUFreq.40=40MHz
519-
esp32p4.menu.CPUFreq.40.build.f_cpu=40000000L
520-
521524
esp32p4.menu.FlashMode.qio=QIO
522525
esp32p4.menu.FlashMode.qio.build.flash_mode=dio
523526
esp32p4.menu.FlashMode.qio.build.boot=qio

cores/esp32/esp32-hal-adc.c

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,35 @@
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;
360398
static uint8_t __adcContinuousWidth = SOC_ADC_DIGI_MAX_BITWIDTH;
361399

362400
static uint8_t used_adc_channels = 0;
363-
adc_continuous_data_t *adc_result = NULL;
401+
adc_continuous_result_t *adc_result = NULL;
364402

365403
static 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];

cores/esp32/esp32-hal-adc.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ typedef struct {
8686
uint8_t channel; /*!<ADC channel */
8787
int avg_read_raw; /*!<ADC average raw data */
8888
int avg_read_mvolts; /*!<ADC average voltage in mV */
89-
} adc_continuous_data_t;
89+
} adc_continuous_result_t;
9090

9191
/*
9292
* Setup ADC continuous peripheral
@@ -96,7 +96,7 @@ bool analogContinuous(const uint8_t pins[], size_t pins_count, uint32_t conversi
9696
/*
9797
* Read ADC continuous conversion data
9898
* */
99-
bool analogContinuousRead(adc_continuous_data_t **buffer, uint32_t timeout_ms);
99+
bool analogContinuousRead(adc_continuous_result_t **buffer, uint32_t timeout_ms);
100100

101101
/*
102102
* Start ADC continuous conversions

docs/en/api/adc.rst

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ ADC Continuous mode is an API designed for performing analog conversions on mult
162162
with the feature of receiving a callback upon completion of these conversions to access the results.
163163

164164
This API allows you to specify the desired number of conversions per pin within a single cycle, along with its corresponding sampling rate.
165-
The outcome of the ``analogContinuousRead`` function is an array of ``adc_continuous_data_t`` structures.
165+
The outcome of the ``analogContinuousRead`` function is an array of ``adc_continuous_result_t`` structures.
166166
These structures hold both the raw average value and the average value in millivolts for each pin.
167167

168168
analogContinuous
@@ -186,7 +186,7 @@ If ``false`` is returned, error occurs and ADC continuous was not configured.
186186
analogContinuousRead
187187
^^^^^^^^^^^^^^^^^^^^
188188

189-
This function is used to read ADC continuous data to the result buffer. The result buffer is an array of ``adc_continuous_data_t``.
189+
This function is used to read ADC continuous data to the result buffer. The result buffer is an array of ``adc_continuous_result_t``.
190190

191191
.. code-block:: arduino
192192
@@ -195,13 +195,13 @@ This function is used to read ADC continuous data to the result buffer. The resu
195195
uint8_t channel; /*!<ADC channel */
196196
int avg_read_raw; /*!<ADC average raw data */
197197
int avg_read_mvolts; /*!<ADC average voltage in mV */
198-
} adc_continuous_data_t;
198+
} adc_continuous_result_t;
199199
200200
.. code-block:: arduino
201201
202-
bool analogContinuousRead(adc_continuous_data_t ** buffer, uint32_t timeout_ms);
202+
bool analogContinuousRead(adc_continuous_result_t ** buffer, uint32_t timeout_ms);
203203
204-
* ``buffer`` conversion result buffer to read from ADC in adc_continuous_data_t format.
204+
* ``buffer`` conversion result buffer to read from ADC in adc_continuous_result_t format.
205205
* ``timeout_ms`` time to wait for data in milliseconds.
206206

207207
This function will return ``true`` if reading is successful and ``buffer`` is filled with data.

libraries/ESP32/examples/AnalogReadContinuous/AnalogReadContinuous.ino

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ uint8_t adc_pins_count = sizeof(adc_pins) / sizeof(uint8_t);
1616
volatile bool adc_coversion_done = false;
1717

1818
// Result structure for ADC Continuous reading
19-
adc_continuous_data_t *result = NULL;
19+
adc_continuous_result_t *result = NULL;
2020

2121
// ISR Function that will be triggered when ADC conversion is done
2222
void ARDUINO_ISR_ATTR adcComplete() {

0 commit comments

Comments
 (0)