[][src]Macro ruspiro_register::define_mmio_register

macro_rules! define_mmio_register {
    ($($name:ident<$access:ident<$t:ty>@($addr:expr)> $(
        { $(
                $field:ident OFFSET($offset:literal) $(BITS($bits:literal))?
                $([$($enum:ident : $value:expr),*])?
        ),* }
    )?),*) => { ... };
}

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!(
    FOO<ReadWrite<u32>@(0x3F20_0000)> {
        BAR OFFSET(3) BITS(3),
        BAZ OFFSET(6) BITS(3) [
            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 specif value to a register field that does not provide default/enum values
    FOO::Register.write_value(
        FOO::BAR::with_value(0b010)
    );
}