A Flattened Device Tree parser for embedded no-std environments
Add this to your Cargo.toml
:
[dependencies.fdt-rs]
version = "0.4"
and this to your crate root:
extern crate fdt_rs;
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
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.