use crate::ral::{self, ccm::CCM};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u32)]
pub enum Setting {
Off = 0,
OnlyRun = 1,
On = 3,
}
pub const OFF: Setting = Setting::Off;
pub const ON: Setting = Setting::On;
impl Setting {
fn from_raw(raw: u32) -> Self {
match raw {
0 => Setting::Off,
1 => Setting::OnlyRun,
3 => Setting::On,
_ => unreachable!(), }
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[allow(unused)]
#[repr(u8)]
enum Register {
CCGR0,
CCGR1,
CCGR2,
CCGR3,
CCGR4,
CCGR5,
CCGR6,
CCGR7,
}
use Register::*;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[allow(unused)]
#[repr(u8)]
enum Gate {
CG0,
CG1,
CG2,
CG3,
CG4,
CG5,
CG6,
CG7,
CG8,
CG9,
CG10,
CG11,
CG12,
CG13,
CG14,
CG15,
}
use Gate::*;
impl Gate {
#[inline(always)]
const fn shift(self) -> usize {
self as usize * 2
}
}
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub struct Locator {
register: Register,
gate: Gate,
}
const fn locator(register: Register, gate: Gate) -> Locator {
Locator { register, gate }
}
#[inline(always)]
fn clock_gate_register(ccm: &CCM, register: Register) -> &ral::RWRegister<u32> {
match register {
Register::CCGR0 => &ccm.CCGR0,
Register::CCGR1 => &ccm.CCGR1,
Register::CCGR2 => &ccm.CCGR2,
Register::CCGR3 => &ccm.CCGR3,
Register::CCGR4 => &ccm.CCGR4,
Register::CCGR5 => &ccm.CCGR5,
Register::CCGR6 => &ccm.CCGR6,
Register::CCGR7 => {
cfg_if::cfg_if! {
if #[cfg(any(chip = "imxrt1060", chip = "imxrt1064"))] {
&ccm.CCGR7
} else {
unreachable!()
}
}
}
}
}
impl Locator {
pub fn get(&self, ccm: &CCM) -> Setting {
let ccgr = clock_gate_register(ccm, self.register);
let raw = (ccgr.read() >> self.gate.shift()) & 0b11;
Setting::from_raw(raw)
}
pub fn set(&self, ccm: &mut CCM, setting: Setting) {
let ccgr = clock_gate_register(ccm, self.register);
let mut raw = ccgr.read();
raw &= !(0b11 << self.gate.shift());
raw |= (setting as u32) << self.gate.shift();
ccgr.write(raw);
}
}
#[inline(always)]
pub const fn pit() -> Locator {
locator(CCGR1, CG6)
}
#[inline(always)]
pub const fn gpt_serial<const N: u8>() -> Locator
where
ral::gpt::Instance<N>: ral::Valid,
{
[locator(CCGR1, CG11), locator(CCGR0, CG13)][N as usize - 1]
}
#[inline(always)]
pub const fn gpt_bus<const N: u8>() -> Locator
where
ral::gpt::Instance<N>: ral::Valid,
{
[locator(CCGR1, CG10), locator(CCGR0, CG12)][N as usize - 1]
}
#[inline(always)]
pub const fn gpio<const N: u8>() -> Locator
where
ral::gpio::Instance<N>: ral::Valid,
{
[
locator(CCGR1, CG13),
locator(CCGR0, CG15),
locator(CCGR2, CG13),
locator(CCGR3, CG6),
locator(CCGR1, CG15),
][N as usize - 1]
}
#[inline(always)]
pub const fn lpuart<const N: u8>() -> Locator
where
ral::lpuart::Instance<N>: ral::Valid,
{
[
locator(CCGR5, CG12),
locator(CCGR0, CG14),
locator(CCGR0, CG6),
locator(CCGR1, CG12),
locator(CCGR3, CG1),
locator(CCGR3, CG3),
locator(CCGR5, CG13),
locator(CCGR6, CG7),
][N as usize - 1]
}
#[inline(always)]
pub const fn dma() -> Locator {
locator(CCGR5, CG3)
}
#[inline(always)]
pub const fn lpi2c<const N: u8>() -> Locator
where
ral::lpi2c::Instance<N>: ral::Valid,
{
[
locator(CCGR2, CG3),
locator(CCGR2, CG4),
locator(CCGR2, CG5),
locator(CCGR6, CG12),
][N as usize - 1]
}
#[inline(always)]
pub const fn lpspi<const N: u8>() -> Locator
where
ral::lpspi::Instance<N>: ral::Valid,
{
[
locator(CCGR1, CG0),
locator(CCGR1, CG1),
locator(CCGR1, CG2),
locator(CCGR1, CG3),
][N as usize - 1]
}
#[allow(clippy::assertions_on_constants)]
const _: () = assert!(ral::SOLE_INSTANCE == 0u8);
#[inline(always)]
pub const fn flexpwm<const N: u8>() -> Locator
where
ral::pwm::Instance<N>: ral::Valid,
{
[
locator(CCGR4, CG8),
locator(CCGR4, CG9),
locator(CCGR4, CG10),
locator(CCGR4, CG11),
][if N == ral::SOLE_INSTANCE {
N as usize
} else {
N as usize - 1
}]
}
#[inline(always)]
pub const fn trng() -> Locator {
locator(CCGR6, CG6)
}
#[inline(always)]
pub const fn snvs_lp() -> Locator {
locator(CCGR5, CG15)
}
#[inline(always)]
pub const fn snvs_hp() -> Locator {
locator(CCGR5, CG14)
}
#[inline(always)]
pub const fn usb() -> Locator {
locator(CCGR6, CG0)
}
#[inline(always)]
pub const fn adc<const N: u8>() -> Locator
where
ral::adc::Instance<N>: ral::Valid,
{
[locator(CCGR1, CG8), locator(CCGR1, CG4)][if N == ral::SOLE_INSTANCE {
N as usize
} else {
N as usize - 1
}]
}
pub use crate::chip::config::ccm::clock_gate::*;