safe-mmio
The safe-mmio
crate provides types to wrap registers which can be read or written safely.
Can’t read | Read has no side-effects | Read has side-effects | |
---|---|---|---|
Can’t write | ReadPure | ReadOnly | |
Can write | WriteOnly | ReadPureWrite | ReadWrite |
use safe_mmio::fields::{ReadPure, ReadPureWrite, ReadWrite, WriteOnly}; #[repr(C, align(4))] pub struct Registers { dr: ReadWrite<u16>, _reserved0: [u8; 2], rsr: ReadPure<ReceiveStatus>, _reserved1: [u8; 19], fr: ReadPure<Flags>, _reserved2: [u8; 6], ilpr: ReadPureWrite<u8>, _reserved3: [u8; 3], ibrd: ReadPureWrite<u16>, _reserved4: [u8; 2], fbrd: ReadPureWrite<u8>, _reserved5: [u8; 3], lcr_h: ReadPureWrite<u8>, _reserved6: [u8; 3], cr: ReadPureWrite<u16>, _reserved7: [u8; 3], ifls: ReadPureWrite<u8>, _reserved8: [u8; 3], imsc: ReadPureWrite<u16>, _reserved9: [u8; 2], ris: ReadPure<u16>, _reserved10: [u8; 2], mis: ReadPure<u16>, _reserved11: [u8; 2], icr: WriteOnly<u16>, _reserved12: [u8; 2], dmacr: ReadPureWrite<u8>, _reserved13: [u8; 3], }
- Reading
dr
has a side effect: it pops a byte from the receive FIFO. - Reading
rsr
(and other registers) has no side-effects. It is a ‘pure’ read.
- There are a number of different crates providing safe abstractions around MMIO operations; we recommend the
safe-mmio
crate. - The difference between
ReadPure
orReadOnly
(and likewise betweenReadPureWrite
andReadWrite
) is whether reading a register can have side-effects which change the state of the device. E.g. reading the data register pops a byte from the receive FIFO.ReadPure
means that reads have no side-effects, they are purely reading data.