components/
date_time.rs
1use core::mem::MaybeUninit;
23
24use capsules_extra::date_time::DateTimeCapsule;
25use kernel::capabilities;
26use kernel::component::Component;
27use kernel::create_capability;
28use kernel::hil::date_time;
29
30#[macro_export]
31macro_rules! date_time_component_static {
32 ($R:ty $(,)?) => {{
33 let rtc = kernel::static_buf!(capsules_extra::date_time::DateTimeCapsule<'static, $R>);
34 (rtc)
35 };};
36}
37
38pub struct DateTimeComponent<D: 'static + date_time::DateTime<'static>> {
39 board_kernel: &'static kernel::Kernel,
40 driver_num: usize,
41 rtc: &'static D,
42}
43
44impl<D: 'static + date_time::DateTime<'static>> DateTimeComponent<D> {
45 pub fn new(
46 board_kernel: &'static kernel::Kernel,
47 driver_num: usize,
48 rtc: &'static D,
49 ) -> DateTimeComponent<D> {
50 DateTimeComponent {
51 board_kernel,
52 driver_num,
53 rtc,
54 }
55 }
56}
57
58impl<D: 'static + date_time::DateTime<'static> + kernel::deferred_call::DeferredCallClient>
59 Component for DateTimeComponent<D>
60{
61 type StaticInput = &'static mut MaybeUninit<DateTimeCapsule<'static, D>>;
62
63 type Output = &'static DateTimeCapsule<'static, D>;
64
65 fn finalize(self, s: Self::StaticInput) -> Self::Output {
66 let grant_dt = create_capability!(capabilities::MemoryAllocationCapability);
67 let grant_date_time = self.board_kernel.create_grant(self.driver_num, &grant_dt);
68
69 let date_time = s.write(DateTimeCapsule::new(self.rtc, grant_date_time));
70 date_time::DateTime::set_client(self.rtc, date_time);
71 date_time
72 }
73}