1use dtb_walker::{utils::indent, Dtb, DtbObj, HeaderError, WalkOperation};
2
3const DEVICE_TREE: &[u8] = include_bytes!("qemu-virt.dtb");
4const INDENT_WIDTH: usize = 4;
5
6fn main() {
7 let mut aligned = vec![0usize; DEVICE_TREE.len() / core::mem::size_of::<usize>()];
8 unsafe {
9 aligned
10 .as_mut_ptr()
11 .copy_from_nonoverlapping(DEVICE_TREE.as_ptr() as _, aligned.len());
12 }
13
14 let dtb = unsafe {
15 Dtb::from_raw_parts_filtered(aligned.as_ptr() as _, |e| {
16 matches!(
17 e,
18 HeaderError::Misaligned(4) | HeaderError::LastCompVersion(16)
19 )
20 })
21 }
22 .unwrap();
23 dtb.walk(|path, obj| match obj {
24 DtbObj::SubNode { name } => {
25 println!("{}{path}/{}", indent(path.level(), INDENT_WIDTH), unsafe {
26 core::str::from_utf8_unchecked(name)
27 });
28 WalkOperation::StepInto
29 }
30 DtbObj::Property(prop) => {
31 let indent = indent(path.level(), INDENT_WIDTH);
32 println!("{indent}{prop:?}");
33 WalkOperation::StepOver
34 }
35 });
36 println!("ok");
37}