components/
nrf51822.rs

1// Licensed under the Apache License, Version 2.0 or the MIT License.
2// SPDX-License-Identifier: Apache-2.0 OR MIT
3// Copyright Tock Contributors 2022.
4
5//! Component for communicating with the nRF51822 (BLE).
6//!
7//! This provides one Component, Nrf51822Component, which implements
8//! a system call interface to the nRF51822 for BLE advertisements.
9//!
10//! Usage
11//! -----
12//! ```rust
13//! let nrf_serialization = Nrf51822Component::new(&sam4l::usart::USART3,
14//!                                                &sam4l::gpio::PA[17])
15//!     .finalize(components::nrf51822_component_static!());
16//! ```
17
18// Author: Philip Levis <pal@cs.stanford.edu>
19// Last modified: 6/20/2018
20
21use 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}