use core::marker::PhantomData;
use core::ops;
pub mod asp;
#[cfg(feature = "ultimate")]
pub mod uci;
#[allow(non_snake_case)]
#[non_exhaustive]
pub struct Peripherals {
pub ASP: ASP,
pub FAC: FAC,
pub ARG: ARG,
pub FPSTR: FPSTR,
#[cfg(feature = "ultimate")]
pub UCI: UCI,
}
#[no_mangle]
static PERIPHERALS: () = ();
static mut TAKEN: bool = false;
impl Peripherals {
#[inline]
pub fn take() -> Option<Self> {
super::interrupt::free(|_| {
if unsafe { TAKEN } {
None
} else {
Some(unsafe { Peripherals::steal() })
}
})
}
#[inline]
pub unsafe fn steal() -> Self {
unsafe {
TAKEN = true;
Peripherals {
ASP: ASP {
_marker: PhantomData,
},
FAC: FAC {
_marker: PhantomData,
},
ARG: ARG {
_marker: PhantomData,
},
FPSTR: FPSTR {
_marker: PhantomData,
},
#[cfg(feature = "ultimate")]
UCI: UCI {
_marker: PhantomData,
},
}
}
}
}
pub struct ASP {
_marker: PhantomData<*const ()>,
}
unsafe impl Send for ASP {}
impl ASP {
pub const PTR: *const self::asp::RegisterBlock = 0x0000 as *const _;
}
impl ops::Deref for ASP {
type Target = self::asp::RegisterBlock;
#[inline(always)]
fn deref(&self) -> &Self::Target {
unsafe { &*Self::PTR }
}
}
pub struct FAC {
_marker: PhantomData<*const ()>,
}
unsafe impl Send for FAC {}
pub struct ARG {
_marker: PhantomData<*const ()>,
}
unsafe impl Send for ARG {}
pub struct FPSTR {
_marker: PhantomData<*const ()>,
}
unsafe impl Send for FPSTR {}
#[cfg(feature = "ultimate")]
pub struct UCI {
_marker: PhantomData<*const ()>,
}
#[cfg(feature = "ultimate")]
unsafe impl Send for UCI {}
#[cfg(feature = "ultimate")]
impl UCI {
pub const PTR: *const self::uci::RegisterBlock = 0xdf1b as *const _;
}
#[cfg(feature = "ultimate")]
impl ops::Deref for UCI {
type Target = self::uci::RegisterBlock;
#[inline(always)]
fn deref(&self) -> &Self::Target {
unsafe { &*Self::PTR }
}
}