macro_rules! define_mmio_register {
($(#[$reg_attr:meta])*
$reg_name:ident: $num_ty:ty { $(
$(#[$field_attr:meta])*
$perm:ident $name:ident: $from:literal $( .. $to:literal =
$(#[$kind_attr:meta])*
$kind_type:ident $kind_name:ident [
$(
$(#[$kind_variant_attr:meta])*
$kind_variant:ident = $kind_variant_val:expr
),*$(,)?
]
)?
),*$(,)?
}) => { ... };
(@internal, $num_ty:ty, rw $name:ident: $from:literal .. $to:literal = flags $kind_name:ident [
$($kind_variant:ident = $kind_variant_val:expr),*
]) => { ... };
(@internal, $num_ty:ty, r $name:ident: $from:literal .. $to:literal = flags $kind_name:ident [
$($kind_variant:ident = $kind_variant_val:expr),*
]) => { ... };
(@internal, $num_ty:ty, w $name:ident: $from:literal .. $to:literal = flags $kind_name:ident [
$($kind_variant:ident = $kind_variant_val:expr),*
]) => { ... };
(@internal, $num_ty:ty, rw $name:ident: $from:literal .. $to:literal = enum $kind_name:ident [
$($kind_variant:ident = $kind_variant_val:expr),*
]) => { ... };
(@internal, $num_ty:ty, r $name:ident: $from:literal .. $to:literal = enum $kind_name:ident [
$($kind_variant:ident = $kind_variant_val:expr),*
]) => { ... };
(@internal, $num_ty:ty, w $name:ident: $from:literal .. $to:literal = enum $kind_name:ident [
$($kind_variant:ident = $kind_variant_val:expr),*
]) => { ... };
(@internal, $num_ty:ty, $perm:ident $name:ident: $bit:literal) => { ... };
(@internal_bit, $num_ty:ty, rw $name:ident: $bit:literal) => { ... };
(@internal_bit, $num_ty:ty, r $name:ident: $bit:literal) => { ... };
(@internal_bit, $num_ty:ty, w $name:ident: $bit:literal) => { ... };
}
Define abstractions for a single register inside an MMIO block.
The macro looks almost the same as define_cpu_register
,
and all the field types and properties of the CPU register version apply here too.
Note that the generated struct for this register doesn't has the same layout
as the given number type, and should always be constructed using the new
method.
rumio::define_mmio_register! {
Reg: u16 {
rw MODE: 0..1 = enum Mode [
A = 0b00,
B = 0b01,
C = 0b10,
D = 0b11,
],
r FOO: 2,
rw BAR: 3,
rw BAZ: 4,
rw FLAGS: 5..8 = flags Flags [
A = 0b0001,
B = 0b0010,
C = 0b0100,
D = 0b1000,
],
}
}
To explore the whole generated api, take a look at the
example_generated
module on docs.rs