e310x_hal/
device.rs

1//! Device resources available in FE310-G000 and FE310-G002 chip packages
2
3use crate::core::CorePeripherals;
4use crate::gpio::{gpio0::*, GpioExt, Unknown};
5use e310x::{
6    Aonclk, Backup, Gpio0, Otp, Peripherals, Pmu, Prci, Pwm0, Pwm1, Pwm2, Qspi0, Qspi1, Rtc, Uart0,
7    Wdog,
8};
9#[cfg(feature = "g002")]
10use e310x::{I2c0, Uart1};
11
12/// Device peripherals available in a 48QFN package, except GPIO0
13#[allow(non_snake_case)]
14pub struct DevicePeripherals {
15    /// WDOG peripheral
16    pub WDOG: Wdog,
17    /// RTC peripheral
18    pub RTC: Rtc,
19    /// AONCLK peripheral
20    pub AONCLK: Aonclk,
21    /// BACKUP peripheral
22    pub BACKUP: Backup,
23    /// PMU peripheral
24    pub PMU: Pmu,
25    /// PRCI peripheral
26    pub PRCI: Prci,
27    /// OTP peripheral
28    pub OTP: Otp,
29
30    /// UART0 peripheral
31    pub UART0: Uart0,
32    #[cfg(feature = "g002")]
33    /// UART1 peripheral (FE310-G002 only)
34    pub UART1: Uart1,
35
36    /// QSPI0 peripheral
37    pub QSPI0: Qspi0,
38    /// QSPI1 peripheral
39    pub QSPI1: Qspi1,
40
41    #[cfg(feature = "g002")]
42    /// I2C0 peripheral (FE310-G002 only)
43    pub I2C0: I2c0,
44
45    /// PWM0 peripheral
46    pub PWM0: Pwm0,
47    /// PWM1 peripheral
48    pub PWM1: Pwm1,
49    /// PWM2 peripheral
50    pub PWM2: Pwm2,
51}
52
53/// Device GPIO pins available in a 48QFN package
54pub struct DeviceGpioPins {
55    /// GPIO 0, package pin 25
56    pub pin0: Pin0<Unknown>,
57    /// GPIO 1, package pin 26
58    pub pin1: Pin1<Unknown>,
59    /// GPIO 2, package pin 27
60    pub pin2: Pin2<Unknown>,
61    /// GPIO 3, package pin 28
62    pub pin3: Pin3<Unknown>,
63    /// GPIO 4, package pin 29
64    pub pin4: Pin4<Unknown>,
65    /// GPIO 5, package pin 31
66    pub pin5: Pin5<Unknown>,
67    /// GPIO 9, package pin 33
68    pub pin9: Pin9<Unknown>,
69    /// GPIO 10, package pin 34
70    pub pin10: Pin10<Unknown>,
71    /// GPIO 11, package pin 35
72    pub pin11: Pin11<Unknown>,
73    /// GPIO 12, package pin 36
74    pub pin12: Pin12<Unknown>,
75    /// GPIO 13, package pin 37
76    pub pin13: Pin13<Unknown>,
77    /// GPIO 16, package pin 38
78    pub pin16: Pin16<Unknown>,
79    /// GPIO 17, package pin 39
80    pub pin17: Pin17<Unknown>,
81    /// GPIO 18, package pin 40
82    pub pin18: Pin18<Unknown>,
83    /// GPIO 19, package pin 41
84    pub pin19: Pin19<Unknown>,
85    /// GPIO 20, package pin 42
86    pub pin20: Pin20<Unknown>,
87    /// GPIO 21, package pin 43
88    pub pin21: Pin21<Unknown>,
89    /// GPIO 22, package pin 44
90    pub pin22: Pin22<Unknown>,
91    /// GPIO 23, package pin 45
92    pub pin23: Pin23<Unknown>,
93}
94
95impl From<Gpio0> for DeviceGpioPins {
96    fn from(gpio: Gpio0) -> Self {
97        let parts = gpio.split();
98
99        DeviceGpioPins {
100            pin0: parts.pin0,
101            pin1: parts.pin1,
102            pin2: parts.pin2,
103            pin3: parts.pin3,
104            pin4: parts.pin4,
105            pin5: parts.pin5,
106            pin9: parts.pin9,
107            pin10: parts.pin10,
108            pin11: parts.pin11,
109            pin12: parts.pin12,
110            pin13: parts.pin13,
111            pin16: parts.pin16,
112            pin17: parts.pin17,
113            pin18: parts.pin18,
114            pin19: parts.pin19,
115            pin20: parts.pin20,
116            pin21: parts.pin21,
117            pin22: parts.pin22,
118            pin23: parts.pin23,
119        }
120    }
121}
122
123/// Device resources available in a 48QFN package
124pub struct DeviceResources {
125    /// Core peripherals
126    pub core_peripherals: CorePeripherals,
127
128    /// Device peripherals
129    pub peripherals: DevicePeripherals,
130
131    /// Device GPIO pins
132    pub pins: DeviceGpioPins,
133}
134
135impl From<Peripherals> for DeviceResources {
136    fn from(p: Peripherals) -> Self {
137        let peripherals = DevicePeripherals {
138            WDOG: p.wdog,
139            RTC: p.rtc,
140            AONCLK: p.aonclk,
141            BACKUP: p.backup,
142            PMU: p.pmu,
143            PRCI: p.prci,
144            OTP: p.otp,
145
146            UART0: p.uart0,
147            #[cfg(feature = "g002")]
148            UART1: p.uart1,
149
150            QSPI0: p.qspi0,
151            QSPI1: p.qspi1,
152
153            #[cfg(feature = "g002")]
154            I2C0: p.i2c0,
155
156            PWM0: p.pwm0,
157            PWM1: p.pwm1,
158            PWM2: p.pwm2,
159        };
160
161        DeviceResources {
162            core_peripherals: CorePeripherals::new(),
163            peripherals,
164            pins: p.gpio0.into(),
165        }
166    }
167}
168
169impl DeviceResources {
170    /// Returns all the device resources *once*
171    #[inline]
172    pub fn take() -> Option<Self> {
173        e310x::Peripherals::take().map(DeviceResources::from)
174    }
175
176    /// Unchecked version of [`DeviceResources::take`].
177    ///
178    /// # Safety
179    ///
180    /// Using this function may break the guarantees of the singleton pattern.
181    pub unsafe fn steal() -> Self {
182        e310x::Peripherals::steal().into()
183    }
184}