Skip to content

Commit 1aff743

Browse files
committed
fix: make code in doc runable
feat: add test from example Signed-off-by: Woshiluo Luo <woshiluo.luo@outlook.com>
1 parent 730c317 commit 1aff743

File tree

2 files changed

+71
-3
lines changed

2 files changed

+71
-3
lines changed

src/de.rs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,17 @@ use serde::de;
3131
/// # Example
3232
///
3333
/// ```
34-
/// # static DEVICE_TREE: &'static [u8] = include_bytes!("../examples/hifive-unmatched-a00.dtb");
35-
/// # let dtb_pa = DEVICE_TREE.as_ptr() as usize;
34+
/// # static RAW_DEVICE_TREE: &'static [u8] = include_bytes!("../examples/hifive-unmatched-a00.dtb");
35+
/// # const BUFFER_SIZE: usize = RAW_DEVICE_TREE.len();
36+
/// # #[repr(align(4))]
37+
/// # struct AlignedBuffer {
38+
/// # pub data: [u8; RAW_DEVICE_TREE.len()],
39+
/// # }
40+
/// # let mut aligned_data: Box<AlignedBuffer> = Box::new(AlignedBuffer {
41+
/// # data: [0; BUFFER_SIZE],
42+
/// # });
43+
/// # aligned_data.data[..BUFFER_SIZE].clone_from_slice(RAW_DEVICE_TREE);
44+
/// # let fdt_ptr = aligned_data.data.as_ptr();
3645
/// use serde_derive::Deserialize;
3746
///
3847
/// #[derive(Debug, Deserialize)]
@@ -47,7 +56,7 @@ use serde::de;
4756
/// stdout_path: Option<&'a str>,
4857
/// }
4958
///
50-
/// let tree: Tree = unsafe { serde_device_tree::from_raw(dtb_pa as *const u8) }
59+
/// let tree: Tree = unsafe { serde_device_tree::from_raw(fdt_ptr as *const u8) }
5160
/// .expect("parse device tree");
5261
/// if let Some(chosen) = tree.chosen {
5362
/// if let Some(stdout_path) = chosen.stdout_path {

tests/hifive-unmatched-a00.rs

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
use serde_derive::Deserialize;
2+
use serde_device_tree::Compatible;
3+
4+
#[derive(Debug, Deserialize)]
5+
struct Tree<'a> {
6+
#[serde(rename = "#address-cells")]
7+
num_address_cells: u32,
8+
#[serde(rename = "#size-cells")]
9+
num_size_cells: u32,
10+
model: &'a str,
11+
#[allow(unused)]
12+
compatible: Compatible<'a>,
13+
chosen: Option<Chosen<'a>>,
14+
cpus: Cpus,
15+
}
16+
17+
#[derive(Debug, Deserialize)]
18+
#[serde(rename_all = "kebab-case")]
19+
struct Chosen<'a> {
20+
stdout_path: Option<&'a str>,
21+
}
22+
23+
#[derive(Debug, Deserialize)]
24+
#[serde(rename_all = "kebab-case")]
25+
struct Cpus {
26+
timebase_frequency: u32,
27+
#[serde(rename = "u-boot,dm-spl")]
28+
u_boot_dm_spl: bool,
29+
}
30+
31+
const RAW_DEVICE_TREE: &[u8] = include_bytes!("../examples/hifive-unmatched-a00.dtb");
32+
const BUFFER_SIZE: usize = RAW_DEVICE_TREE.len();
33+
34+
#[repr(align(4))]
35+
struct AlignedBuffer {
36+
pub data: [u8; RAW_DEVICE_TREE.len()],
37+
}
38+
39+
#[test]
40+
fn hifive_unmatched() {
41+
let mut aligned_data: Box<AlignedBuffer> = Box::new(AlignedBuffer {
42+
data: [0; BUFFER_SIZE],
43+
});
44+
aligned_data.data[..BUFFER_SIZE].clone_from_slice(RAW_DEVICE_TREE);
45+
let ptr = aligned_data.data.as_ptr();
46+
let t: Tree = unsafe { serde_device_tree::from_raw(ptr) }.unwrap();
47+
assert_eq!(t.num_address_cells, 2);
48+
assert_eq!(t.num_size_cells, 2);
49+
assert_eq!(t.model, "SiFive HiFive Unmatched A00\0");
50+
if let Some(chosen) = t.chosen {
51+
if let Some(stdout_path) = chosen.stdout_path {
52+
assert_eq!(stdout_path, "serial0\0");
53+
} else {
54+
assert!(false, "Failed to find chosen/stdout_path");
55+
}
56+
}
57+
assert_eq!(t.cpus.timebase_frequency, 1000000);
58+
assert_eq!(t.cpus.u_boot_dm_spl, true);
59+
}

0 commit comments

Comments
 (0)