Macro ruspiro_mmio_register::define_mmio_register [−][src]
macro_rules! define_mmio_register {
($($(#[doc = $rdoc : expr]) * $vis : vis $name : ident < $access : ident < $t
: ty > @ ($addr : expr) >
$({
$($(#[doc = $fdoc : expr]) * $field : ident OFFSET($offset : literal)
$(BITS($bits : literal)) ?
$([$($(#[doc = $fvdoc : expr]) * $enum : ident = $value : expr),
*]) ?), *
}) ?), *) => { ... };
}
Expand description
Macro to define a MMIO register with specific defined access mode.
The access mode could one of: ReadOnly, WriteOnly, ReadWrite.
The register size/width could be one of: u8, u16, u32, u64
Examples
Define a simple MMIO register that might only be accessed with it’s raw value
define_mmio_register!(
FOO<ReadWrite<u32>@(0x3F20_0000+0x10)>
);
Define a MMIO register containing a single field at a given offset with 1 bit length.
define_mmio_register!(
FOO<ReadWrite<u32>@(0x3F20_0000)> {
BAR OFFSET(0)
}
);
Define a MMIO register containing several fields with different offsets and bit length
define_mmio_register!(
FOO<ReadWrite<u32>@(0x3F20_0000)> {
BAR OFFSET(0),
BAZ OFFSET(3) BITS(3)
}
);
Define multiple MMIO register at once
define_mmio_register!(
FOO<ReadWrite<u32>@(0x3F20_0000)>,
BAR<ReadOnly<u32>@(0x3F20_0010)> {
BAZ OFFSET(0) BITS(2) [
VAL1 = 0b10
]
}
);
Define a MMIO register where one field has defined specific values to be choosen from when writing to or updating this specific register field
define_mmio_register!(
/// A MMIO Register FOO
/// Defines as Read/Write register
FOO<ReadWrite<u32>@(0x3F20_0000)> {
/// This is a register field BAR
BAR OFFSET(3) BITS(3),
/// This is a register field BAZ.
/// It contains enum like field value definitions
BAZ OFFSET(6) BITS(3) [
/// This is a value of the register field
VAL1 = 0b000,
VAL2 = 0b010
],
BAL OFFSET(9) BITS(2) [
VAL1 = 0b01,
VAL2 = 0b11
]
}
);
fn main() {
// write a specific value for one field of the MMIO register
FOO::Register.write_value(
FOO::BAL::VAL1
);
// combine field values of different fields to update the MMIO register
FOO::Register.write_value(
FOO::BAZ::VAL1 | FOO::BAL::VAL2
);
// write a specific value to a register field that does not provide default/enum values
FOO::Register.write_value(
FOO::BAR::with_value(0b010)
);
}