diff --git a/hwd/src/backend/devicetree.rs b/hwd/src/backend/devicetree.rs index 9159b9e631..d9ff5e2ca6 100644 --- a/hwd/src/backend/devicetree.rs +++ b/hwd/src/backend/devicetree.rs @@ -6,6 +6,27 @@ pub struct DeviceTreeBackend { dtb: Vec, } +impl DeviceTreeBackend { + fn dump(node: &fdt::node::FdtNode<'_, '_>, level: usize) { + let mut line = String::new(); + for _ in 0..level { + line.push_str(" "); + } + line.push_str(node.name); + if let Some(compatible) = node.compatible() { + line.push_str(":"); + for id in compatible.all() { + line.push_str(" "); + line.push_str(id); + } + } + log::debug!("{}", line); + for child in node.children() { + Self::dump(&child, level + 1); + } + } +} + impl Backend for DeviceTreeBackend { fn new() -> Result> { let dtb = fs::read("/scheme/kernel.dtb")?; @@ -15,7 +36,8 @@ impl Backend for DeviceTreeBackend { fn probe(&mut self) -> Result<(), Box> { let dt = fdt::Fdt::new(&self.dtb).map_err(|err| format!("failed to parse dtb: {}", err))?; - log::info!("TODO: handle driver spawning from devicetree backend"); + let root = dt.find_node("/").ok_or_else(|| format!("failed to find root node"))?; + Self::dump(&root, 0); Ok(()) } }