use typenum::U1;
use crate::pac::{Gclk, Mclk, Nvmctrl, Osc32kctrl, Oscctrl};
use super::*;
pub struct Pac {
oscctrl: Oscctrl,
osc32kctrl: Osc32kctrl,
gclk: Gclk,
mclk: Mclk,
}
impl Pac {
pub unsafe fn steal(self) -> (Oscctrl, Osc32kctrl, Gclk, Mclk) {
(self.oscctrl, self.osc32kctrl, self.gclk, self.mclk)
}
}
pub struct Buses {
pub ahb: ahb::Ahb,
pub apb: apb::Apb,
}
pub struct Clocks {
pub pac: Pac,
pub ahbs: ahb::AhbClks,
pub apbs: apb::ApbClks,
pub gclk0: Enabled<gclk::Gclk0<dfll::DfllId>, U1>,
pub dfll: Enabled<dfll::Dfll, U1>,
pub osculp32k_base: Enabled<osculp32k::OscUlp32kBase>,
}
pub struct Tokens {
pub apbs: apb::ApbTokens,
pub dpll0: dpll::DpllToken<dpll::Dpll0Id>,
pub dpll1: dpll::DpllToken<dpll::Dpll1Id>,
pub gclks: gclk::GclkTokens,
pub pclks: pclk::PclkTokens,
pub rtcosc: rtcosc::RtcOscToken,
pub xosc0: xosc::XoscToken<xosc::Xosc0Id>,
pub xosc1: xosc::XoscToken<xosc::Xosc1Id>,
pub xosc32k: xosc32k::Xosc32kTokens,
pub osculp32k: osculp32k::OscUlp32kTokens,
}
#[inline]
pub fn clock_system_at_reset(
oscctrl: Oscctrl,
osc32kctrl: Osc32kctrl,
gclk: Gclk,
mclk: Mclk,
nvmctrl: &mut Nvmctrl,
) -> (Buses, Clocks, Tokens) {
unsafe {
let buses = Buses {
ahb: ahb::Ahb::new(),
apb: apb::Apb::new(),
};
let pac = Pac {
oscctrl,
osc32kctrl,
gclk,
mclk,
};
let dfll = Enabled::<_>::new(dfll::Dfll::open_loop(dfll::DfllToken::new()));
let (gclk0, dfll) = gclk::Gclk0::from_source(gclk::GclkToken::new(), dfll);
let gclk0 = Enabled::new(gclk0);
let clocks = Clocks {
pac,
ahbs: ahb::AhbClks::new(),
apbs: apb::ApbClks::new(),
gclk0,
dfll,
osculp32k_base: osculp32k::OscUlp32kBase::new(),
};
let tokens = Tokens {
apbs: apb::ApbTokens::new(),
dpll0: dpll::DpllToken::new(),
dpll1: dpll::DpllToken::new(),
gclks: gclk::GclkTokens::new(nvmctrl),
pclks: pclk::PclkTokens::new(),
rtcosc: rtcosc::RtcOscToken::new(),
xosc0: xosc::XoscToken::new(),
xosc1: xosc::XoscToken::new(),
xosc32k: xosc32k::Xosc32kTokens::new(),
osculp32k: osculp32k::OscUlp32kTokens::new(),
};
(buses, clocks, tokens)
}
}