diff options
Diffstat (limited to 'src/peripheral/itm.rs')
-rw-r--r-- | src/peripheral/itm.rs | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/peripheral/itm.rs b/src/peripheral/itm.rs new file mode 100644 index 0000000..b56d1b5 --- /dev/null +++ b/src/peripheral/itm.rs @@ -0,0 +1,54 @@ +//! Instrumentation Trace Macrocell + +use volatile_register::{RO, RW, WO}; + +use core::cell::UnsafeCell; +use core::ptr; + +/// Registers +#[repr(C)] +pub struct Registers { + /// Stimulus Port + pub stim: [Stim; 256], + reserved0: [u32; 640], + /// Trace Enable + pub ter: [RW<u32>; 8], + reserved1: [u32; 8], + /// Trace Privilege + pub tpr: RW<u32>, + reserved2: [u32; 15], + /// Trace Control + pub tcr: RW<u32>, + reserved3: [u32; 75], + /// Lock Access + pub lar: WO<u32>, + /// Lock Status + pub lsr: RO<u32>, +} + +/// Stimulus Port +pub struct Stim { + register: UnsafeCell<u32>, +} + +impl Stim { + /// Writes an `u8` payload into the stimulus port + pub fn write_u8(&self, value: u8) { + unsafe { ptr::write_volatile(self.register.get() as *mut u8, value) } + } + + /// Writes an `u16` payload into the stimulus port + pub fn write_u16(&self, value: u16) { + unsafe { ptr::write_volatile(self.register.get() as *mut u16, value) } + } + + /// Writes an `u32` payload into the stimulus port + pub fn write_u32(&self, value: u32) { + unsafe { ptr::write_volatile(self.register.get(), value) } + } + + /// Returns `true` if the stimulus port is ready to accept more data + pub fn is_fifo_ready(&self) -> bool { + unsafe { ptr::read_volatile(self.register.get()) == 1 } + } +} |