#register #bit-fields #memory-map #driver #memory-mapping #bitfields

无 std register-interface

寄存器接口、位域和内存映射库

1 个不稳定版本

0.1.0 2022年11月19日

#12 in #drivers

MIT 许可证

6KB
104 代码行

此软件包添加了两个 proc 宏

  • field:允许表示寄存器的位域。
  • register:允许表示寄存器映射上的寄存器。

使用方法

要表示新的寄存器类型,定义一个新的结构体并注释其不同的位域部分

// (name_of_field, position from, position to)
#[field(data, 0, 7)]
#[field(full, 31, 31)]
pub struct TxData {
    addr: *mut usize,
}

要表示设备寄存器映射,定义一个新的结构体并注释其不同的寄存器。

// (name of register, type of register, offset from base address)
#[register(txdata, TxData, 0x0)]
#[register(rxdata, RxData, 0x4)]
#[register(txctrl, TxCtrl, 0x08)]
#[register(rxctrl, RxCtrl, 0x0C)]
#[register(ie, InterruptRegister, 0x10)]
#[register(ip, InterruptRegister, 0x14)]
#[register(div, Div, 0x18)]
pub struct Uart {
    addr: *mut usize,
}

然后您可以通过以下方式访问字段

let mut uart = Uart::new(&mut reg_ptr);
let data = uart.rxdata.data();
uart.rxdata().set_data(data + 1);

开销

读取和写入操作都会执行两次位运算,即掩码和位移操作。

依赖项

~1.5MB
~35K SLoC