aboutsummaryrefslogtreecommitdiff
path: root/embassy-nrf/src/gpiote.rs
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2020-12-29 01:53:17 +0100
committerDario Nieuwenhuis <[email protected]>2020-12-29 01:53:17 +0100
commitaf5454fbfec6232074c79ef571b2135dc7253d45 (patch)
tree2dd99c7e6ca0ae1b0c7634d0bb983c862dcbdad5 /embassy-nrf/src/gpiote.rs
parent4b8d8ba87ee26173b0a7743c606c76df2d171790 (diff)
Update drivers to owned irqs.
Diffstat (limited to 'embassy-nrf/src/gpiote.rs')
-rw-r--r--embassy-nrf/src/gpiote.rs75
1 files changed, 38 insertions, 37 deletions
diff --git a/embassy-nrf/src/gpiote.rs b/embassy-nrf/src/gpiote.rs
index 069e9140b..353f6a94c 100644
--- a/embassy-nrf/src/gpiote.rs
+++ b/embassy-nrf/src/gpiote.rs
@@ -7,6 +7,7 @@ use embassy::util::Signal;
7 7
8use crate::hal::gpio::{Input, Level, Output, Pin, Port}; 8use crate::hal::gpio::{Input, Level, Output, Pin, Port};
9use crate::interrupt; 9use crate::interrupt;
10use crate::interrupt::OwnedInterrupt;
10use crate::pac::generic::Reg; 11use crate::pac::generic::Reg;
11use crate::pac::gpiote::_TASKS_OUT; 12use crate::pac::gpiote::_TASKS_OUT;
12#[cfg(any(feature = "52833", feature = "52840"))] 13#[cfg(any(feature = "52833", feature = "52840"))]
@@ -58,7 +59,7 @@ pub enum NewChannelError {
58} 59}
59 60
60impl Gpiote { 61impl Gpiote {
61 pub fn new(gpiote: GPIOTE) -> Self { 62 pub fn new(gpiote: GPIOTE, irq: interrupt::GPIOTEInterrupt) -> Self {
62 #[cfg(any(feature = "52833", feature = "52840"))] 63 #[cfg(any(feature = "52833", feature = "52840"))]
63 let ports = unsafe { &[&*P0::ptr(), &*P1::ptr()] }; 64 let ports = unsafe { &[&*P0::ptr(), &*P1::ptr()] };
64 #[cfg(not(any(feature = "52833", feature = "52840")))] 65 #[cfg(not(any(feature = "52833", feature = "52840")))]
@@ -74,8 +75,9 @@ impl Gpiote {
74 // Enable interrupts 75 // Enable interrupts
75 gpiote.events_port.write(|w| w); 76 gpiote.events_port.write(|w| w);
76 gpiote.intenset.write(|w| w.port().set()); 77 gpiote.intenset.write(|w| w.port().set());
77 interrupt::unpend(interrupt::GPIOTE); 78 irq.set_handler(Self::on_irq);
78 interrupt::enable(interrupt::GPIOTE); 79 irq.unpend();
80 irq.enable();
79 81
80 Self { 82 Self {
81 inner: gpiote, 83 inner: gpiote,
@@ -293,6 +295,39 @@ impl Gpiote {
293 }) 295 })
294 }) 296 })
295 } 297 }
298
299 unsafe fn on_irq() {
300 let s = &(*INSTANCE);
301
302 for i in 0..8 {
303 if s.inner.events_in[i].read().bits() != 0 {
304 s.inner.events_in[i].write(|w| w);
305 s.channel_signals[i].signal(());
306 }
307 }
308
309 if s.inner.events_port.read().bits() != 0 {
310 s.inner.events_port.write(|w| w);
311
312 #[cfg(any(feature = "52833", feature = "52840"))]
313 let ports = &[&*P0::ptr(), &*P1::ptr()];
314 #[cfg(not(any(feature = "52833", feature = "52840")))]
315 let ports = &[&*P0::ptr()];
316
317 let mut work = true;
318 while work {
319 work = false;
320 for (port, &p) in ports.iter().enumerate() {
321 for pin in BitIter(p.latch.read().bits()) {
322 work = true;
323 p.pin_cnf[pin as usize].modify(|_, w| w.sense().disabled());
324 p.latch.write(|w| w.bits(1 << pin));
325 s.port_signals[port * 32 + pin as usize].signal(());
326 }
327 }
328 }
329 }
330 }
296} 331}
297 332
298pub struct PortInputFuture<'a, T> { 333pub struct PortInputFuture<'a, T> {
@@ -413,40 +448,6 @@ impl<'a> OutputChannel<'a> {
413 } 448 }
414} 449}
415 450
416#[interrupt]
417unsafe fn GPIOTE() {
418 let s = &(*INSTANCE);
419
420 for i in 0..8 {
421 if s.inner.events_in[i].read().bits() != 0 {
422 s.inner.events_in[i].write(|w| w);
423 s.channel_signals[i].signal(());
424 }
425 }
426
427 if s.inner.events_port.read().bits() != 0 {
428 s.inner.events_port.write(|w| w);
429
430 #[cfg(any(feature = "52833", feature = "52840"))]
431 let ports = &[&*P0::ptr(), &*P1::ptr()];
432 #[cfg(not(any(feature = "52833", feature = "52840")))]
433 let ports = &[&*P0::ptr()];
434
435 let mut work = true;
436 while work {
437 work = false;
438 for (port, &p) in ports.iter().enumerate() {
439 for pin in BitIter(p.latch.read().bits()) {
440 work = true;
441 p.pin_cnf[pin as usize].modify(|_, w| w.sense().disabled());
442 p.latch.write(|w| w.bits(1 << pin));
443 s.port_signals[port * 32 + pin as usize].signal(());
444 }
445 }
446 }
447 }
448}
449
450struct BitIter(u32); 451struct BitIter(u32);
451 452
452impl Iterator for BitIter { 453impl Iterator for BitIter {