macro_rules! register {
(
#[register(offset = $offset:expr, mode = $mode:ident)]
$(#[$attr:meta])*
pub struct $name:ident ($val_type:ty) { $($field_spec:tt)* }
$($tail:tt)+
) => { ... };
(
#[register(offset = $offset:expr, mode = $mode:ident)]
$(#[$attr:meta])*
pub struct $name:ident ($val_type:ty) ;
$($tail:tt)+
) => { ... };
(
#[indexed_register(offset = $base_offset:expr, stride = $stride:expr, count = $count:expr, mode = $mode:ident)]
$(#[$attr:meta])*
pub struct $name:ident ($val_type:ty) { $($field_spec:tt)* }
$($tail:tt)+
) => { ... };
(
#[indexed_register(offset = $base_offset:expr, stride = $stride:expr, count = $count:expr, mode = $mode:ident)]
$(#[$attr:meta])*
pub struct $name:ident ($val_type:ty) ;
$($tail:tt)+
) => { ... };
(
#[register(offset = $offset:expr, mode = RO)]
$(#[$attr:meta])*
pub struct $name:ident ($val_type:ty) { $($field_spec:tt)* }
) => { ... };
(
#[register(offset = $offset:expr, mode = WO)]
$(#[$attr:meta])*
pub struct $name:ident ($val_type:ty) { $($field_spec:tt)* }
) => { ... };
(
#[register(offset = $offset:expr, mode = RW)]
$(#[$attr:meta])*
pub struct $name:ident ($val_type:ty) { $($field_spec:tt)* }
) => { ... };
(
#[register(offset = $offset:expr, mode = RO)]
$(#[$attr:meta])*
pub struct $name:ident ($val_type:ty) ;
) => { ... };
(
#[register(offset = $offset:expr, mode = WO)]
$(#[$attr:meta])*
pub struct $name:ident ($val_type:ty) ;
) => { ... };
(
#[register(offset = $offset:expr, mode = RW)]
$(#[$attr:meta])*
pub struct $name:ident ($val_type:ty) ;
) => { ... };
(
#[indexed_register(offset = $base_offset:expr, stride = $stride:expr, count = $count:expr, mode = RO)]
$(#[$attr:meta])*
pub struct $name:ident ($val_type:ty) { $($field_spec:tt)* }
) => { ... };
(
#[indexed_register(offset = $base_offset:expr, stride = $stride:expr, count = $count:expr, mode = WO)]
$(#[$attr:meta])*
pub struct $name:ident ($val_type:ty) { $($field_spec:tt)* }
) => { ... };
(
#[indexed_register(offset = $base_offset:expr, stride = $stride:expr, count = $count:expr, mode = RW)]
$(#[$attr:meta])*
pub struct $name:ident ($val_type:ty) { $($field_spec:tt)* }
) => { ... };
(
#[indexed_register(offset = $base_offset:expr, stride = $stride:expr, count = $count:expr, mode = RO)]
$(#[$attr:meta])*
pub struct $name:ident ($val_type:ty) ;
) => { ... };
(
#[indexed_register(offset = $base_offset:expr, stride = $stride:expr, count = $count:expr, mode = WO)]
$(#[$attr:meta])*
pub struct $name:ident ($val_type:ty) ;
) => { ... };
(
#[indexed_register(offset = $base_offset:expr, stride = $stride:expr, count = $count:expr, mode = RW)]
$(#[$attr:meta])*
pub struct $name:ident ($val_type:ty) ;
) => { ... };
}Expand description
A macro for defining a Register or IndexedRegister and its bitfields.
This macro generates a bitfield struct that implements the Register or IndexedRegister,
RegisterReadAccess and RegisterWriteAccess traits. The access mode (RO, WO, RW)
determines which of the ReadableRegister/ReadableIndexedRegister and
WritableRegister/WritableIndexedRegister traits are implemented.
Access modes:
RO: Read-Only.WO: Write-Only.RW: Read-Write.
§Examples
register! {
#[register(offset = 0x10, mode = RW)]
pub struct StatusReg(u32) {
pub enabled, set_enabled: 0, 0;
pub error, _: 1, 1;
pub value, set_value: 15, 8;
}
}Full-width register (no bitfields):
register! {
#[register(offset = 0x14, mode = RW)]
pub struct ControlReg(u32);
}Indexed register:
register! {
#[indexed_register(offset = 0x100, stride = 4, count = 16, mode = RO)]
pub struct DataReg(u32) {
pub value, _: 31, 0;
}
}Full-width indexed register:
register! {
#[indexed_register(offset = 0x200, stride = 4, count = 8, mode = RW)]
pub struct ValueReg(u32);
}NOTE: If you use this macro, you must add a dependency on the bitfield crate. (At the time of writing, it isn’t easy to avoid this.)