1use core::ffi::CStr;
2
3use alloc::{
4 string::{String, ToString},
5 vec::Vec,
6};
7
8use fdt_raw::data::{Bytes, Reader, StrIter, U32Iter};
9pub use fdt_raw::{Phandle, RegInfo, Status};
11
12#[derive(Clone)]
13pub struct Property {
14 pub name: String,
15 pub data: Vec<u8>,
16}
17
18impl Property {
19 pub fn new(name: &str, data: Vec<u8>) -> Self {
20 Self {
21 name: name.to_string(),
22 data,
23 }
24 }
25
26 pub fn name(&self) -> &str {
27 &self.name
28 }
29
30 pub fn get_u32(&self) -> Option<u32> {
31 if self.data.len() != 4 {
32 return None;
33 }
34 Some(u32::from_be_bytes([
35 self.data[0],
36 self.data[1],
37 self.data[2],
38 self.data[3],
39 ]))
40 }
41
42 pub fn set_u32_ls(&mut self, values: &[u32]) {
43 self.data.clear();
44 for &value in values {
45 self.data.extend_from_slice(&value.to_be_bytes());
46 }
47 }
48
49 pub fn get_u32_iter(&self) -> U32Iter<'_> {
50 Bytes::new(&self.data).as_u32_iter()
51 }
52
53 pub fn get_u64(&self) -> Option<u64> {
54 if self.data.len() != 8 {
55 return None;
56 }
57 Some(u64::from_be_bytes([
58 self.data[0],
59 self.data[1],
60 self.data[2],
61 self.data[3],
62 self.data[4],
63 self.data[5],
64 self.data[6],
65 self.data[7],
66 ]))
67 }
68
69 pub fn set_u64(&mut self, value: u64) {
70 self.data = value.to_be_bytes().to_vec();
71 }
72
73 pub fn as_str(&self) -> Option<&str> {
74 CStr::from_bytes_with_nul(&self.data)
75 .ok()
76 .and_then(|cstr| cstr.to_str().ok())
77 }
78
79 pub fn set_string(&mut self, value: &str) {
80 let mut bytes = value.as_bytes().to_vec();
81 bytes.push(0); self.data = bytes;
83 }
84
85 pub fn as_str_iter(&self) -> StrIter<'_> {
86 Bytes::new(&self.data).as_str_iter()
87 }
88
89 pub fn set_string_ls(&mut self, values: &[&str]) {
90 self.data.clear();
91 for &value in values {
92 self.data.extend_from_slice(value.as_bytes());
93 self.data.push(0); }
95 }
96
97 pub fn as_reader(&self) -> Reader<'_> {
98 Bytes::new(&self.data).reader()
99 }
100}
101
102impl From<&fdt_raw::Property<'_>> for Property {
103 fn from(value: &fdt_raw::Property<'_>) -> Self {
104 Self {
105 name: value.name().to_string(),
106 data: value.as_slice().to_vec(),
107 }
108 }
109}
110
111#[derive(Debug, Clone, Copy, PartialEq, Eq)]
113pub struct RangesEntry {
114 pub child_bus_address: u64,
116 pub parent_bus_address: u64,
118 pub length: u64,
120}