use crate::ral::{self, ccm::CCM};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u32)]
pub enum Setting {
Off = 0,
On = 1,
}
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::On,
_ => unreachable!(), }
}
}
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub struct Locator {
offset: usize,
}
impl Locator {
const fn new(offset: usize) -> Self {
Self { offset }
}
pub fn get(&self, ccm: &CCM) -> Setting {
let lpcg_direct = lpcg_direct_register(ccm, *self);
let raw = lpcg_direct.read() & 0b1;
Setting::from_raw(raw)
}
pub fn set(&self, ccm: &mut CCM, setting: Setting) {
let lpcg_direct = lpcg_direct_register(ccm, *self);
let mut raw = lpcg_direct.read();
raw &= !0b1;
raw |= setting as u32;
lpcg_direct.write(raw);
}
}
#[inline(always)]
fn lpcg_direct_register(ccm: &CCM, locator: Locator) -> &ral::RWRegister<u32> {
use core::ops::Deref;
let ccm: *const ral::ccm::RegisterBlock = ccm.deref();
let ccm: *const u8 = ccm.cast();
let lpcg_direct: *const u8 = unsafe { ccm.add(0x6000 + locator.offset * 0x20) };
let lpcg_direct: *const ral::RWRegister<u32> = lpcg_direct.cast();
unsafe { &*lpcg_direct }
}
#[inline(always)]
pub const fn pit<const N: u8>() -> Locator
where
ral::pit::Instance<N>: ral::Valid,
{
[Locator::new(62), Locator::new(63)][N as usize - 1]
}
#[inline(always)]
pub const fn gpio() -> Locator {
Locator::new(51)
}
#[inline(always)]
pub const fn dma() -> Locator {
Locator::new(22)
}
#[inline(always)]
pub const fn dma_lpsr() -> Locator {
Locator::new(23)
}
#[inline(always)]
pub const fn gpt<const N: u8>() -> Locator
where
ral::gpt::Instance<N>: ral::Valid,
{
[
Locator::new(64),
Locator::new(65),
Locator::new(66),
Locator::new(67),
Locator::new(68),
Locator::new(69),
][N as usize - 1]
}
#[inline(always)]
pub const fn usb() -> Locator {
Locator::new(115)
}
#[inline(always)]
pub const fn lpuart<const N: u8>() -> Locator
where
ral::lpuart::Instance<N>: ral::Valid,
{
Locator::new(N as usize + 85)
}
#[inline(always)]
pub const fn lpspi<const N: u8>() -> Locator
where
ral::lpspi::Instance<N>: ral::Valid,
{
Locator::new(N as usize + 103)
}
#[inline(always)]
pub const fn lpi2c<const N: u8>() -> Locator
where
ral::lpi2c::Instance<N>: ral::Valid,
{
Locator::new(N as usize + 97)
}
#[inline(always)]
pub const fn flexpwm<const N: u8>() -> Locator
where
ral::pwm::Instance<N>: ral::Valid,
{
Locator::new(N as usize + 78)
}
#[inline(always)]
pub const fn snvs() -> Locator {
Locator::new(38)
}
#[inline]
pub const fn flexio<const N: u8>() -> Locator
where
ral::pwm::Instance<N>: ral::Valid,
{
Locator::new(N as usize + 52)
}
#[inline]
pub const fn usdhc<const N: u8>() -> Locator
where
ral::usdhc::Instance<N>: ral::Valid,
{
Locator::new(N as usize + 116)
}