Skip to main content

register

Macro register 

Source
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.)