|
| 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