Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
c333fc4
feat: 添加 PCI 相关结构体和方法,增强属性处理功能
ZR233 Dec 4, 2025
770b434
Implement new property types and refactor existing property handling
ZR233 Dec 4, 2025
4a16200
feat: 添加 FdtContext 结构体及相关方法,优化节点管理和路径查找功能
ZR233 Dec 4, 2025
4d0f9f3
feat: 添加路径管理功能,优化节点查找方法,更新测试用例
ZR233 Dec 4, 2025
9adcab3
feat: 重构属性处理,优化属性类型和节点管理,删除冗余代码
ZR233 Dec 4, 2025
27ed75d
feat: 添加 PCI 相关功能,优化节点处理,增加设备类型和兼容性方法,新增测试用例
ZR233 Dec 4, 2025
3e984d2
feat: 优化 Fdt 结构体方法,添加节点查找功能,更新 PCI 相关测试用例
ZR233 Dec 4, 2025
520f0aa
feat: 添加示例代码,展示 all_nodes 函数的使用,优化节点查找测试用例
ZR233 Dec 4, 2025
bd6d7fe
refactor: 修改子节点收集方法调用,使用结构体名调用静态方法
ZR233 Dec 5, 2025
23ed0fb
feat: 删除不再需要的示例代码和测试文件,优化代码结构
ZR233 Dec 5, 2025
14d6c14
refactor: 移除不必要的 ToString 导入,简化 ctx.rs 和 fdt.rs 文件
ZR233 Dec 5, 2025
6d2ed28
feat: 优化 all_nodes 函数,返回深度优先迭代器并更新示例测试用例
ZR233 Dec 5, 2025
37787f5
feat: 添加节点引用结构体 NodeRef 和 NodeMut,优化节点处理逻辑
ZR233 Dec 5, 2025
84e5eb5
feat: 添加 reg 方法到 NodeRef 和 NodeMut 结构体,优化地址转换逻辑;修改 RegFixed 结构体以使用非可选…
ZR233 Dec 5, 2025
c92c564
feat: 添加 parse_ranges 函数以解析节点的 ranges 属性,优化子节点地址转换逻辑
ZR233 Dec 5, 2025
4b00e2f
refactor: 重命名 NodeRef 和 NodeMut 结构体中的 context 字段为 ctx,简化代码
ZR233 Dec 5, 2025
df3d86d
feat: 添加 child_interrupts 方法到 NodePci 结构体,并增加相应的单元测试
ZR233 Dec 5, 2025
facb1ad
feat: 更新 FdtContext 结构体,添加新的方法以支持父节点引用和地址转换逻辑;修改 NodeRef 和 NodeMut 结构…
ZR233 Dec 5, 2025
86c9815
feat: 更新 FdtContext 结构体,添加 phandle 映射功能;在 Fdt 和 NodePci 中实现相关方法以支持中断映射
ZR233 Dec 5, 2025
2f3c477
refactor: 移除 FdtContext 结构体的默认实现,使用派生宏简化代码;优化 NodeRef 的导入
ZR233 Dec 5, 2025
1529129
feat: 实现 FDT 编码功能,重构相关结构和方法以支持序列化为二进制格式
ZR233 Dec 6, 2025
f99d9dc
fix: 修复注释格式并清理代码,移除多余空行
ZR233 Dec 6, 2025
075db7d
refactor: 移除 EncodeContext 结构体,更新相关方法以使用 FdtContext 进行节点编码
ZR233 Dec 6, 2025
440dda0
refactor: 优化 NodePci 中的地址解析逻辑,简化代码结构;移除 NodeMut 中未使用的构造函数
ZR233 Dec 6, 2025
7ed38f6
refactor: 移除 Fdt 中的 remove_alias_entry 方法,简化代码结构
ZR233 Dec 6, 2025
b38bfea
refactor: 优化 FdtContext 中 push_parent 方法的路径更新逻辑
ZR233 Dec 6, 2025
674df03
refactor: 优化 NodePci 中的地址处理逻辑,使用迭代器简化代码结构
ZR233 Dec 6, 2025
379ab6b
feat: 添加 DTS 格式化显示模块,支持将 FDT 结构格式化为 DTS 源文件格式
ZR233 Dec 6, 2025
6a122fc
refactor: 修正路径解析,确保在 resolve_alias 和 aliases 方法中使用正确的路径前缀;添加 remove_n…
ZR233 Dec 6, 2025
b6132f8
refactor: 重构路径遍历逻辑,使用 PathTraverser 和 PathTraverserMut 简化 find_by_pat…
ZR233 Dec 6, 2025
f68b4ca
feat: 添加 Chosen 和 Memory 节点结构,支持节点属性的查找和迭代
ZR233 Dec 6, 2025
49a45c6
feat: 添加 Chosen 和 Memory 节点结构,支持节点类型的识别和转换
ZR233 Dec 6, 2025
b392a70
feat: 添加时钟和中断控制器节点结构,支持节点类型的识别和属性访问
ZR233 Dec 6, 2025
fd2fc2e
feat: 增强固定时钟测试,添加频率验证和信息打印
ZR233 Dec 6, 2025
20a507c
feat: 添加 NodeClockRef 结构,支持带上下文的时钟引用解析
ZR233 Dec 6, 2025
3b43bf8
Refactor property handling in FDT
ZR233 Dec 6, 2025
d2946a9
feat: 更新属性处理,优化 reg 数据访问和增加新属性方法
ZR233 Dec 6, 2025
3c2eabf
feat: 移除不必要的上下文信息,简化属性迭代器和 reg 属性结构
ZR233 Dec 6, 2025
d3640bc
fix: 修复 reg 属性处理逻辑,简化条件判断
ZR233 Dec 6, 2025
dea356b
fix: 修复 RegIter 迭代器中 address 变量的初始化方式
ZR233 Dec 6, 2025
1fa4c7b
refactor: 优化 FDT 显示和调试测试,简化属性验证逻辑
ZR233 Dec 6, 2025
f356f8f
refactor: 移除未使用的 write 模块,简化代码结构
ZR233 Dec 6, 2025
9f18a72
refactor: 重命名 Node::from 方法为 Node::from_raw,简化节点创建逻辑并移除不必要的上下文引用
ZR233 Dec 6, 2025
35053fa
refactor: 重构 NodeClock、NodeInterruptController 和 NodePci 的构造函数,添加 try…
ZR233 Dec 6, 2025
eeac0e7
feat: 添加 clocks 属性格式化,增强内存节点和中断控制器的处理逻辑
ZR233 Dec 6, 2025
277a865
Refactor FDT node handling and property management
ZR233 Dec 6, 2025
2b05c1a
refactor: 优化节点迭代器和可变节点引用的构造逻辑,简化代码结构
ZR233 Dec 6, 2025
616ae44
refactor: 重构上下文管理,移除当前路径字段并添加路径计算方法
ZR233 Dec 7, 2025
8ee112f
refactor: 重构上下文管理,合并父节点压入和弹出逻辑,简化节点迭代器实现
ZR233 Dec 7, 2025
26bdc3a
refactor: 重构 NodeIterMut 迭代器实现,优化节点遍历逻辑,支持子节点迭代
ZR233 Dec 7, 2025
7134103
test: 添加可变节点迭代器测试,验证节点遍历和路径输出
ZR233 Dec 7, 2025
451037a
refactor: 合并节点引用生成器逻辑,简化节点迭代器实现
ZR233 Dec 7, 2025
5d9c9d8
feat: 添加 FDT 编码模块,支持将 Fdt 结构序列化为 DTB 二进制格式
ZR233 Dec 7, 2025
40a4c97
refactor: 优化节点属性管理,使用索引缓存提高查找效率
ZR233 Dec 7, 2025
d871dde
refactor(test): update test methods to use new Node API
ZR233 Dec 7, 2025
21b2636
feat: 添加 regs 方法以支持获取节点寄存器信息,并优化 RegIter 迭代器逻辑
ZR233 Dec 7, 2025
fc4ec51
feat: 添加 set_regs 方法以支持根据父节点的 ranges 转换 CPU 地址为 bus 地址,并更新 regs 方法返回类型
ZR233 Dec 7, 2025
5056a20
feat: 添加 PCI 节点支持,扩展 NodeRef 枚举并实现相关方法
ZR233 Dec 7, 2025
a65b3fa
refactor: 移除不必要的 phandle 映射设置,优化上下文管理逻辑;更新 PCI 节点处理以支持更高效的地址和 IRQ 处理;…
ZR233 Dec 7, 2025
310b1ac
refactor: 优化 PCI 地址解析逻辑,使用父节点的 #address-cells 和当前节点的 #size-cells 进行解析
ZR233 Dec 7, 2025
7c2f970
feat: 添加时钟节点支持,扩展 NodeRef 和 NodeKind 枚举以支持时钟类型,更新相关逻辑和测试用例
ZR233 Dec 7, 2025
b100731
feat: 添加中断控制器和内存节点支持,扩展 NodeRef 和 NodeKind 枚举,更新相关逻辑和测试用例
ZR233 Dec 7, 2025
d88ed0b
feat: 添加 FDT 深度调试和显示功能,扩展节点格式化逻辑,增加相关测试用例
ZR233 Dec 7, 2025
c1a85ee
refactor: 优化 NodeDisplay 和 NodeRefDisplay 的格式化逻辑,清理冗余代码
ZR233 Dec 7, 2025
9114257
refactor: 优化代码格式,清理冗余和不必要的换行
ZR233 Dec 7, 2025
427474d
feat: 更新 Cargo.toml 和 README.md,添加元数据和文档链接;在 Bytes 结构中添加 is_empty 方法
ZR233 Dec 7, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 61 additions & 0 deletions example_all_nodes.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
// 示例:使用 all_nodes 函数
extern crate alloc;
use alloc::{string::String, vec::Vec};

use fdt_edit::{Fdt, Node, NodeRef};

fn main() {
// 创建一个示例 FDT
let mut fdt = Fdt::new();

// 添加一些示例节点
{
let root = &mut fdt.root;
let mut soc = Node::new_raw("soc");
let mut uart = Node::new_raw("uart@4000");
let mut gpio = Node::new_raw("gpio@5000");
let mut led = Node::new_raw("led");

// 设置属性
uart.add_property(fdt_edit::Property::new_str("compatible", "vendor,uart"));
gpio.add_property(fdt_edit::Property::new_str("compatible", "vendor,gpio"));
led.add_property(fdt_edit::Property::new_str("compatible", "vendor,led"));

// 构建树结构
gpio.add_child(led);
soc.add_child(uart);
soc.add_child(gpio);
root.add_child(soc);
}

// 使用 all_nodes 获取所有节点
let all_nodes: Vec<NodeRef> = fdt.all_nodes().collect();

println!("FDT 中所有节点 (深度优先遍历):");
for (i, node_ref) in all_nodes.iter().enumerate() {
println!(
"{}: 节点 '{}', 路径: '{}', 深度: {}",
i + 1,
node_ref.node.name(),
node_ref.context.current_path,
node_ref.context.depth
);

// 显示节点的 compatible 属性
let compatibles: Vec<&str> = node_ref.compatibles();
if !compatibles.is_empty() {
println!(" Compatible: {:?}", compatibles);
}
}

// 使用 find_compatible 查找特定节点
let uart_nodes = fdt.find_compatible(&["vendor,uart"]);
println!("\n找到 UART 节点:");
for node_ref in uart_nodes {
println!(
" 节点: {}, 完整路径: '{}'",
node_ref.node.name(),
node_ref.context.current_path
);
}
}
21 changes: 20 additions & 1 deletion fdt-edit/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,11 +1,30 @@
[package]
authors = ["周睿 <[email protected]>"]
categories = ["embedded", "no-std", "hardware-support"]
description = "A high-level library for creating, editing, and encoding Flattened Device Tree (FDT) structures"
documentation = "https://docs.rs/fdt-edit"
edition = "2024"
exclude = [".git*", "*.md", "tests/"]
keywords = ["device-tree", "dtb", "embedded", "no-std", "editor"]
license = "MIT OR Apache-2.0"
name = "fdt-edit"
readme = "README.md"
repository = "https://github.com/drivercraft/fdt-parser"
version = "0.1.0"

[dependencies]
fdt-raw = {path = "../fdt-raw"}
log = "0.4"
fdt-raw = {version = "0.1.0", path = "../fdt-raw"}
enum_dispatch = "0.3.13"

[dev-dependencies]
dtb-file = {path = "../dtb-file"}
env_logger = "0.11"

[features]
default = []
std = []

[package.metadata.docs.rs]
all-features = true
targets = ["x86_64-unknown-linux-gnu", "aarch64-unknown-none-softfloat", "riscv64gc-unknown-none-elf"]
148 changes: 148 additions & 0 deletions fdt-edit/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
# fdt-edit

用于创建、编辑和编码设备树(FDT)的高级 Rust 库。

## 概述

`fdt-edit` 是一个功能丰富的设备树操作库,基于 `fdt-raw` 构建,提供了完整的设备树创建、编辑和编码功能。该库支持从零创建新的设备树,修改现有的设备树,以及将编辑后的设备树编码为标准 DTB 格式。

## 特性

- **完整的设备树编辑**:支持节点和属性的增删改查
- **类型安全的节点操作**:提供专门的节点类型(时钟、内存、PCI、中断控制器等)
- **高效的编码器**:将内存中的设备树结构编码为标准 DTB 格式
- **phandle 管理**:自动 phandle 分配和引用管理
- **内存保留块支持**:完整的内存保留区域操作
- **`no_std` 兼容**:适用于嵌入式环境

## 核心组件

### Fdt 结构
可编辑的设备树容器:
- 从原始 DTB 数据解析
- 创建新的空设备树
- 管理 phandle 缓存
- 编码为 DTB 格式

### 节点系统
支持多种专用节点类型:
- **时钟节点**:时钟源和时钟消费者
- **内存节点**:内存区域定义
- **PCI 节点**:PCI 总线和设备
- **中断控制器**:中断映射和管理
- **通用节点**:可自定义的节点类型

### 属性系统
- **强类型属性**:各种数据类型的属性支持
- **自动属性管理**:智能的属性增删改查
- **格式化显示**:友好的节点和属性显示

## 快速开始

```rust
use fdt_edit::{Fdt, Node, NodeKind};

// 创建新的空设备树
let mut fdt = Fdt::new();

// 添加根节点下的子节点
let memory_node = fdt.root_mut()
.add_child("memory@80000000")
.unwrap();
memory_node.add_property("device_type", "memory")?;
memory_node.add_property("reg", &[0x8000_0000u64, 0x1000_0000u64])?;

// 添加时钟节点
let clock_node = fdt.root_mut()
.add_child("clk_osc")
.unwrap();
clock_node.add_property("compatible", &["fixed-clock"])?;
clock_node.add_property("#clock-cells", &[0u32])?;
clock_node.add_property("clock-frequency", &[24_000_000u32])?;

// 编码为 DTB 数据
let dtb_data = fdt.encode()?;
```

### 从现有 DTB 编辑

```rust
// 解析现有 DTB
let mut fdt = Fdt::from_bytes(&existing_dtb)?;

// 查找并修改节点
if let Some(cpu_node) = fdt.root_mut()
.find_child_mut("cpus")?
.and_then(|n| n.find_child_mut("cpu@0")) {

// 修改时钟频率
cpu_node.set_property("clock-frequency", &[1_200_000_000u32])?;
}

// 添加新的属性
cpu_node.add_property("new-property", "value")?;

// 重新编码
let modified_dtb = fdt.encode()?;
```

### 节点遍历和查找

```rust
// 遍历所有节点
for node in fdt.root().traverse() {
match node.kind() {
NodeKind::Memory(mem) => {
println!("Memory node: {:x?}", mem.regions());
}
NodeKind::Clock(clock) => {
println!("Clock: {}, freq: {}", clock.name(), clock.frequency()?);
}
_ => {
println!("Generic node: {}", node.name());
}
}
}

// 查找特定节点
if let Some(chosen) = fdt.root().find_child("chosen") {
if let Some(bootargs) = chosen.get_property("bootargs") {
println!("Boot args: {}", bootargs.as_str()?);
}
}
```

## 依赖

- `fdt-raw` - 底层 FDT 解析库
- `log = "0.4"` - 日志记录
- `enum_dispatch = "0.3.13"` - 枚举分发优化

## 开发依赖

- `dtb-file` - 测试数据
- `env_logger = "0.11"` - 日志实现

## 许可证

本项目采用开源许可证,具体许可证类型请查看项目根目录的 LICENSE 文件。

## 贡献

欢迎提交 Issue 和 Pull Request。请确保:

1. 代码遵循项目的格式规范(`cargo fmt`)
2. 通过所有测试(`cargo test`)
3. 通过 Clippy 检查(`cargo clippy`)
4. 新功能添加相应的测试用例

## 相关项目

- [fdt-raw](../fdt-raw/) - 底层 FDT 解析库
- [fdt-parser](../fdt-parser/) - 高级缓存式 FDT 解析器
- [dtb-tool](../dtb-tool/) - DTB 文件检查工具
- [dtb-file](../dtb-file/) - 测试数据包

## 示例

更多使用示例请查看 `examples/` 目录(如果存在)或源码中的测试用例。
92 changes: 0 additions & 92 deletions fdt-edit/examples/display_dts.rs

This file was deleted.

25 changes: 25 additions & 0 deletions fdt-edit/examples/fdt_debug_demo.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
//! FDT 深度调试演示
//!
//! 演示如何使用新的深度调试功能来遍历和打印设备树的所有节点

use dtb_file::fdt_rpi_4b;
use fdt_edit::Fdt;

fn main() -> Result<(), Box<dyn std::error::Error>> {
env_logger::init();

// 从 RPI 4B DTB 数据创建 FDT
let raw_data = fdt_rpi_4b();
let fdt = Fdt::from_bytes(&raw_data)?;

println!("=== FDT 基本调试信息 ===");
// 基本调试格式(紧凑)
println!("{:?}", fdt);
println!();

println!("=== FDT 深度调试信息 ===");
// 深度调试格式(遍历所有节点)
println!("{:#?}", fdt);

Ok(())
}
Loading