Files
RedBear-OS/drivers/hwd/src/backend/devicetree.rs
T
bjorn3 07a2b97f08 Add 'drivers/' from commit '20ffe4d7f4a85b7cc1f59495d7e6e355fed4cb06'
git-subtree-dir: drivers
git-subtree-mainline: e76ecea4ce
git-subtree-split: 20ffe4d7f4
2025-11-29 19:04:04 +01:00

46 lines
1.2 KiB
Rust

use std::{error::Error, fs};
use super::Backend;
pub struct DeviceTreeBackend {
dtb: Vec<u8>,
}
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<Self, Box<dyn Error>> {
let dtb = fs::read("/scheme/kernel.dtb")?;
let dt = fdt::Fdt::new(&dtb).map_err(|err| format!("failed to parse dtb: {}", err))?;
Ok(Self { dtb })
}
fn probe(&mut self) -> Result<(), Box<dyn Error>> {
let dt = fdt::Fdt::new(&self.dtb).map_err(|err| format!("failed to parse dtb: {}", err))?;
let root = dt
.find_node("/")
.ok_or_else(|| format!("failed to find root node"))?;
Self::dump(&root, 0);
Ok(())
}
}