1 个不稳定版本
0.1.0 | 2022年11月19日 |
---|
#12 in #drivers
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