esp_hal/analog/adc/calibration/
basic.rs1use core::marker::PhantomData;
2
3use crate::analog::adc::{
4 AdcCalEfuse,
5 AdcCalScheme,
6 AdcCalSource,
7 AdcConfig,
8 Attenuation,
9 CalibrationAccess,
10};
11
12#[derive(Clone, Copy)]
23pub struct AdcCalBasic<ADCX> {
24 cal_val: u16,
26
27 #[cfg(esp32c5)]
28 chan_compens: i32,
29
30 _phantom: PhantomData<ADCX>,
31}
32
33impl<ADCX> crate::private::Sealed for AdcCalBasic<ADCX> {}
34
35impl<ADCX> AdcCalScheme<ADCX> for AdcCalBasic<ADCX>
36where
37 ADCX: AdcCalEfuse + CalibrationAccess,
38{
39 fn new_cal(atten: Attenuation) -> Self {
40 let cal_val = ADCX::init_code(atten).unwrap_or_else(|| {
43 AdcConfig::<ADCX>::adc_calibrate(atten, AdcCalSource::Gnd)
45 });
46
47 #[cfg(esp32c5)]
48 let chan_compens = ADCX::cal_chan_compens(atten, ADCX::ADC_CAL_CHANNEL).unwrap_or(0);
49
50 Self {
51 cal_val,
52 #[cfg(esp32c5)]
53 chan_compens,
54 _phantom: PhantomData,
55 }
56 }
57
58 fn adc_cal(&self) -> u16 {
59 self.cal_val
60 }
61
62 #[cfg(esp32c5)]
64 fn adc_val(&self, val: u16) -> u16 {
65 val.saturating_sub(self.chan_compens as u16)
66 .clamp(0, ADCX::ADC_VAL_MASK)
67 }
68}