fdt_edit/prop/
mod.rs

1use core::ffi::CStr;
2
3use alloc::{
4    string::{String, ToString},
5    vec::Vec,
6};
7
8use fdt_raw::data::{Bytes, Reader, StrIter, U32Iter};
9// Re-export from fdt_raw
10pub 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); // Null-terminate
82        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); // Null-terminate each string
94        }
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/// Ranges 条目信息
112#[derive(Debug, Clone, Copy, PartialEq, Eq)]
113pub struct RangesEntry {
114    /// 子总线地址
115    pub child_bus_address: u64,
116    /// 父总线地址
117    pub parent_bus_address: u64,
118    /// 区域长度
119    pub length: u64,
120}