Skip to main content

ariel_os_nrf/
lib.rs

1//! Items specific to the Nordic Semiconductor nRF MCUs.
2
3#![no_std]
4#![cfg_attr(nightly, feature(doc_cfg))]
5#![deny(missing_docs)]
6
7pub mod gpio;
8
9mod irqs;
10
11#[doc(hidden)]
12pub mod peripheral {
13    pub use embassy_nrf::Peri;
14}
15
16#[cfg(feature = "ble")]
17#[doc(hidden)]
18pub mod ble;
19
20#[cfg(feature = "external-interrupts")]
21#[doc(hidden)]
22pub mod extint_registry;
23
24#[cfg(feature = "hwrng")]
25#[doc(hidden)]
26pub mod hwrng;
27
28#[cfg(feature = "i2c")]
29pub mod i2c;
30
31#[doc(hidden)]
32pub mod identity;
33
34#[cfg(feature = "nrf91-modem")]
35#[doc(hidden)]
36pub mod modem;
37
38#[cfg(feature = "ltem-nrf-modem")]
39#[doc(hidden)]
40pub mod ltem;
41
42#[cfg(feature = "spi")]
43pub mod spi;
44
45#[cfg(feature = "uart")]
46pub mod uart;
47
48#[cfg(feature = "storage")]
49#[doc(hidden)]
50pub mod storage;
51
52#[cfg(feature = "usb")]
53#[doc(hidden)]
54pub mod usb;
55
56#[cfg(feature = "executor-interrupt")]
57#[doc(hidden)]
58pub use embassy_executor::InterruptExecutor as Executor;
59
60#[cfg(feature = "executor-interrupt")]
61#[cfg(context = "nrf51")]
62ariel_os_embassy_common::executor_swi!(SWI0);
63
64#[cfg(feature = "executor-interrupt")]
65#[cfg(context = "nrf52")]
66ariel_os_embassy_common::executor_swi!(EGU0_SWI0);
67
68#[cfg(feature = "executor-interrupt")]
69#[cfg(any(context = "nrf53", context = "nrf91"))]
70ariel_os_embassy_common::executor_swi!(EGU0);
71
72#[cfg(feature = "executor-interrupt")]
73#[cfg(context = "nrf54l")]
74ariel_os_embassy_common::executor_swi!(SWI00);
75
76use embassy_nrf::{Peri, PeripheralType, config::Config};
77
78#[doc(hidden)]
79pub use embassy_nrf::{OptionalPeripherals, interrupt};
80
81pub use embassy_nrf::peripherals;
82
83#[cfg(feature = "executor-interrupt")]
84#[doc(hidden)]
85pub static EXECUTOR: Executor = Executor::new();
86
87#[doc(hidden)]
88pub trait IntoPeripheral<'a, T: PeripheralType>: private::Sealed {
89    fn into_hal_peripheral(self) -> Peri<'a, T>;
90}
91
92impl<T: PeripheralType> private::Sealed for Peri<'_, T> {}
93
94#[doc(hidden)]
95impl<'a, T: PeripheralType> IntoPeripheral<'a, T> for Peri<'a, T> {
96    fn into_hal_peripheral(self) -> Peri<'a, T> {
97        self
98    }
99}
100
101mod private {
102    pub trait Sealed {}
103}
104
105#[doc(hidden)]
106#[must_use]
107pub fn init() -> OptionalPeripherals {
108    enable_flash_cache();
109
110    let peripherals = embassy_nrf::init(Config::default());
111    OptionalPeripherals::from(peripherals)
112}
113
114fn enable_flash_cache() {
115    // (no flash cache on nrf51)
116    cfg_select! {
117        any(context = "nrf52", context = "nrf5340-net", context = "nrf91") => {
118            embassy_nrf::pac::NVMC
119                .icachecnf()
120                .write(|w| w.set_cacheen(true));
121        }
122        context = "nrf5340-app" => {
123            embassy_nrf::pac::CACHE_S
124                .enable()
125                .write(|w| w.set_enable(true));
126        }
127        context = "nrf54l15-app" => {
128            embassy_nrf::pac::ICACHE_S
129                .enable()
130                .write(|w| w.set_enable(true));
131        }
132        _ => {}
133    }
134}