diff options
| author | Dario Nieuwenhuis <[email protected]> | 2020-12-29 01:53:17 +0100 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2020-12-29 01:53:17 +0100 |
| commit | af5454fbfec6232074c79ef571b2135dc7253d45 (patch) | |
| tree | 2dd99c7e6ca0ae1b0c7634d0bb983c862dcbdad5 /embassy-nrf/src/gpiote.rs | |
| parent | 4b8d8ba87ee26173b0a7743c606c76df2d171790 (diff) | |
Update drivers to owned irqs.
Diffstat (limited to 'embassy-nrf/src/gpiote.rs')
| -rw-r--r-- | embassy-nrf/src/gpiote.rs | 75 |
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 | ||
| 8 | use crate::hal::gpio::{Input, Level, Output, Pin, Port}; | 8 | use crate::hal::gpio::{Input, Level, Output, Pin, Port}; |
| 9 | use crate::interrupt; | 9 | use crate::interrupt; |
| 10 | use crate::interrupt::OwnedInterrupt; | ||
| 10 | use crate::pac::generic::Reg; | 11 | use crate::pac::generic::Reg; |
| 11 | use crate::pac::gpiote::_TASKS_OUT; | 12 | use 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 | ||
| 60 | impl Gpiote { | 61 | impl 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 | ||
| 298 | pub struct PortInputFuture<'a, T> { | 333 | pub struct PortInputFuture<'a, T> { |
| @@ -413,40 +448,6 @@ impl<'a> OutputChannel<'a> { | |||
| 413 | } | 448 | } |
| 414 | } | 449 | } |
| 415 | 450 | ||
| 416 | #[interrupt] | ||
| 417 | unsafe 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 | |||
| 450 | struct BitIter(u32); | 451 | struct BitIter(u32); |
| 451 | 452 | ||
| 452 | impl Iterator for BitIter { | 453 | impl Iterator for BitIter { |
