dtb_walker/property/
reg.rs

1use crate::StructureBlock;
2use core::{fmt, ops::Range};
3
4/// `reg` 属性。
5#[derive(Clone)]
6pub struct Reg<'a> {
7    pub(crate) buf: &'a [StructureBlock],
8    pub(crate) cfg: RegCfg,
9}
10
11impl Iterator for Reg<'_> {
12    type Item = Range<usize>;
13
14    fn next(&mut self) -> Option<Self::Item> {
15        if self.buf.is_empty() {
16            return None;
17        }
18        let RegCfg {
19            address_cells,
20            size_cells,
21        } = self.cfg;
22        let (base_buf, tail) = self.buf.split_at(address_cells as _);
23        let (size_buf, tail) = tail.split_at(size_cells as _);
24        self.buf = tail;
25
26        let base = base_buf
27            .iter()
28            .fold(0usize, |acc, it| (acc << 32) + it.into_u32() as usize);
29        let size = size_buf
30            .iter()
31            .fold(0usize, |acc, it| (acc << 32) + it.into_u32() as usize);
32        Some(base..base + size)
33    }
34}
35
36impl fmt::Debug for Reg<'_> {
37    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
38        let mut iter = self.clone();
39        write!(f, "[")?;
40        if let Some(first) = iter.next() {
41            first.fmt(f)?;
42            for s in iter {
43                write!(f, ", ")?;
44                s.fmt(f)?;
45            }
46        }
47        write!(f, "]")
48    }
49}
50
51#[derive(Clone, Copy)]
52pub(crate) struct RegCfg {
53    pub address_cells: u32,
54    pub size_cells: u32,
55}
56
57impl RegCfg {
58    pub const DEFAULT: Self = Self {
59        address_cells: 2,
60        size_cells: 1,
61    };
62
63    #[inline]
64    pub(crate) fn item_size(&self) -> usize {
65        (self.address_cells + self.size_cells) as _
66    }
67}