2个版本
0.1.1 | 2020年8月23日 |
---|---|
0.1.0 | 2020年8月23日 |
#121 in #maps
20KB
297 行
lvbitfile2rust
lvbitfile2rust从lvbitx文件生成静态寄存器映射。
从命令行调用
cargo install lvbitfile2rust
lvbitfile2rust-cli /boot/user.lvbitx | rustfmt > rio.rs
作为宏调用
mod rio {
use lvbitfile2rust_macros::lvbitfile2rust;
lvbitfile2rust!("/boot/user.lvbitx");
}
生成的代码
lvbitfile2rust生成的代码与svd2rust生成的代码接口相似。生成的代码包含一个名为Peripherals
的结构体和一个名为take
的关联函数。调用take
将尝试打开一个FPGA会话并返回一个Peripherals
实例。该Peripherals
实例包含由输入位文件描述的每个寄存器的字段。这些字段包含对应每个寄存器的结构体实例,具有read
和可能的write
方法。实际上,接口使用起来相当直观
use ni_fpga::fxp::UnsignedFXP;
mod rio {
use lvbitfile2rust_macros::lvbitfile2rust;
lvbitfile2rust!("/boot/user.lvbitx");
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Turn PWM on if the RSL is on!
// My scope tells me the RSL blinks at 5Hz in teleop mode!
let peripherals = rio::Peripherals::take("RIO0")?;
loop {
let leds = peripherals.LEDs.read()?;
peripherals.PWM_Hdr0.write(&{
if leds.RSL {
UnsignedFXP::max_value()
} else {
UnsignedFXP::min_value()
}
})?;
}
}
如果输入位文件使用Clusters或Enums,生成的代码将依赖于ni-fpga和ni-fpga-macros。
依赖项
~1.5MB
~41K SLoC