use serde::Deserialize; use serde_device_tree::{ buildin::{NodeSeq, Reg, StrSeq}, Dtb, DtbPtr, }; #[derive(Deserialize)] pub struct Tree<'a> { pub model: Option>, pub chosen: Chosen<'a>, pub cpus: Cpus<'a>, pub soc: Soc<'a>, } #[derive(Deserialize)] #[serde(rename_all = "kebab-case")] pub struct Chosen<'a> { pub stdout_path: StrSeq<'a>, } #[derive(Deserialize)] #[serde(rename_all = "kebab-case")] pub struct Cpus<'a> { pub cpu: NodeSeq<'a>, } #[derive(Deserialize, Debug)] pub struct Cpu<'a> { #[serde(rename = "riscv,isa-extensions")] pub isa: Option>, pub reg: Reg<'a>, } #[derive(Deserialize, Debug)] pub struct Soc<'a> { pub serial: Option>, pub test: Option>, pub clint: Option>, } #[allow(unused)] #[derive(Deserialize, Debug)] pub struct Device<'a> { pub reg: Reg<'a>, } pub enum ParseDeviceTreeError { Format, } pub fn parse_device_tree(opaque: usize) -> Result { let Ok(ptr) = DtbPtr::from_raw(opaque as *mut _) else { return Err(ParseDeviceTreeError::Format); }; let dtb = Dtb::from(ptr); Ok(dtb) }