Skip to content

Commit 5c522bc

Browse files
committed
feat: 更新版本号至 0.1.1,添加 Fdt 结构的 chosen 和 memory 方法,增强测试用例
1 parent 6aa0000 commit 5c522bc

File tree

4 files changed

+56
-29
lines changed

4 files changed

+56
-29
lines changed

fdt-raw/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ name = "fdt-raw"
1111
readme = "README.md"
1212
homepage = "https://github.com/drivercraft/fdt-parser"
1313
repository = "https://github.com/drivercraft/fdt-parser"
14-
version = "0.1.0"
14+
version = "0.1.1"
1515

1616
[dependencies]
1717
heapless = "0.9"

fdt-raw/src/fdt.rs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
use core::fmt;
22

3-
use crate::{FdtError, MemoryReservation, data::Bytes, header::Header, iter::FdtIter};
3+
use crate::{
4+
Chosen, FdtError, Memory, MemoryReservation, Node, data::Bytes, header::Header, iter::FdtIter,
5+
};
46

57
/// Memory reservation block iterator
68
pub struct MemoryReservationIter<'a> {
@@ -102,6 +104,24 @@ impl<'a> Fdt<'a> {
102104
offset: self.header.off_mem_rsvmap as usize,
103105
}
104106
}
107+
108+
pub fn chosen(&self) -> Option<Chosen<'a>> {
109+
for node in self.all_nodes() {
110+
if let Node::Chosen(c) = node {
111+
return Some(c);
112+
}
113+
}
114+
None
115+
}
116+
117+
pub fn memory(&self) -> Option<Memory<'a>> {
118+
for node in self.all_nodes() {
119+
if let Node::Memory(m) = node {
120+
return Some(m);
121+
}
122+
}
123+
None
124+
}
105125
}
106126

107127
impl fmt::Display for Fdt<'_> {

fdt-raw/src/node/mod.rs

Lines changed: 2 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
use core::ffi::CStr;
21
use core::fmt;
32
use core::ops::Deref;
3+
use core::{ffi::CStr, fmt::Debug};
44

55
use crate::{
66
FdtError, Token,
@@ -156,31 +156,6 @@ pub enum Node<'a> {
156156
Memory(Memory<'a>),
157157
}
158158

159-
impl<'a> Node<'a> {
160-
/// 获取底层的 NodeBase 引用
161-
pub fn as_base(&self) -> &NodeBase<'a> {
162-
self.deref()
163-
}
164-
165-
/// 尝试转换为 Chosen 节点
166-
pub fn as_chosen(&self) -> Option<&Chosen<'a>> {
167-
if let Node::Chosen(c) = self {
168-
Some(c)
169-
} else {
170-
None
171-
}
172-
}
173-
174-
/// 尝试转换为 Memory 节点
175-
pub fn as_memory(&self) -> Option<&Memory<'a>> {
176-
if let Node::Memory(m) = self {
177-
Some(m)
178-
} else {
179-
None
180-
}
181-
}
182-
}
183-
184159
impl<'a> From<NodeBase<'a>> for Node<'a> {
185160
fn from(node: NodeBase<'a>) -> Self {
186161
if node.is_chosen() {
@@ -207,7 +182,7 @@ impl<'a> Deref for Node<'a> {
207182

208183
impl fmt::Display for Node<'_> {
209184
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
210-
self.as_base().fmt(f)
185+
Debug::fmt(self, f)
211186
}
212187
}
213188

fdt-raw/tests/classify.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
use std::sync::Once;
2+
3+
use dtb_file::fdt_qemu;
4+
use fdt_raw::Fdt;
5+
6+
fn init_logging() {
7+
static INIT: Once = Once::new();
8+
INIT.call_once(|| {
9+
let _ = env_logger::builder()
10+
.is_test(true)
11+
.filter_level(log::LevelFilter::Trace)
12+
.try_init();
13+
});
14+
}
15+
16+
#[test]
17+
fn test_chosen() {
18+
init_logging();
19+
let raw = fdt_qemu();
20+
let fdt = Fdt::from_bytes(&raw).unwrap();
21+
let chosen = fdt.chosen().unwrap();
22+
println!("Chosen node: {:?}", chosen);
23+
}
24+
25+
#[test]
26+
fn test_memory() {
27+
init_logging();
28+
let raw = fdt_qemu();
29+
let fdt = Fdt::from_bytes(&raw).unwrap();
30+
let memory = fdt.memory().unwrap();
31+
println!("Memory node: {:#x?}", memory);
32+
}

0 commit comments

Comments
 (0)