fdt-edit 0.2.3

A high-level library for creating, editing, and encoding Flattened Device Tree (FDT) structures
Documentation
use dtb_file::*;
use fdt_edit::{Fdt, NodeType, Phandle};

fn load_orangepi5plus() -> Fdt {
    let raw_data = fdt_orangepi_5plus();
    Fdt::from_bytes(&raw_data).unwrap()
}

#[test]
fn test_interrupt_controller_detection_and_properties() {
    let fdt = load_orangepi5plus();

    let root_irq = fdt.get_by_phandle(Phandle::from(0x01)).unwrap();
    let NodeType::InterruptController(intc) = root_irq else {
        panic!("phandle 0x01 should resolve to an interrupt controller");
    };

    assert!(intc.is_interrupt_controller());
    assert_eq!(intc.path(), "/interrupt-controller@fe600000");
    assert_eq!(intc.interrupt_cells(), Some(3));
    assert!(intc.compatibles().iter().any(|c| c.contains("gic")));
}

#[test]
fn test_interrupts_property_parsing() {
    let fdt = load_orangepi5plus();
    let gpu = fdt.get_by_path("/gpu@fb000000").unwrap();

    assert_eq!(gpu.interrupt_parent(), Some(Phandle::from(0x01)));

    let interrupts = gpu.interrupts();
    assert_eq!(interrupts.len(), 3);

    assert_eq!(interrupts[0].interrupt_parent, Phandle::from(0x01));
    assert_eq!(interrupts[0].cells, 3);
    assert_eq!(interrupts[0].specifier, vec![0x00, 0x5e, 0x04]);
    assert_eq!(interrupts[0].name.as_deref(), Some("GPU"));

    assert_eq!(interrupts[1].specifier, vec![0x00, 0x5d, 0x04]);
    assert_eq!(interrupts[1].name.as_deref(), Some("MMU"));

    assert_eq!(interrupts[2].specifier, vec![0x00, 0x5c, 0x04]);
    assert_eq!(interrupts[2].name.as_deref(), Some("JOB"));
}

#[test]
fn test_interrupts_inherit_parent() {
    let fdt = load_orangepi5plus();
    let uart = fdt.get_by_path("/serial@fd890000").unwrap();

    let interrupts = uart.interrupts();
    assert_eq!(uart.as_node().interrupt_parent(), None);
    assert_eq!(uart.interrupt_parent(), Some(Phandle::from(0x01)));
    assert_eq!(interrupts.len(), 1);
    assert_eq!(interrupts[0].interrupt_parent, Phandle::from(0x01));
    assert_eq!(interrupts[0].specifier, vec![0x00, 0x14b, 0x04]);
    assert_eq!(interrupts[0].name, None);
}