Jelajahi Sumber

feat(node): iter `interrupts-extended` field (#1)

LoGin 11 bulan lalu
induk
melakukan
9862813020
1 mengubah file dengan 24 tambahan dan 0 penghapusan
  1. 24 0
      src/node.rs

+ 24 - 0
src/node.rs

@@ -322,6 +322,30 @@ impl<'b, 'a: 'b> FdtNode<'b, 'a> {
         interrupt
     }
 
+    /// `interrupts-extended` property
+    pub fn interrupts_extended(self) -> Option<impl Iterator<Item = usize> + 'a> {
+        let sizes = self.interrupt_cells()?;
+
+        let mut interrupt = None;
+        for prop in self.properties() {
+            if prop.name == "interrupts-extended" {
+                let mut stream = FdtData::new(prop.value);
+                interrupt = Some(core::iter::from_fn(move || {
+                    let interrupt = match sizes {
+                        1 => stream.u32()?.get() as usize,
+                        2 => stream.u64()?.get() as usize,
+                        _ => return None,
+                    };
+
+                    Some(interrupt)
+                }));
+                break;
+            }
+        }
+
+        interrupt
+    }
+
     pub(crate) fn parent_cell_sizes(self) -> CellSizes {
         let mut cell_sizes = CellSizes::default();