Skip to content

Commit cafe827

Browse files
Merge pull request #44 from dmunizu/gpio-interrupt
Add GPIO interrupt managing methods
2 parents 50e2d6d + 8cc7004 commit cafe827

File tree

4 files changed

+491
-69
lines changed

4 files changed

+491
-69
lines changed

e310x-hal/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
99

1010
### Changed
1111
- Update `e310x` dependency and adapt code
12+
- Add interrupt managing methods to `e310x-hal::gpio` module
1213

1314
## [v0.12.0] - 2024-12-10
1415

e310x-hal/src/device.rs

Lines changed: 112 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! Device resources available in FE310-G000 and FE310-G002 chip packages
22
33
use crate::core::CorePeripherals;
4-
use crate::gpio::{gpio0::*, GpioExt, Unknown};
4+
use crate::gpio::{gpio0::*, EventType, GpioExt, Unknown};
55
use e310x::{
66
Aonclk, Backup, Gpio0, Otp, Peripherals, Pmu, Prci, Pwm0, Pwm1, Pwm2, Qspi0, Qspi1, Rtc, Uart0,
77
Wdog,
@@ -92,6 +92,117 @@ pub struct DeviceGpioPins {
9292
pub pin23: Pin23<Unknown>,
9393
}
9494

95+
impl DeviceGpioPins {
96+
/// Enables the specified interrupt event for all the GPIO pins.
97+
///
98+
/// # Note
99+
///
100+
/// This function does not enable the interrupts in the PLIC, it only sets the
101+
/// interrupt enable bits in the GPIO peripheral. You must call the
102+
/// [`enable_exti()`](super::gpio::gpio0::Pin0::enable_exti) method of every pin
103+
/// to enable their interrupt in the PLIC.
104+
pub fn enable_interrupts(&mut self, event: EventType) {
105+
let gpio = unsafe { Gpio0::steal() };
106+
107+
match event {
108+
EventType::High => {
109+
unsafe { gpio.high_ie().write(|w| w.bits(0xFFFFFFFF)) };
110+
}
111+
EventType::Low => {
112+
unsafe { gpio.low_ie().write(|w| w.bits(0xFFFFFFFF)) };
113+
}
114+
EventType::BothLevels => unsafe {
115+
gpio.high_ie().write(|w| w.bits(0xFFFFFFFF));
116+
gpio.low_ie().write(|w| w.bits(0xFFFFFFFF));
117+
},
118+
EventType::Rise => {
119+
unsafe { gpio.rise_ie().write(|w| w.bits(0xFFFFFFFF)) };
120+
}
121+
EventType::Fall => {
122+
unsafe { gpio.fall_ie().write(|w| w.bits(0xFFFFFFFF)) };
123+
}
124+
EventType::BothEdges => unsafe {
125+
gpio.rise_ie().write(|w| w.bits(0xFFFFFFFF));
126+
gpio.fall_ie().write(|w| w.bits(0xFFFFFFFF));
127+
},
128+
EventType::All => unsafe {
129+
gpio.high_ie().write(|w| w.bits(0xFFFFFFFF));
130+
gpio.low_ie().write(|w| w.bits(0xFFFFFFFF));
131+
gpio.rise_ie().write(|w| w.bits(0xFFFFFFFF));
132+
gpio.fall_ie().write(|w| w.bits(0xFFFFFFFF));
133+
},
134+
}
135+
}
136+
137+
/// Disables the specified interrupt event for all the GPIO pins.
138+
pub fn disable_interrupts(&mut self, event: EventType) {
139+
let gpio = unsafe { Gpio0::steal() };
140+
141+
match event {
142+
EventType::High => unsafe {
143+
gpio.high_ie().write(|w| w.bits(0x00000000));
144+
},
145+
EventType::Low => unsafe {
146+
gpio.low_ie().write(|w| w.bits(0x00000000));
147+
},
148+
EventType::BothLevels => unsafe {
149+
gpio.high_ie().write(|w| w.bits(0x00000000));
150+
gpio.low_ie().write(|w| w.bits(0x00000000));
151+
},
152+
EventType::Rise => unsafe {
153+
gpio.rise_ie().write(|w| w.bits(0x00000000));
154+
},
155+
EventType::Fall => unsafe {
156+
gpio.fall_ie().write(|w| w.bits(0x00000000));
157+
},
158+
EventType::BothEdges => unsafe {
159+
gpio.rise_ie().write(|w| w.bits(0x00000000));
160+
gpio.fall_ie().write(|w| w.bits(0x00000000));
161+
},
162+
EventType::All => unsafe {
163+
gpio.high_ie().write(|w| w.bits(0x00000000));
164+
gpio.low_ie().write(|w| w.bits(0x00000000));
165+
gpio.rise_ie().write(|w| w.bits(0x00000000));
166+
gpio.fall_ie().write(|w| w.bits(0x00000000));
167+
},
168+
}
169+
}
170+
171+
/// Clears the specified interrupt event pending flag for all the GPIO pins.
172+
pub fn clear_interrupts(&mut self, event: EventType) {
173+
let gpio = unsafe { Gpio0::steal() };
174+
175+
match event {
176+
EventType::High => unsafe {
177+
gpio.high_ip().write(|w| w.bits(0xFFFFFFFF));
178+
},
179+
EventType::Low => unsafe {
180+
gpio.low_ip().write(|w| w.bits(0xFFFFFFFF));
181+
},
182+
EventType::BothLevels => unsafe {
183+
gpio.high_ip().write(|w| w.bits(0xFFFFFFFF));
184+
gpio.low_ip().write(|w| w.bits(0xFFFFFFFF));
185+
},
186+
EventType::Rise => unsafe {
187+
gpio.rise_ip().write(|w| w.bits(0xFFFFFFFF));
188+
},
189+
EventType::Fall => unsafe {
190+
gpio.fall_ip().write(|w| w.bits(0xFFFFFFFF));
191+
},
192+
EventType::BothEdges => unsafe {
193+
gpio.rise_ip().write(|w| w.bits(0xFFFFFFFF));
194+
gpio.fall_ip().write(|w| w.bits(0xFFFFFFFF));
195+
},
196+
EventType::All => unsafe {
197+
gpio.high_ip().write(|w| w.bits(0xFFFFFFFF));
198+
gpio.low_ip().write(|w| w.bits(0xFFFFFFFF));
199+
gpio.rise_ip().write(|w| w.bits(0xFFFFFFFF));
200+
gpio.fall_ip().write(|w| w.bits(0xFFFFFFFF));
201+
},
202+
}
203+
}
204+
}
205+
95206
impl From<Gpio0> for DeviceGpioPins {
96207
fn from(gpio: Gpio0) -> Self {
97208
let parts = gpio.split();

0 commit comments

Comments
 (0)