safe-mmio

safe-mmio クレートは、レジスタを安全に読み書きできるようにラップする型を提供します。

読み取り不可読み取りに副作用がない読み取りに副作用がある
書き込み不可ReadPureReadOnly
書き込み可WriteOnlyReadPureWriteReadWrite
// 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],
}
  • dr の読み取りには副作用があります。受信 FIFO から 1 バイト取り出します。
  • rsr(および他のレジスタ)の読み取りには副作用がありません。これは「pure」な読み取りです。
  • MMIO 操作に対する安全な抽象化を提供するクレートはいくつかありますが、safe-mmio クレートを推奨します。
  • ReadPureReadOnly の違い(同様に ReadPureWriteReadWrite の違い)は、レジスタの読み取りにデバイスの状態を変化させる副作用があり得るかどうかです。たとえば、データレジスタを読み取ると受信 FIFO から 1 バイト取り出されます。ReadPure は、読み取りに副作用がなく、純粋にデータを読み取るだけであることを意味します。