#embedded-devices #devices #tree #tree-node #fdt #dtb

no-std fdt-rs

A flattened device tree parser for embedded no-std environments

9 releases

0.4.5 Feb 25, 2024
0.4.4 Feb 24, 2024
0.4.3 Jul 6, 2021
0.4.2 Aug 15, 2020
0.1.1 May 28, 2020

#706 in Embedded development

Download history 664/week @ 2024-10-26 510/week @ 2024-11-02 621/week @ 2024-11-09 727/week @ 2024-11-16 535/week @ 2024-11-23 495/week @ 2024-11-30 621/week @ 2024-12-07 567/week @ 2024-12-14 135/week @ 2024-12-21 125/week @ 2024-12-28 571/week @ 2025-01-04 684/week @ 2025-01-11 663/week @ 2025-01-18 810/week @ 2025-01-25 1028/week @ 2025-02-01 1443/week @ 2025-02-08

4,015 downloads per month
Used in fdtdump

MIT license

77KB
1.5K SLoC

fdt-rs

crates.io downloads docs.rs master coveralls.io

A Flattened Device Tree parser for embedded no-std environments

Usage

Add this to your Cargo.toml:

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

and this to your crate root:

extern crate fdt_rs;

Features

This crate can be used without the standard library (#![no_std]) by disabling the default std feature. Use this in Cargo.toml:

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

Example

The following example stashes a flattened device tree in memory, parses that device tree into a fdt_rs::DevTree object, searches the device tree for "ns16550a" compatible nodes, and (if found) prints each nodes' name.

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());
    }
}

Also check out fdtdump for an example implementation of the fdtdump Device Tree utility using this library.

Dependencies

~2MB
~44K SLoC