1use capsules_extra::nrf51822_serialization::Nrf51822Serialization;
22use core::mem::MaybeUninit;
23use kernel::capabilities;
24use kernel::component::Component;
25use kernel::create_capability;
26use kernel::hil;
27
28#[macro_export]
29macro_rules! nrf51822_component_static {
30 () => {{
31 let nrf = kernel::static_buf!(
32 capsules_extra::nrf51822_serialization::Nrf51822Serialization<'static>
33 );
34 let write_buffer =
35 kernel::static_buf!([u8; capsules_extra::nrf51822_serialization::WRITE_BUF_LEN]);
36 let read_buffer =
37 kernel::static_buf!([u8; capsules_extra::nrf51822_serialization::READ_BUF_LEN]);
38
39 (nrf, write_buffer, read_buffer)
40 };};
41}
42
43pub struct Nrf51822Component<
44 U: 'static + hil::uart::UartAdvanced<'static>,
45 G: 'static + hil::gpio::Pin,
46> {
47 board_kernel: &'static kernel::Kernel,
48 driver_num: usize,
49 uart: &'static U,
50 reset_pin: &'static G,
51}
52
53impl<U: 'static + hil::uart::UartAdvanced<'static>, G: 'static + hil::gpio::Pin>
54 Nrf51822Component<U, G>
55{
56 pub fn new(
57 board_kernel: &'static kernel::Kernel,
58 driver_num: usize,
59 uart: &'static U,
60 reset_pin: &'static G,
61 ) -> Nrf51822Component<U, G> {
62 Nrf51822Component {
63 board_kernel,
64 driver_num,
65 uart,
66 reset_pin,
67 }
68 }
69}
70
71impl<U: 'static + hil::uart::UartAdvanced<'static>, G: 'static + hil::gpio::Pin> Component
72 for Nrf51822Component<U, G>
73{
74 type StaticInput = (
75 &'static mut MaybeUninit<Nrf51822Serialization<'static>>,
76 &'static mut MaybeUninit<[u8; capsules_extra::nrf51822_serialization::WRITE_BUF_LEN]>,
77 &'static mut MaybeUninit<[u8; capsules_extra::nrf51822_serialization::READ_BUF_LEN]>,
78 );
79 type Output = &'static Nrf51822Serialization<'static>;
80
81 fn finalize(self, s: Self::StaticInput) -> Self::Output {
82 let grant_cap = create_capability!(capabilities::MemoryAllocationCapability);
83
84 let write_buffer =
85 s.1.write([0; capsules_extra::nrf51822_serialization::WRITE_BUF_LEN]);
86 let read_buffer =
87 s.2.write([0; capsules_extra::nrf51822_serialization::READ_BUF_LEN]);
88
89 let nrf_serialization = s.0.write(Nrf51822Serialization::new(
90 self.uart,
91 self.board_kernel.create_grant(self.driver_num, &grant_cap),
92 self.reset_pin,
93 write_buffer,
94 read_buffer,
95 ));
96 hil::uart::Transmit::set_transmit_client(self.uart, nrf_serialization);
97 hil::uart::Receive::set_receive_client(self.uart, nrf_serialization);
98 nrf_serialization
99 }
100}