Unified interface for MMIO and CPU registers.
This crate uses the tock-register-interface, please refer to their Readme for the whole API.
```rust
use register::{cpu::RegisterReadWrite, register_bitfields};
registerbitfields! {u32, CNTPCTL_EL0 [ /// Enables the timer. Permitted values are: /// /// 0 Timer disabled. /// 1 Timer enabled. ENABLE OFFSET(0) NUMBITS(1) [],
/// Timer interrupt mask bit. Permitted values are:
///
/// 0 Timer interrupt is not masked by the IMASK bit.
/// 1 Timer interrupt is masked by the IMASK bit.
IMASK OFFSET(1) NUMBITS(1) [],
/// The status of the timer. This bit indicates whether the
/// timer condition is met:
///
/// 0 Timer condition is not met.
/// 1 Timer condition is met.
ISTATUS OFFSET(2) NUMBITS(1) []
]
}
struct Reg;
impl RegisterReadWrite
/// Writes raw bits to the CPU register.
#[inline]
fn set(&self, value: u32) {
unsafe {
asm!("msr CNTP_CTL_EL0, $0" :: "r"(value) :: "volatile");
}
}
}
static CNTPCTLEL0: Reg = Reg {};
fn main() { CNTPCTLEL0.modify(CNTPCTLEL0::ENABLE::SET + CNTPCTLEL0::IMASK::SET); }
```
```rust use register::{mmio::*, register_bitfields};
register_bitfields! { u32,
GPFSEL1 [
FSEL14 OFFSET(12) NUMBITS(3) [
Input = 0b000,
Output = 0b001,
TXD0 = 0b100
],
FSEL15 OFFSET(15) NUMBITS(3) [
Input = 0b000,
Output = 0b001,
RXD0 = 0b100
]
]
}
pub struct RegisterBlock {
GPFSEL1: ReadWrite
fn main() { let regs = 0x1337_0000 as *const RegisterBlock;
unsafe { (*regs).SYSTMR_HI.get() };
} ```
Licensed under either of
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.