dt.rs 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. use serde::Deserialize;
  2. use serde_device_tree::{
  3. buildin::{NodeSeq, Reg, StrSeq},
  4. Dtb, DtbPtr,
  5. };
  6. #[derive(Deserialize)]
  7. pub struct Tree<'a> {
  8. pub model: Option<StrSeq<'a>>,
  9. pub chosen: Chosen<'a>,
  10. pub cpus: Cpus<'a>,
  11. pub soc: Soc<'a>,
  12. }
  13. #[derive(Deserialize)]
  14. #[serde(rename_all = "kebab-case")]
  15. pub struct Chosen<'a> {
  16. pub stdout_path: StrSeq<'a>,
  17. }
  18. #[derive(Deserialize)]
  19. #[serde(rename_all = "kebab-case")]
  20. pub struct Cpus<'a> {
  21. pub cpu: NodeSeq<'a>,
  22. }
  23. #[derive(Deserialize, Debug)]
  24. pub struct Cpu<'a> {
  25. #[serde(rename = "riscv,isa-extensions")]
  26. pub isa: Option<StrSeq<'a>>,
  27. pub reg: Reg<'a>,
  28. }
  29. #[derive(Deserialize, Debug)]
  30. pub struct Soc<'a> {
  31. pub serial: Option<NodeSeq<'a>>,
  32. pub test: Option<NodeSeq<'a>>,
  33. pub clint: Option<NodeSeq<'a>>,
  34. }
  35. #[allow(unused)]
  36. #[derive(Deserialize, Debug)]
  37. pub struct Device<'a> {
  38. pub reg: Reg<'a>,
  39. }
  40. pub enum ParseDeviceTreeError {
  41. Format,
  42. }
  43. pub fn parse_device_tree(opaque: usize) -> Result<Dtb, ParseDeviceTreeError> {
  44. let Ok(ptr) = DtbPtr::from_raw(opaque as *mut _) else {
  45. return Err(ParseDeviceTreeError::Format);
  46. };
  47. let dtb = Dtb::from(ptr);
  48. Ok(dtb)
  49. }