use core::marker::PhantomData;
use core::ops;
use crate::interrupt;
#[cfg(cm7)]
pub mod ac;
#[cfg(not(armv6m))]
pub mod cbp;
pub mod cpuid;
pub mod dcb;
pub mod dwt;
#[cfg(not(armv6m))]
pub mod fpb;
#[cfg(any(has_fpu, native))]
pub mod fpu;
pub mod icb;
#[cfg(all(not(armv6m), not(armv8m_base)))]
pub mod itm;
pub mod mpu;
pub mod nvic;
#[cfg(armv8m)]
pub mod sau;
pub mod scb;
pub mod syst;
#[cfg(not(armv6m))]
pub mod tpiu;
#[cfg(test)]
mod test;
#[allow(non_snake_case)]
#[allow(clippy::manual_non_exhaustive)]
pub struct Peripherals {
#[cfg(cm7)]
pub AC: AC,
pub CBP: CBP,
pub CPUID: CPUID,
pub DCB: DCB,
pub DWT: DWT,
pub FPB: FPB,
pub FPU: FPU,
pub ICB: ICB,
pub ITM: ITM,
pub MPU: MPU,
pub NVIC: NVIC,
pub SAU: SAU,
pub SCB: SCB,
pub SYST: SYST,
pub TPIU: TPIU,
_priv: (),
}
#[no_mangle]
static CORE_PERIPHERALS: () = ();
static mut TAKEN: bool = false;
impl Peripherals {
#[inline]
pub fn take() -> Option<Self> {
interrupt::free(|_| {
if unsafe { TAKEN } {
None
} else {
Some(unsafe { Peripherals::steal() })
}
})
}
#[inline]
pub unsafe fn steal() -> Self {
TAKEN = true;
Peripherals {
#[cfg(cm7)]
AC: AC {
_marker: PhantomData,
},
CBP: CBP {
_marker: PhantomData,
},
CPUID: CPUID {
_marker: PhantomData,
},
DCB: DCB {
_marker: PhantomData,
},
DWT: DWT {
_marker: PhantomData,
},
FPB: FPB {
_marker: PhantomData,
},
FPU: FPU {
_marker: PhantomData,
},
ICB: ICB {
_marker: PhantomData,
},
ITM: ITM {
_marker: PhantomData,
},
MPU: MPU {
_marker: PhantomData,
},
NVIC: NVIC {
_marker: PhantomData,
},
SAU: SAU {
_marker: PhantomData,
},
SCB: SCB {
_marker: PhantomData,
},
SYST: SYST {
_marker: PhantomData,
},
TPIU: TPIU {
_marker: PhantomData,
},
_priv: (),
}
}
}
#[cfg(cm7)]
pub struct AC {
_marker: PhantomData<*const ()>,
}
#[cfg(cm7)]
unsafe impl Send for AC {}
#[cfg(cm7)]
impl AC {
pub const PTR: *const self::ac::RegisterBlock = 0xE000_EF90 as *const _;
#[inline(always)]
#[deprecated(since = "0.7.5", note = "Use the associated constant `PTR` instead")]
pub const fn ptr() -> *const self::ac::RegisterBlock {
Self::PTR
}
}
pub struct CBP {
_marker: PhantomData<*const ()>,
}
unsafe impl Send for CBP {}
#[cfg(not(armv6m))]
impl CBP {
#[inline(always)]
pub(crate) const unsafe fn new() -> Self {
CBP {
_marker: PhantomData,
}
}
pub const PTR: *const self::cbp::RegisterBlock = 0xE000_EF50 as *const _;
#[inline(always)]
#[deprecated(since = "0.7.5", note = "Use the associated constant `PTR` instead")]
pub const fn ptr() -> *const self::cbp::RegisterBlock {
Self::PTR
}
}
#[cfg(not(armv6m))]
impl ops::Deref for CBP {
type Target = self::cbp::RegisterBlock;
#[inline(always)]
fn deref(&self) -> &Self::Target {
unsafe { &*Self::PTR }
}
}
pub struct CPUID {
_marker: PhantomData<*const ()>,
}
unsafe impl Send for CPUID {}
impl CPUID {
pub const PTR: *const self::cpuid::RegisterBlock = 0xE000_ED00 as *const _;
#[inline(always)]
#[deprecated(since = "0.7.5", note = "Use the associated constant `PTR` instead")]
pub const fn ptr() -> *const self::cpuid::RegisterBlock {
Self::PTR
}
}
impl ops::Deref for CPUID {
type Target = self::cpuid::RegisterBlock;
#[inline(always)]
fn deref(&self) -> &Self::Target {
unsafe { &*Self::PTR }
}
}
pub struct DCB {
_marker: PhantomData<*const ()>,
}
unsafe impl Send for DCB {}
impl DCB {
pub const PTR: *const dcb::RegisterBlock = 0xE000_EDF0 as *const _;
#[inline(always)]
#[deprecated(since = "0.7.5", note = "Use the associated constant `PTR` instead")]
pub const fn ptr() -> *const dcb::RegisterBlock {
Self::PTR
}
}
impl ops::Deref for DCB {
type Target = self::dcb::RegisterBlock;
#[inline(always)]
fn deref(&self) -> &Self::Target {
unsafe { &*DCB::PTR }
}
}
pub struct DWT {
_marker: PhantomData<*const ()>,
}
unsafe impl Send for DWT {}
impl DWT {
pub const PTR: *const dwt::RegisterBlock = 0xE000_1000 as *const _;
#[inline(always)]
#[deprecated(since = "0.7.5", note = "Use the associated constant `PTR` instead")]
pub const fn ptr() -> *const dwt::RegisterBlock {
Self::PTR
}
}
impl ops::Deref for DWT {
type Target = self::dwt::RegisterBlock;
#[inline(always)]
fn deref(&self) -> &Self::Target {
unsafe { &*Self::PTR }
}
}
pub struct FPB {
_marker: PhantomData<*const ()>,
}
unsafe impl Send for FPB {}
#[cfg(not(armv6m))]
impl FPB {
pub const PTR: *const fpb::RegisterBlock = 0xE000_2000 as *const _;
#[inline(always)]
#[deprecated(since = "0.7.5", note = "Use the associated constant `PTR` instead")]
pub const fn ptr() -> *const fpb::RegisterBlock {
Self::PTR
}
}
#[cfg(not(armv6m))]
impl ops::Deref for FPB {
type Target = self::fpb::RegisterBlock;
#[inline(always)]
fn deref(&self) -> &Self::Target {
unsafe { &*Self::PTR }
}
}
pub struct FPU {
_marker: PhantomData<*const ()>,
}
unsafe impl Send for FPU {}
#[cfg(any(has_fpu, native))]
impl FPU {
pub const PTR: *const fpu::RegisterBlock = 0xE000_EF30 as *const _;
#[inline(always)]
#[deprecated(since = "0.7.5", note = "Use the associated constant `PTR` instead")]
pub const fn ptr() -> *const fpu::RegisterBlock {
Self::PTR
}
}
#[cfg(any(has_fpu, native))]
impl ops::Deref for FPU {
type Target = self::fpu::RegisterBlock;
#[inline(always)]
fn deref(&self) -> &Self::Target {
unsafe { &*Self::PTR }
}
}
pub struct ICB {
_marker: PhantomData<*const ()>,
}
unsafe impl Send for ICB {}
impl ICB {
pub const PTR: *mut icb::RegisterBlock = 0xE000_E004 as *mut _;
#[inline(always)]
#[deprecated(since = "0.7.5", note = "Use the associated constant `PTR` instead")]
pub const fn ptr() -> *mut icb::RegisterBlock {
Self::PTR
}
}
impl ops::Deref for ICB {
type Target = self::icb::RegisterBlock;
#[inline(always)]
fn deref(&self) -> &Self::Target {
unsafe { &*Self::PTR }
}
}
impl ops::DerefMut for ICB {
#[inline(always)]
fn deref_mut(&mut self) -> &mut Self::Target {
unsafe { &mut *Self::PTR }
}
}
pub struct ITM {
_marker: PhantomData<*const ()>,
}
unsafe impl Send for ITM {}
#[cfg(all(not(armv6m), not(armv8m_base)))]
impl ITM {
pub const PTR: *mut itm::RegisterBlock = 0xE000_0000 as *mut _;
#[inline(always)]
#[deprecated(since = "0.7.5", note = "Use the associated constant `PTR` instead")]
pub const fn ptr() -> *mut itm::RegisterBlock {
Self::PTR
}
}
#[cfg(all(not(armv6m), not(armv8m_base)))]
impl ops::Deref for ITM {
type Target = self::itm::RegisterBlock;
#[inline(always)]
fn deref(&self) -> &Self::Target {
unsafe { &*Self::PTR }
}
}
#[cfg(all(not(armv6m), not(armv8m_base)))]
impl ops::DerefMut for ITM {
#[inline(always)]
fn deref_mut(&mut self) -> &mut Self::Target {
unsafe { &mut *Self::PTR }
}
}
pub struct MPU {
_marker: PhantomData<*const ()>,
}
unsafe impl Send for MPU {}
impl MPU {
pub const PTR: *const mpu::RegisterBlock = 0xE000_ED90 as *const _;
#[inline(always)]
#[deprecated(since = "0.7.5", note = "Use the associated constant `PTR` instead")]
pub const fn ptr() -> *const mpu::RegisterBlock {
Self::PTR
}
}
impl ops::Deref for MPU {
type Target = self::mpu::RegisterBlock;
#[inline(always)]
fn deref(&self) -> &Self::Target {
unsafe { &*Self::PTR }
}
}
pub struct NVIC {
_marker: PhantomData<*const ()>,
}
unsafe impl Send for NVIC {}
impl NVIC {
pub const PTR: *const nvic::RegisterBlock = 0xE000_E100 as *const _;
#[inline(always)]
#[deprecated(since = "0.7.5", note = "Use the associated constant `PTR` instead")]
pub const fn ptr() -> *const nvic::RegisterBlock {
Self::PTR
}
}
impl ops::Deref for NVIC {
type Target = self::nvic::RegisterBlock;
#[inline(always)]
fn deref(&self) -> &Self::Target {
unsafe { &*Self::PTR }
}
}
pub struct SAU {
_marker: PhantomData<*const ()>,
}
unsafe impl Send for SAU {}
#[cfg(armv8m)]
impl SAU {
pub const PTR: *const sau::RegisterBlock = 0xE000_EDD0 as *const _;
#[inline(always)]
#[deprecated(since = "0.7.5", note = "Use the associated constant `PTR` instead")]
pub const fn ptr() -> *const sau::RegisterBlock {
Self::PTR
}
}
#[cfg(armv8m)]
impl ops::Deref for SAU {
type Target = self::sau::RegisterBlock;
#[inline(always)]
fn deref(&self) -> &Self::Target {
unsafe { &*Self::PTR }
}
}
pub struct SCB {
_marker: PhantomData<*const ()>,
}
unsafe impl Send for SCB {}
impl SCB {
pub const PTR: *const scb::RegisterBlock = 0xE000_ED04 as *const _;
#[inline(always)]
#[deprecated(since = "0.7.5", note = "Use the associated constant `PTR` instead")]
pub const fn ptr() -> *const scb::RegisterBlock {
Self::PTR
}
}
impl ops::Deref for SCB {
type Target = self::scb::RegisterBlock;
#[inline(always)]
fn deref(&self) -> &Self::Target {
unsafe { &*Self::PTR }
}
}
pub struct SYST {
_marker: PhantomData<*const ()>,
}
unsafe impl Send for SYST {}
impl SYST {
pub const PTR: *const syst::RegisterBlock = 0xE000_E010 as *const _;
#[inline(always)]
#[deprecated(since = "0.7.5", note = "Use the associated constant `PTR` instead")]
pub const fn ptr() -> *const syst::RegisterBlock {
Self::PTR
}
}
impl ops::Deref for SYST {
type Target = self::syst::RegisterBlock;
#[inline(always)]
fn deref(&self) -> &Self::Target {
unsafe { &*Self::PTR }
}
}
pub struct TPIU {
_marker: PhantomData<*const ()>,
}
unsafe impl Send for TPIU {}
#[cfg(not(armv6m))]
impl TPIU {
pub const PTR: *const tpiu::RegisterBlock = 0xE004_0000 as *const _;
#[inline(always)]
#[deprecated(since = "0.7.5", note = "Use the associated constant `PTR` instead")]
pub const fn ptr() -> *const tpiu::RegisterBlock {
Self::PTR
}
}
#[cfg(not(armv6m))]
impl ops::Deref for TPIU {
type Target = self::tpiu::RegisterBlock;
#[inline(always)]
fn deref(&self) -> &Self::Target {
unsafe { &*Self::PTR }
}
}