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(any(esp32c5, esp32c6, esp32c61, esp32h2))]
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 Self::new_cal_with_channel(atten, 0)
41 }
42
43 fn new_cal_with_channel(atten: Attenuation, _channel: u8) -> Self {
44 let cal_val = ADCX::init_code(atten).unwrap_or_else(|| {
47 AdcConfig::<ADCX>::adc_calibrate(atten, AdcCalSource::Gnd)
49 });
50
51 #[cfg(any(esp32c5, esp32c6, esp32c61, esp32h2))]
52 let chan_compens = ADCX::cal_chan_compens(atten, _channel).unwrap_or(0);
53
54 Self {
55 cal_val,
56 #[cfg(any(esp32c5, esp32c6, esp32c61, esp32h2))]
57 chan_compens,
58 _phantom: PhantomData,
59 }
60 }
61
62 fn adc_cal(&self) -> u16 {
63 self.cal_val
64 }
65
66 #[cfg(any(esp32c5, esp32c6, esp32c61, esp32h2))]
67 fn adc_val(&self, val: u16) -> u16 {
68 (val as i32 - self.chan_compens).clamp(0, ADCX::ADC_VAL_MASK as i32) as u16
69 }
70}