fdt_raw/node/prop/
reg.rs

1//! Reg 属性相关类型
2
3use crate::data::Reader;
4
5/// Reg 条目信息
6#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7pub struct RegInfo {
8    /// 地址
9    pub address: u64,
10    /// 区域大小
11    pub size: Option<u64>,
12}
13
14impl RegInfo {
15    /// 创建新的 RegInfo
16    pub fn new(address: u64, size: Option<u64>) -> Self {
17        Self { address, size }
18    }
19}
20
21/// Reg 迭代器
22#[derive(Clone)]
23pub struct RegIter<'a> {
24    reader: Reader<'a>,
25    address_cells: u8,
26    size_cells: u8,
27}
28
29impl<'a> RegIter<'a> {
30    pub(crate) fn new(reader: Reader<'a>, address_cells: u8, size_cells: u8) -> RegIter<'a> {
31        RegIter {
32            reader,
33            address_cells,
34            size_cells,
35        }
36    }
37}
38
39impl Iterator for RegIter<'_> {
40    type Item = RegInfo;
41
42    fn next(&mut self) -> Option<Self::Item> {
43        let address;
44        let size;
45        if self.address_cells == 1 {
46            address = self.reader.read_u32().map(|addr| addr as u64)?;
47        } else if self.address_cells == 2 {
48            address = self.reader.read_u64()?;
49        } else {
50            return None;
51        }
52        if self.size_cells == 0 {
53            size = None;
54        } else if self.size_cells == 1 {
55            size = self.reader.read_u32().map(|s| s as u64);
56        } else if self.size_cells == 2 {
57            size = self.reader.read_u64();
58        } else {
59            // 不支持的 size_cells
60            return None;
61        }
62
63        Some(RegInfo::new(address, size))
64    }
65}