crate::wrap_always_on_peripheral!(Pmc, PMC);
impl Pmc {
pub fn power_on<P: PowerControl>(&mut self, peripheral: &mut P) {
peripheral.powered_on(self);
}
pub fn power_off<P: PowerControl>(&mut self, peripheral: &mut P) {
peripheral.powered_off(self);
}
pub fn is_powered<P: PowerControl>(&self, peripheral: &P) -> bool {
peripheral.is_powered(&self)
}
}
pub trait PowerControl {
fn powered_on(&self, pmc: &mut Pmc);
fn powered_off(&self, pmc: &mut Pmc);
fn is_powered(&self, pmc: &Pmc) -> bool;
}
macro_rules! impl_power_control {
($power_control:ty, $register:ident) => {
impl PowerControl for $power_control {
fn powered_on(&self, pmc: &mut Pmc) {
pmc.raw.pdruncfg0.modify(|_, w| w.$register().poweredon());
}
fn powered_off(&self, pmc: &mut Pmc) {
pmc.raw.pdruncfg0.modify(|_, w| w.$register().poweredoff());
}
fn is_powered(&self, pmc: &Pmc) -> bool {
pmc.raw.pdruncfg0.read().$register().is_poweredon()
}
}
};
($power_control:ty, $register1:ident, $register2:ident) => {
impl PowerControl for $power_control {
fn powered_on(&self, pmc: &mut Pmc) {
pmc.raw.pdruncfg0.modify(|_, w| w.$register1().poweredon());
pmc.raw.pdruncfg0.modify(|_, w| w.$register2().poweredon());
}
fn powered_off(&self, pmc: &mut Pmc) {
pmc.raw.pdruncfg0.modify(|_, w| w.$register1().poweredoff());
pmc.raw.pdruncfg0.modify(|_, w| w.$register2().poweredoff());
}
fn is_powered(&self, pmc: &Pmc) -> bool {
pmc.raw.pdruncfg0.read().$register1().is_poweredon() &&
pmc.raw.pdruncfg0.read().$register2().is_poweredon()
}
}
};
}
impl_power_control!(raw::USB0, pden_usbfsphy);
impl_power_control!(raw::USBPHY, pden_usbhsphy, pden_ldousbhs);
impl_power_control!(raw::ADC0, pden_auxbias);
impl_power_control!(crate::typestates::ClocksSupport32KhzFroToken, pden_fro32k);