#devices #tree #tree-node #fdt #dtb #no-std

no-std fdt-rs

嵌入式无std环境的平坦设备树解析器

9个版本

0.4.5 2024年2月25日
0.4.4 2024年2月24日
0.4.3 2021年7月6日
0.4.2 2020年8月15日
0.1.1 2020年5月28日

#248 in 嵌入式开发

Download history 508/week @ 2024-03-13 723/week @ 2024-03-20 494/week @ 2024-03-27 399/week @ 2024-04-03 421/week @ 2024-04-10 276/week @ 2024-04-17 430/week @ 2024-04-24 288/week @ 2024-05-01 191/week @ 2024-05-08 167/week @ 2024-05-15 145/week @ 2024-05-22 349/week @ 2024-05-29 235/week @ 2024-06-05 197/week @ 2024-06-12 469/week @ 2024-06-19 1134/week @ 2024-06-26

2,115 每月下载量
用于 fdtdump

MIT 许可证

77KB
1.5K SLoC

fdt-rs

crates.io downloads docs.rs master coveralls.io

嵌入式无std环境的平坦设备树解析器

使用方法

将以下内容添加到您的 Cargo.toml

[dependencies.fdt-rs]
version = "0.4"

并将以下内容添加到您的crate根目录

extern crate fdt_rs;

特性

此crate可以在不使用标准库的情况下使用(#![no_std])通过禁用默认的std特性。在Cargo.toml中使用此特性

[dependencies.fdt-rs]
version = "0.4"
default-features = false

示例

以下示例将一个平坦设备树存储在内存中,将该设备树解析为一个 fdt_rs::DevTree 对象,搜索设备树中的"ns16550a"兼容节点,并在找到的情况下打印每个节点的名称。

extern crate fdt_rs;
use fdt_rs::prelude::*;
use fdt_rs::base::*;

// Place a device tree image into the rust binary and
// align it to a 32-byte boundary by using a wrapper struct.
#[repr(align(4))] struct _Wrapper<T>(T);
pub const FDT: &[u8] = &_Wrapper(*include_bytes!("../tests/riscv64-virt.dtb")).0;

fn main() {
    // Initialize the devtree using an &[u8] array.
    let devtree = unsafe {

        // Get the actual size of the device tree after reading its header.
        let size = DevTree::read_totalsize(FDT).unwrap();
        let buf = &FDT[..size];

        // Create the device tree handle
        DevTree::new(buf).unwrap()
    };

    // Iterate through all "ns16550a" compatible nodes within the device tree.
    // If found, print the name of each node (including unit address).
    let mut node_iter = devtree.compatible_nodes("ns16550a");
    while let Some(node) = node_iter.next().unwrap() {
        println!("{}", node.name().unwrap());
    }
}

还可以查看 fdtdump 的示例实现,该实现使用此库。

依赖项

~2MB
~42K SLoC