@@ -21,7 +21,7 @@ use procmacros::handler;
2121pub use self :: calibration:: * ;
2222use super :: { AdcCalSource , AdcConfig , Attenuation } ;
2323#[ cfg( any( esp32c2, esp32c3, esp32c6, esp32h2) ) ]
24- use crate :: efuse:: Efuse ;
24+ use crate :: efuse:: { AdcCalibUnit , Efuse } ;
2525use crate :: {
2626 Async ,
2727 Blocking ,
8888 // Connect calibration source
8989 ADCI :: connect_cal ( source, true ) ;
9090
91+ ADCI :: calibration_init ( ) ;
9192 for _ in 0 ..ADC_CAL_CNT_MAX {
9293 ADCI :: set_init_code ( 0 ) ;
9394
@@ -132,6 +133,9 @@ pub trait RegisterAccess {
132133 /// Reset flags
133134 fn reset ( ) ;
134135
136+ /// Set up ADC hardware for calibration
137+ fn calibration_init ( ) ;
138+
135139 /// Set calibration parameter to ADC hardware
136140 fn set_init_code ( data : u16 ) ;
137141}
@@ -177,6 +181,16 @@ impl RegisterAccess for crate::peripherals::ADC1<'_> {
177181 . modify ( |_, w| w. onetime_start ( ) . clear_bit ( ) ) ;
178182 }
179183
184+ // Currently #[cfg] covers all supported RISC-V devices,
185+ // but, for example, esp32p4 uses the value 4 instead of 1,
186+ // so it is not standard across all RISC-V devices.
187+ #[ cfg( any( esp32c2, esp32c3, esp32c6, esp32h2) ) ]
188+ fn calibration_init ( ) {
189+ // e.g.
190+ // https://github.com/espressif/esp-idf/blob/800f141f94c0f880c162de476512e183df671307/components/hal/esp32c3/include/hal/adc_ll.h#L702
191+ regi2c:: ADC_SAR1_DREF . write_field ( 1 ) ;
192+ }
193+
180194 fn set_init_code ( data : u16 ) {
181195 let [ msb, lsb] = data. to_be_bytes ( ) ;
182196
@@ -249,6 +263,11 @@ impl RegisterAccess for crate::peripherals::ADC2<'_> {
249263 . modify ( |_, w| w. onetime_start ( ) . clear_bit ( ) ) ;
250264 }
251265
266+ #[ cfg( any( esp32c2, esp32c3, esp32c6, esp32h2) ) ]
267+ fn calibration_init ( ) {
268+ regi2c:: ADC_SAR2_DREF . write_field ( 1 ) ;
269+ }
270+
252271 fn set_init_code ( data : u16 ) {
253272 let [ msb, lsb] = data. to_be_bytes ( ) ;
254273
@@ -360,6 +379,7 @@ where
360379 self . active_channel = Some ( pin. pin . adc_channel ( ) ) ;
361380
362381 // Set ADC unit calibration according used scheme for pin
382+ ADCI :: calibration_init ( ) ;
363383 ADCI :: set_init_code ( pin. cal_scheme . adc_cal ( ) ) ;
364384
365385 let channel = self . active_channel . unwrap ( ) ;
@@ -424,30 +444,30 @@ impl<ADCI> InterruptConfigurable for Adc<'_, ADCI, Blocking> {
424444#[ cfg( adc_adc1) ]
425445impl super :: AdcCalEfuse for crate :: peripherals:: ADC1 < ' _ > {
426446 fn init_code ( atten : Attenuation ) -> Option < u16 > {
427- Efuse :: rtc_calib_init_code ( 1 , atten)
447+ Efuse :: rtc_calib_init_code ( AdcCalibUnit :: ADC1 , atten)
428448 }
429449
430450 fn cal_mv ( atten : Attenuation ) -> u16 {
431- Efuse :: rtc_calib_cal_mv ( 1 , atten)
451+ Efuse :: rtc_calib_cal_mv ( AdcCalibUnit :: ADC1 , atten)
432452 }
433453
434454 fn cal_code ( atten : Attenuation ) -> Option < u16 > {
435- Efuse :: rtc_calib_cal_code ( 1 , atten)
455+ Efuse :: rtc_calib_cal_code ( AdcCalibUnit :: ADC1 , atten)
436456 }
437457}
438458
439459#[ cfg( adc_adc2) ]
440460impl super :: AdcCalEfuse for crate :: peripherals:: ADC2 < ' _ > {
441461 fn init_code ( atten : Attenuation ) -> Option < u16 > {
442- Efuse :: rtc_calib_init_code ( 2 , atten)
462+ Efuse :: rtc_calib_init_code ( AdcCalibUnit :: ADC2 , atten)
443463 }
444464
445465 fn cal_mv ( atten : Attenuation ) -> u16 {
446- Efuse :: rtc_calib_cal_mv ( 2 , atten)
466+ Efuse :: rtc_calib_cal_mv ( AdcCalibUnit :: ADC2 , atten)
447467 }
448468
449469 fn cal_code ( atten : Attenuation ) -> Option < u16 > {
450- Efuse :: rtc_calib_cal_code ( 2 , atten)
470+ Efuse :: rtc_calib_cal_code ( AdcCalibUnit :: ADC2 , atten)
451471 }
452472}
453473
@@ -489,6 +509,7 @@ where
489509 }
490510
491511 // Set ADC unit calibration according used scheme for pin
512+ ADCI :: calibration_init ( ) ;
492513 ADCI :: set_init_code ( pin. cal_scheme . adc_cal ( ) ) ;
493514
494515 let attenuation = self . attenuations [ channel as usize ] . unwrap ( ) as u8 ;
0 commit comments