driver_interface/
register.rs

1use core::ops::Deref;
2
3use crate::{intc, timer};
4
5#[derive(Clone)]
6pub struct DriverRegister {
7    pub name: &'static str,
8    pub probe_kinds: &'static [ProbeKind],
9}
10
11unsafe impl Send for DriverRegister {}
12unsafe impl Sync for DriverRegister {}
13
14pub enum ProbeKind {
15    Fdt {
16        compatibles: &'static [&'static str],
17        on_probe: OnProbeKindFdt,
18    },
19}
20
21#[derive(Clone)]
22pub enum OnProbeKindFdt {
23    InterruptController(intc::OnProbeFdt),
24    Timer(timer::OnProbeFdt),
25}
26
27#[repr(C)]
28pub struct DriverRegisterSlice {
29    data: *const u8,
30    len: usize,
31}
32
33impl DriverRegisterSlice {
34    pub fn from_raw(data: &'static [u8]) -> Self {
35        Self {
36            data: data.as_ptr(),
37            len: data.len(),
38        }
39    }
40
41    pub fn as_slice(&self) -> &[DriverRegister] {
42        unsafe {
43            core::slice::from_raw_parts(self.data as _, self.len / size_of::<DriverRegister>())
44        }
45    }
46}
47
48impl Deref for DriverRegisterSlice {
49    type Target = [DriverRegister];
50
51    fn deref(&self) -> &Self::Target {
52        self.as_slice()
53    }
54}