Skip to main content

ariel_os_rp/
lib.rs

1//! Items specific to the Raspberry Pi RP MCUs.
2
3#![no_std]
4#![cfg_attr(nightly, feature(doc_cfg))]
5#![deny(missing_docs)]
6
7pub mod gpio;
8
9#[cfg(any(feature = "storage", feature = "_cyw43"))]
10mod dma;
11
12#[doc(hidden)]
13pub mod peripheral {
14    pub use embassy_rp::Peri;
15}
16#[cfg(context = "rp235xa")]
17mod picotool;
18
19#[cfg(feature = "wifi")]
20mod wifi;
21
22#[cfg(feature = "ble")]
23#[doc(hidden)]
24pub mod ble;
25
26#[cfg(feature = "_cyw43")]
27#[doc(hidden)]
28pub mod cyw43;
29
30#[cfg(feature = "hwrng")]
31#[doc(hidden)]
32pub mod hwrng;
33
34#[cfg(feature = "i2c")]
35pub mod i2c;
36
37#[doc(hidden)]
38pub mod identity;
39
40#[cfg(feature = "spi")]
41pub mod spi;
42
43#[cfg(feature = "uart")]
44pub mod uart;
45
46#[cfg(feature = "storage")]
47#[doc(hidden)]
48pub mod storage;
49
50#[cfg(feature = "usb")]
51#[doc(hidden)]
52pub mod usb;
53
54#[doc(hidden)]
55pub use embassy_rp::OptionalPeripherals;
56
57pub use embassy_rp::peripherals;
58
59#[cfg(feature = "executor-interrupt")]
60#[doc(hidden)]
61pub use embassy_executor::InterruptExecutor as Executor;
62#[cfg(feature = "executor-interrupt")]
63#[doc(hidden)]
64pub use embassy_rp::interrupt;
65
66use embassy_rp::{Peri, PeripheralType};
67
68#[cfg(feature = "executor-interrupt")]
69ariel_os_embassy_common::executor_swi!(SWI_IRQ_1);
70
71#[cfg(feature = "executor-interrupt")]
72#[doc(hidden)]
73pub static EXECUTOR: Executor = Executor::new();
74
75#[doc(hidden)]
76pub trait IntoPeripheral<'a, T: PeripheralType>: private::Sealed {
77    fn into_hal_peripheral(self) -> Peri<'a, T>;
78}
79
80impl<T: PeripheralType> private::Sealed for Peri<'_, T> {}
81
82#[doc(hidden)]
83impl<'a, T: PeripheralType> IntoPeripheral<'a, T> for Peri<'a, T> {
84    fn into_hal_peripheral(self) -> Peri<'a, T> {
85        self
86    }
87}
88
89mod private {
90    pub trait Sealed {}
91}
92
93#[doc(hidden)]
94#[must_use]
95pub fn init() -> OptionalPeripherals {
96    #[cfg(feature = "executor-interrupt")]
97    {
98        // SWI & DMA priority need to match. DMA is hard-coded to P3 by upstream.
99        use embassy_rp::interrupt::{InterruptExt as _, Priority};
100        SWI.set_priority(Priority::P3);
101    }
102
103    let peripherals = embassy_rp::init(embassy_rp::config::Config::default());
104    OptionalPeripherals::from(peripherals)
105}