pub use crate::chip::config::ccm::*;
pub mod ahb_clk;
pub mod analog;
pub mod clock_gate;
pub mod output_source;
use crate::ral;
pub use crate::common::ccm::XTAL_OSCILLATOR_HZ;
pub mod perclk_clk {
use crate::ral::{self, ccm::CCM};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u32)]
pub enum Selection {
Ipg = 0,
Oscillator = 1,
}
#[inline(always)]
pub fn set_selection(ccm: &mut CCM, selection: Selection) {
ral::modify_reg!(ral::ccm, ccm, CSCMR1, PERCLK_CLK_SEL: selection as u32);
}
#[inline(always)]
pub fn selection(ccm: &CCM) -> Selection {
if ral::read_reg!(ral::ccm, ccm, CSCMR1, PERCLK_CLK_SEL == 1) {
Selection::Oscillator
} else {
Selection::Ipg
}
}
pub const MIN_DIVIDER: u32 = 1;
pub const MAX_DIVIDER: u32 = 64;
#[inline(always)]
pub fn set_divider(ccm: &mut CCM, divider: u32) {
let podf = divider.clamp(MIN_DIVIDER, MAX_DIVIDER) - 1;
ral::modify_reg!(ral::ccm, ccm, CSCMR1, PERCLK_PODF: podf);
}
#[inline(always)]
pub fn divider(ccm: &CCM) -> u32 {
ral::read_reg!(ral::ccm, ccm, CSCMR1, PERCLK_PODF) + 1
}
}
pub mod ipg_clk {
use crate::ral::{self, ccm::CCM};
#[inline(always)]
pub fn divider(ccm: &CCM) -> u32 {
ral::read_reg!(ral::ccm, ccm, CBCDR, IPG_PODF) + 1
}
pub const MIN_DIVIDER: u32 = 1;
pub const MAX_DIVIDER: u32 = 4;
#[inline(always)]
pub fn set_divider(ccm: &mut CCM, divider: u32) {
let podf = divider.clamp(MIN_DIVIDER, MAX_DIVIDER) - 1;
ral::modify_reg!(ral::ccm, ccm, CBCDR, IPG_PODF: podf);
}
}
pub(crate) fn wait_handshake(ccm: &crate::ral::ccm::CCM) {
while crate::ral::read_reg!(crate::ral::ccm, ccm, CDHIPR) != 0 {}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u32)]
pub enum LowPowerMode {
RemainInRun = 0,
TransferToWait = 1,
TransferToStop = 2,
}
pub fn set_low_power_mode(ccm: &mut ral::ccm::CCM, mode: LowPowerMode) {
ral::modify_reg!(ral::ccm, ccm, CLPCR, LPM: mode as u32);
}
pub fn low_power_mode(ccm: &ral::ccm::CCM) -> LowPowerMode {
match ral::read_reg!(ral::ccm, ccm, CLPCR, LPM) {
0 => LowPowerMode::RemainInRun,
1 => LowPowerMode::TransferToWait,
2 => LowPowerMode::TransferToStop,
_ => unreachable!(),
}
}
pub mod uart_clk {
use crate::ral::{self, ccm::CCM};
#[inline(always)]
pub fn divider(ccm: &CCM) -> u32 {
ral::read_reg!(ral::ccm, ccm, CSCDR1, UART_CLK_PODF) + 1
}
pub const MIN_DIVIDER: u32 = 1;
pub const MAX_DIVIDER: u32 = 1 << 6;
#[inline(always)]
pub fn set_divider(ccm: &mut CCM, divider: u32) {
let podf = divider.clamp(MIN_DIVIDER, MAX_DIVIDER) - 1;
ral::modify_reg!(ral::ccm, ccm, CSCDR1, UART_CLK_PODF: podf);
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u32)]
pub enum Selection {
Pll3Div6 = 0,
Oscillator = 1,
}
#[inline(always)]
pub fn selection(ccm: &CCM) -> Selection {
match ral::read_reg!(ral::ccm, ccm, CSCDR1, UART_CLK_SEL) {
0 => Selection::Pll3Div6,
1 => Selection::Oscillator,
_ => unreachable!(),
}
}
#[inline(always)]
pub fn set_selection(ccm: &mut CCM, selection: Selection) {
ral::modify_reg!(ral::ccm, ccm, CSCDR1, UART_CLK_SEL: selection as u32);
}
}
pub mod lpi2c_clk {
use crate::ral::{self, ccm::CCM};
#[inline(always)]
pub fn divider(ccm: &CCM) -> u32 {
ral::read_reg!(ral::ccm, ccm, CSCDR2, LPI2C_CLK_PODF) + 1
}
pub const MIN_DIVIDER: u32 = 1;
pub const MAX_DIVIDER: u32 = 64;
#[inline(always)]
pub fn set_divider(ccm: &mut CCM, divider: u32) {
let podf = divider.clamp(MIN_DIVIDER, MAX_DIVIDER) - 1;
ral::modify_reg!(ral::ccm, ccm, CSCDR2, LPI2C_CLK_PODF: podf);
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u32)]
pub enum Selection {
Pll3Div8 = 0,
Oscillator = 1,
}
#[inline(always)]
pub fn selection(ccm: &CCM) -> Selection {
match ral::read_reg!(ral::ccm, ccm, CSCDR2, LPI2C_CLK_SEL) {
0 => Selection::Pll3Div8,
1 => Selection::Oscillator,
_ => unreachable!(),
}
}
#[inline(always)]
pub fn set_selection(ccm: &mut CCM, selection: Selection) {
ral::modify_reg!(ral::ccm, ccm, CSCDR2, LPI2C_CLK_SEL: selection as u32);
}
}
pub mod lpspi_clk {
use crate::ral::{self, ccm::CCM};
#[inline(always)]
pub fn divider(ccm: &CCM) -> u32 {
ral::read_reg!(ral::ccm, ccm, CBCMR, LPSPI_PODF) + 1
}
pub const MIN_DIVIDER: u32 = 1;
pub const MAX_DIVIDER: u32 = 8;
#[inline(always)]
pub fn set_divider(ccm: &mut CCM, divider: u32) {
let podf = divider.clamp(MIN_DIVIDER, MAX_DIVIDER) - 1;
ral::modify_reg!(ral::ccm, ccm, CBCMR, LPSPI_PODF: podf);
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u32)]
pub enum Selection {
Pll3Pfd1 = 0,
Pll3Pfd0 = 1,
Pll2 = 2,
Pll2Pfd2 = 3,
}
#[inline(always)]
pub fn selection(ccm: &CCM) -> Selection {
match ral::read_reg!(ral::ccm, ccm, CBCMR, LPSPI_CLK_SEL) {
0 => Selection::Pll3Pfd1,
1 => Selection::Pll3Pfd0,
2 => Selection::Pll2,
3 => Selection::Pll2Pfd2,
_ => unreachable!(),
}
}
#[inline(always)]
pub fn set_selection(ccm: &mut CCM, selection: Selection) {
ral::modify_reg!(ral::ccm, ccm, CBCMR, LPSPI_CLK_SEL: selection as u32);
}
}
macro_rules! ccm_flexio {
(
$name:ident, $desc:literal,
divider: ($divider_reg:ident, $divider_field:ident),
predivider: ($predivider_reg:ident, $predivider_field:ident),
selection: ($sel_reg:ident, $sel_field:ident)$(,)?
) => {
#[doc = concat!($desc, " clock root.")]
pub mod $name {
use crate::ral::{self, ccm::CCM};
#[doc = concat!("Returns the ", $desc, " clock divider.")]
#[inline(always)]
pub fn divider(ccm: &CCM) -> u32 {
ral::read_reg!(ral::ccm, ccm, $divider_reg, $divider_field) + 1
}
#[doc = concat!("The smallest ", $desc, " clock divider.")]
pub const MIN_DIVIDER: u32 = 1;
#[doc = concat!("The largest ", $desc, " clock divider.")]
pub const MAX_DIVIDER: u32 = 8;
#[doc = concat!("Set the ", $desc, " clock divider.")]
#[inline(always)]
pub fn set_divider(ccm: &mut CCM, divider: u32) {
let podf = divider.clamp(MIN_DIVIDER, MAX_DIVIDER) - 1;
ral::modify_reg!(ral::ccm, ccm, $divider_reg, $divider_field: podf);
}
#[doc = concat!("Returns the ", $desc, " clock predivider.")]
#[inline(always)]
pub fn predivider(ccm: &CCM) -> u32 {
ral::read_reg!(ral::ccm, ccm, $predivider_reg, $predivider_field) + 1
}
#[doc = concat!("The smallest ", $desc, " clock predivider.")]
pub const MIN_PREDIVIDER: u32 = 1;
#[doc = concat!("The largest ", $desc, " clock predivider.")]
pub const MAX_PREDIVIDER: u32 = 8;
#[doc = concat!("Set the ", $desc, " clock predivider.")]
#[inline(always)]
pub fn set_predivider(ccm: &mut CCM, predivider: u32) {
let podf = predivider.clamp(MIN_PREDIVIDER, MAX_PREDIVIDER) - 1;
ral::modify_reg!(ral::ccm, ccm, $predivider_reg, $predivider_field: podf);
}
#[doc = concat!($desc, " clock selections.")]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u32)]
pub enum Selection {
Pll4 = 0,
Pll3Pfd2 = 1,
#[cfg(any(feature = "imxrt1060", feature = "imxrt1064"))]
Pll5 = 2,
#[cfg(feature = "imxrt1010")]
Pll2 = 2,
Pll3SwClk = 3,
}
#[doc = concat!("Returns the ", $desc, " clock selections.")]
#[inline(always)]
pub fn selection(ccm: &CCM) -> Selection {
match ral::read_reg!(ral::ccm, ccm, $sel_reg, $sel_field) {
0 => Selection::Pll4,
1 => Selection::Pll3Pfd2,
#[cfg(any(feature = "imxrt1060", feature = "imxrt1064"))]
2 => Selection::Pll5,
#[cfg(feature = "imxrt1010")]
2 => Selection::Pll2,
3 => Selection::Pll3SwClk,
_ => unreachable!(),
}
}
#[doc = concat!("Set the ", $desc, " clock selections.")]
#[inline(always)]
pub fn set_selection(ccm: &mut CCM, selection: Selection) {
ral::modify_reg!(ral::ccm, ccm, $sel_reg, $sel_field: selection as u32);
}
}
};
}
pub mod sai_clk {
use crate::ral::{self, ccm::CCM};
#[inline(always)]
pub fn predivider<const N: u8>(ccm: &CCM) -> u32
where
ral::sai::Instance<N>: ral::Valid,
{
1 + (match N {
1 => ral::read_reg!(ral::ccm, ccm, CS1CDR, SAI1_CLK_PRED),
#[cfg(not(feature = "imxrt1010"))]
2 => ral::read_reg!(ral::ccm, ccm, CS2CDR, SAI2_CLK_PRED),
3 => ral::read_reg!(ral::ccm, ccm, CS1CDR, SAI3_CLK_PRED),
_ => unreachable!(),
})
}
pub const MIN_PREDIVIDER: u32 = 1;
pub const MAX_PREDIVIDER: u32 = 8;
#[inline(always)]
pub fn set_predivider<const N: u8>(ccm: &mut CCM, predivider: u32)
where
ral::sai::Instance<N>: ral::Valid,
{
let pred = predivider.clamp(MIN_PREDIVIDER, MAX_PREDIVIDER) - 1;
match N {
1 => ral::modify_reg!(ral::ccm, ccm, CS1CDR, SAI1_CLK_PRED: pred),
#[cfg(not(feature = "imxrt1010"))]
2 => ral::modify_reg!(ral::ccm, ccm, CS2CDR, SAI2_CLK_PRED: pred),
3 => ral::modify_reg!(ral::ccm, ccm, CS1CDR, SAI3_CLK_PRED: pred),
_ => unreachable!(),
}
}
#[inline(always)]
pub fn divider<const N: u8>(ccm: &CCM) -> u32
where
ral::sai::Instance<N>: ral::Valid,
{
1 + (match N {
1 => ral::read_reg!(ral::ccm, ccm, CS1CDR, SAI1_CLK_PODF),
#[cfg(not(feature = "imxrt1010"))]
2 => ral::read_reg!(ral::ccm, ccm, CS2CDR, SAI2_CLK_PODF),
3 => ral::read_reg!(ral::ccm, ccm, CS1CDR, SAI3_CLK_PODF),
_ => unreachable!(),
})
}
pub const MIN_DIVIDER: u32 = 1;
pub const MAX_DIVIDER: u32 = 64;
#[inline(always)]
pub fn set_divider<const N: u8>(ccm: &mut CCM, divider: u32)
where
ral::sai::Instance<N>: ral::Valid,
{
let podf = divider.clamp(MIN_DIVIDER, MAX_DIVIDER) - 1;
match N {
1 => ral::modify_reg!(ral::ccm, ccm, CS1CDR, SAI1_CLK_PODF: podf),
#[cfg(not(feature = "imxrt1010"))]
2 => ral::modify_reg!(ral::ccm, ccm, CS2CDR, SAI2_CLK_PODF: podf),
3 => ral::modify_reg!(ral::ccm, ccm, CS1CDR, SAI3_CLK_PODF: podf),
_ => unreachable!(),
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u32)]
pub enum Selection {
Pll3Pfd2 = 0,
#[cfg(not(feature = "imxrt1010"))]
Pll5 = 1,
#[cfg(feature = "imxrt1010")]
Pll3SwClk = 1,
Pll4 = 2,
Reserved = 3,
}
#[inline(always)]
pub fn selection<const N: u8>(ccm: &CCM) -> Selection
where
ral::sai::Instance<N>: ral::Valid,
{
let sel: u32 = match N {
1 => ral::read_reg!(ral::ccm, ccm, CSCMR1, SAI1_CLK_SEL),
#[cfg(not(feature = "imxrt1010"))]
2 => ral::read_reg!(ral::ccm, ccm, CSCMR1, SAI2_CLK_SEL),
3 => ral::read_reg!(ral::ccm, ccm, CSCMR1, SAI3_CLK_SEL),
_ => unreachable!(),
};
match sel {
0 => Selection::Pll3Pfd2,
#[cfg(not(feature = "imxrt1010"))]
1 => Selection::Pll5,
#[cfg(feature = "imxrt1010")]
1 => Selection::Pll3SwClk,
2 => Selection::Pll4,
_ => unreachable!(),
}
}
#[inline(always)]
pub fn set_selection<const N: u8>(ccm: &mut CCM, selection: Selection)
where
ral::sai::Instance<N>: ral::Valid,
{
match N {
1 => ral::modify_reg!(ral::ccm, ccm, CSCMR1, SAI1_CLK_SEL: selection as u32),
#[cfg(not(feature = "imxrt1010"))]
2 => ral::modify_reg!(ral::ccm, ccm, CSCMR1, SAI2_CLK_SEL: selection as u32),
3 => ral::modify_reg!(ral::ccm, ccm, CSCMR1, SAI3_CLK_SEL: selection as u32),
_ => unreachable!(),
}
}
}