use crate::{
gpio,
peripheral::{Peripheral, PeripheralRef},
peripherals,
};
cfg_if::cfg_if! {
if #[cfg(esp32)] {
type Dac1Gpio = gpio::Gpio25<gpio::Analog>;
type Dac2Gpio = gpio::Gpio26<gpio::Analog>;
} else if #[cfg(esp32s2)] {
type Dac1Gpio = gpio::Gpio17<gpio::Analog>;
type Dac2Gpio = gpio::Gpio18<gpio::Analog>;
}
}
pub struct DAC1<'d> {
_inner: PeripheralRef<'d, peripherals::DAC1>,
}
impl<'d> DAC1<'d> {
pub fn new(dac: impl Peripheral<P = peripherals::DAC1> + 'd, _pin: Dac1Gpio) -> Self {
crate::into_ref!(dac);
#[cfg(esp32s2)]
unsafe { &*peripherals::SENS::PTR }
.sar_dac_ctrl1()
.modify(|_, w| w.dac_clkgate_en().set_bit());
unsafe { &*peripherals::RTC_IO::PTR }
.pad_dac1()
.modify(|_, w| w.pdac1_dac_xpd_force().set_bit().pdac1_xpd_dac().set_bit());
Self { _inner: dac }
}
pub fn write(&mut self, value: u8) {
unsafe { &*crate::peripherals::SENS::PTR }
.sar_dac_ctrl2()
.modify(|_, w| w.dac_cw_en1().clear_bit());
unsafe { &*crate::peripherals::RTC_IO::PTR }
.pad_dac1()
.modify(|_, w| unsafe { w.pdac1_dac().bits(value) });
}
}
pub struct DAC2<'d> {
_inner: PeripheralRef<'d, peripherals::DAC2>,
}
impl<'d> DAC2<'d> {
pub fn new(dac: impl Peripheral<P = peripherals::DAC2> + 'd, _pin: Dac2Gpio) -> Self {
crate::into_ref!(dac);
#[cfg(esp32s2)]
unsafe { &*peripherals::SENS::PTR }
.sar_dac_ctrl1()
.modify(|_, w| w.dac_clkgate_en().set_bit());
unsafe { &*peripherals::RTC_IO::PTR }
.pad_dac2()
.modify(|_, w| w.pdac2_dac_xpd_force().set_bit().pdac2_xpd_dac().set_bit());
Self { _inner: dac }
}
pub fn write(&mut self, value: u8) {
unsafe { &*crate::peripherals::SENS::PTR }
.sar_dac_ctrl2()
.modify(|_, w| w.dac_cw_en2().clear_bit());
unsafe { &*crate::peripherals::RTC_IO::PTR }
.pad_dac2()
.modify(|_, w| unsafe { w.pdac2_dac().bits(value) });
}
}