safe-mmio
The safe-mmio crate provides types to wrap registers that 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 |
// Copyright 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0
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
drhas 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-mmiocrate. - The difference between
ReadPureorReadOnly(and likewise betweenReadPureWriteandReadWrite) is whether reading a register can have side-effects that change the state of the device, e.g., reading the data register pops a byte from the receive FIFO.ReadPuremeans that reads have no side-effects, they are purely reading data.