aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2021-05-12 01:01:08 +0200
committerDario Nieuwenhuis <[email protected]>2021-05-17 00:57:20 +0200
commit97b01f1c4799a66bc2af596bfc5138ccf919a6de (patch)
treea2d705f32bf9e5abea5cdb0239ec2b2b31092c4d
parent92be72e0e3917782aade44e5b4cdbebb2dbab46e (diff)
nrf/gpiote: initialize automatically
-rw-r--r--embassy-nrf-examples/src/bin/gpiote_channel.rs5
-rw-r--r--embassy-nrf-examples/src/bin/gpiote_port.rs13
-rw-r--r--embassy-nrf-examples/src/bin/ppi.rs7
-rw-r--r--embassy-nrf/src/chips/nrf52805.rs1
-rw-r--r--embassy-nrf/src/chips/nrf52810.rs1
-rw-r--r--embassy-nrf/src/chips/nrf52811.rs1
-rw-r--r--embassy-nrf/src/chips/nrf52820.rs1
-rw-r--r--embassy-nrf/src/chips/nrf52832.rs1
-rw-r--r--embassy-nrf/src/chips/nrf52833.rs1
-rw-r--r--embassy-nrf/src/chips/nrf52840.rs1
-rw-r--r--embassy-nrf/src/gpiote.rs41
-rw-r--r--embassy-nrf/src/system.rs3
12 files changed, 21 insertions, 55 deletions
diff --git a/embassy-nrf-examples/src/bin/gpiote_channel.rs b/embassy-nrf-examples/src/bin/gpiote_channel.rs
index 9e653192b..ee670acd5 100644
--- a/embassy-nrf-examples/src/bin/gpiote_channel.rs
+++ b/embassy-nrf-examples/src/bin/gpiote_channel.rs
@@ -18,30 +18,25 @@ use embassy_nrf::{interrupt, Peripherals};
18#[embassy::main] 18#[embassy::main]
19async fn main(spawner: Spawner) { 19async fn main(spawner: Spawner) {
20 let p = Peripherals::take().unwrap(); 20 let p = Peripherals::take().unwrap();
21 let g = gpiote::initialize(p.GPIOTE, interrupt::take!(GPIOTE));
22 21
23 info!("Starting!"); 22 info!("Starting!");
24 23
25 let ch1 = InputChannel::new( 24 let ch1 = InputChannel::new(
26 g,
27 p.GPIOTE_CH0, 25 p.GPIOTE_CH0,
28 Input::new(p.P0_11, Pull::Up), 26 Input::new(p.P0_11, Pull::Up),
29 InputChannelPolarity::HiToLo, 27 InputChannelPolarity::HiToLo,
30 ); 28 );
31 let ch2 = InputChannel::new( 29 let ch2 = InputChannel::new(
32 g,
33 p.GPIOTE_CH1, 30 p.GPIOTE_CH1,
34 Input::new(p.P0_12, Pull::Up), 31 Input::new(p.P0_12, Pull::Up),
35 InputChannelPolarity::LoToHi, 32 InputChannelPolarity::LoToHi,
36 ); 33 );
37 let ch3 = InputChannel::new( 34 let ch3 = InputChannel::new(
38 g,
39 p.GPIOTE_CH2, 35 p.GPIOTE_CH2,
40 Input::new(p.P0_24, Pull::Up), 36 Input::new(p.P0_24, Pull::Up),
41 InputChannelPolarity::Toggle, 37 InputChannelPolarity::Toggle,
42 ); 38 );
43 let ch4 = InputChannel::new( 39 let ch4 = InputChannel::new(
44 g,
45 p.GPIOTE_CH3, 40 p.GPIOTE_CH3,
46 Input::new(p.P0_25, Pull::Up), 41 Input::new(p.P0_25, Pull::Up),
47 InputChannelPolarity::Toggle, 42 InputChannelPolarity::Toggle,
diff --git a/embassy-nrf-examples/src/bin/gpiote_port.rs b/embassy-nrf-examples/src/bin/gpiote_port.rs
index 386806dfc..717d3398b 100644
--- a/embassy-nrf-examples/src/bin/gpiote_port.rs
+++ b/embassy-nrf-examples/src/bin/gpiote_port.rs
@@ -8,12 +8,11 @@
8#[path = "../example_common.rs"] 8#[path = "../example_common.rs"]
9mod example_common; 9mod example_common;
10 10
11use core::pin::Pin;
12use defmt::panic; 11use defmt::panic;
13use embassy::executor::Spawner; 12use embassy::executor::Spawner;
14use embassy::traits::gpio::{WaitForHigh, WaitForLow}; 13use embassy::traits::gpio::{WaitForHigh, WaitForLow};
15use embassy_nrf::gpio::{AnyPin, Input, Pin as _, Pull}; 14use embassy_nrf::gpio::{AnyPin, Input, Pin as _, Pull};
16use embassy_nrf::gpiote::{self, PortInput}; 15use embassy_nrf::gpiote::PortInput;
17use embassy_nrf::interrupt; 16use embassy_nrf::interrupt;
18use embassy_nrf::Peripherals; 17use embassy_nrf::Peripherals;
19use example_common::*; 18use example_common::*;
@@ -32,12 +31,12 @@ async fn button_task(n: usize, mut pin: PortInput<'static, AnyPin>) {
32async fn main(spawner: Spawner) { 31async fn main(spawner: Spawner) {
33 let p = Peripherals::take().unwrap(); 32 let p = Peripherals::take().unwrap();
34 33
35 let g = gpiote::initialize(p.GPIOTE, interrupt::take!(GPIOTE)); 34 info!("Starting!");
36 35
37 let btn1 = PortInput::new(g, Input::new(p.P0_11.degrade(), Pull::Up)); 36 let btn1 = PortInput::new(Input::new(p.P0_11.degrade(), Pull::Up));
38 let btn2 = PortInput::new(g, Input::new(p.P0_12.degrade(), Pull::Up)); 37 let btn2 = PortInput::new(Input::new(p.P0_12.degrade(), Pull::Up));
39 let btn3 = PortInput::new(g, Input::new(p.P0_24.degrade(), Pull::Up)); 38 let btn3 = PortInput::new(Input::new(p.P0_24.degrade(), Pull::Up));
40 let btn4 = PortInput::new(g, Input::new(p.P0_25.degrade(), Pull::Up)); 39 let btn4 = PortInput::new(Input::new(p.P0_25.degrade(), Pull::Up));
41 40
42 spawner.spawn(button_task(1, btn1)).unwrap(); 41 spawner.spawn(button_task(1, btn1)).unwrap();
43 spawner.spawn(button_task(2, btn2)).unwrap(); 42 spawner.spawn(button_task(2, btn2)).unwrap();
diff --git a/embassy-nrf-examples/src/bin/ppi.rs b/embassy-nrf-examples/src/bin/ppi.rs
index aeda76f21..3c39e032e 100644
--- a/embassy-nrf-examples/src/bin/ppi.rs
+++ b/embassy-nrf-examples/src/bin/ppi.rs
@@ -21,44 +21,37 @@ use gpiote::{OutputChannel, OutputChannelPolarity};
21#[embassy::main] 21#[embassy::main]
22async fn main(spawner: Spawner) { 22async fn main(spawner: Spawner) {
23 let p = Peripherals::take().unwrap(); 23 let p = Peripherals::take().unwrap();
24 let g = gpiote::initialize(p.GPIOTE, interrupt::take!(GPIOTE));
25 24
26 info!("Starting!"); 25 info!("Starting!");
27 26
28 let button1 = InputChannel::new( 27 let button1 = InputChannel::new(
29 g,
30 p.GPIOTE_CH0, 28 p.GPIOTE_CH0,
31 Input::new(p.P0_11, Pull::Up), 29 Input::new(p.P0_11, Pull::Up),
32 InputChannelPolarity::HiToLo, 30 InputChannelPolarity::HiToLo,
33 ); 31 );
34 let button2 = InputChannel::new( 32 let button2 = InputChannel::new(
35 g,
36 p.GPIOTE_CH1, 33 p.GPIOTE_CH1,
37 Input::new(p.P0_12, Pull::Up), 34 Input::new(p.P0_12, Pull::Up),
38 InputChannelPolarity::HiToLo, 35 InputChannelPolarity::HiToLo,
39 ); 36 );
40 let button3 = InputChannel::new( 37 let button3 = InputChannel::new(
41 g,
42 p.GPIOTE_CH2, 38 p.GPIOTE_CH2,
43 Input::new(p.P0_24, Pull::Up), 39 Input::new(p.P0_24, Pull::Up),
44 InputChannelPolarity::HiToLo, 40 InputChannelPolarity::HiToLo,
45 ); 41 );
46 let button4 = InputChannel::new( 42 let button4 = InputChannel::new(
47 g,
48 p.GPIOTE_CH3, 43 p.GPIOTE_CH3,
49 Input::new(p.P0_25, Pull::Up), 44 Input::new(p.P0_25, Pull::Up),
50 InputChannelPolarity::HiToLo, 45 InputChannelPolarity::HiToLo,
51 ); 46 );
52 47
53 let led1 = OutputChannel::new( 48 let led1 = OutputChannel::new(
54 g,
55 p.GPIOTE_CH4, 49 p.GPIOTE_CH4,
56 Output::new(p.P0_13, Level::Low, OutputDrive::Standard), 50 Output::new(p.P0_13, Level::Low, OutputDrive::Standard),
57 OutputChannelPolarity::Toggle, 51 OutputChannelPolarity::Toggle,
58 ); 52 );
59 53
60 let led2 = OutputChannel::new( 54 let led2 = OutputChannel::new(
61 g,
62 p.GPIOTE_CH5, 55 p.GPIOTE_CH5,
63 Output::new(p.P0_14, Level::Low, OutputDrive::Standard), 56 Output::new(p.P0_14, Level::Low, OutputDrive::Standard),
64 OutputChannelPolarity::Toggle, 57 OutputChannelPolarity::Toggle,
diff --git a/embassy-nrf/src/chips/nrf52805.rs b/embassy-nrf/src/chips/nrf52805.rs
index 8b2ba7c00..272cabc06 100644
--- a/embassy-nrf/src/chips/nrf52805.rs
+++ b/embassy-nrf/src/chips/nrf52805.rs
@@ -24,7 +24,6 @@ embassy_extras::peripherals! {
24 TIMER2, 24 TIMER2,
25 25
26 // GPIOTE 26 // GPIOTE
27 GPIOTE,
28 GPIOTE_CH0, 27 GPIOTE_CH0,
29 GPIOTE_CH1, 28 GPIOTE_CH1,
30 GPIOTE_CH2, 29 GPIOTE_CH2,
diff --git a/embassy-nrf/src/chips/nrf52810.rs b/embassy-nrf/src/chips/nrf52810.rs
index 9f3ed9cf3..2e77a2fad 100644
--- a/embassy-nrf/src/chips/nrf52810.rs
+++ b/embassy-nrf/src/chips/nrf52810.rs
@@ -24,7 +24,6 @@ embassy_extras::peripherals! {
24 TIMER2, 24 TIMER2,
25 25
26 // GPIOTE 26 // GPIOTE
27 GPIOTE,
28 GPIOTE_CH0, 27 GPIOTE_CH0,
29 GPIOTE_CH1, 28 GPIOTE_CH1,
30 GPIOTE_CH2, 29 GPIOTE_CH2,
diff --git a/embassy-nrf/src/chips/nrf52811.rs b/embassy-nrf/src/chips/nrf52811.rs
index 6728f6a41..b3ad5817a 100644
--- a/embassy-nrf/src/chips/nrf52811.rs
+++ b/embassy-nrf/src/chips/nrf52811.rs
@@ -24,7 +24,6 @@ embassy_extras::peripherals! {
24 TIMER2, 24 TIMER2,
25 25
26 // GPIOTE 26 // GPIOTE
27 GPIOTE,
28 GPIOTE_CH0, 27 GPIOTE_CH0,
29 GPIOTE_CH1, 28 GPIOTE_CH1,
30 GPIOTE_CH2, 29 GPIOTE_CH2,
diff --git a/embassy-nrf/src/chips/nrf52820.rs b/embassy-nrf/src/chips/nrf52820.rs
index 2f9eb5f53..d0a8b9e9a 100644
--- a/embassy-nrf/src/chips/nrf52820.rs
+++ b/embassy-nrf/src/chips/nrf52820.rs
@@ -25,7 +25,6 @@ embassy_extras::peripherals! {
25 TIMER3, 25 TIMER3,
26 26
27 // GPIOTE 27 // GPIOTE
28 GPIOTE,
29 GPIOTE_CH0, 28 GPIOTE_CH0,
30 GPIOTE_CH1, 29 GPIOTE_CH1,
31 GPIOTE_CH2, 30 GPIOTE_CH2,
diff --git a/embassy-nrf/src/chips/nrf52832.rs b/embassy-nrf/src/chips/nrf52832.rs
index 015bc51f8..ed94430e4 100644
--- a/embassy-nrf/src/chips/nrf52832.rs
+++ b/embassy-nrf/src/chips/nrf52832.rs
@@ -29,7 +29,6 @@ embassy_extras::peripherals! {
29 TIMER4, 29 TIMER4,
30 30
31 // GPIOTE 31 // GPIOTE
32 GPIOTE,
33 GPIOTE_CH0, 32 GPIOTE_CH0,
34 GPIOTE_CH1, 33 GPIOTE_CH1,
35 GPIOTE_CH2, 34 GPIOTE_CH2,
diff --git a/embassy-nrf/src/chips/nrf52833.rs b/embassy-nrf/src/chips/nrf52833.rs
index 404883934..080157d69 100644
--- a/embassy-nrf/src/chips/nrf52833.rs
+++ b/embassy-nrf/src/chips/nrf52833.rs
@@ -30,7 +30,6 @@ embassy_extras::peripherals! {
30 TIMER4, 30 TIMER4,
31 31
32 // GPIOTE 32 // GPIOTE
33 GPIOTE,
34 GPIOTE_CH0, 33 GPIOTE_CH0,
35 GPIOTE_CH1, 34 GPIOTE_CH1,
36 GPIOTE_CH2, 35 GPIOTE_CH2,
diff --git a/embassy-nrf/src/chips/nrf52840.rs b/embassy-nrf/src/chips/nrf52840.rs
index 26dfc7e8f..06b508d89 100644
--- a/embassy-nrf/src/chips/nrf52840.rs
+++ b/embassy-nrf/src/chips/nrf52840.rs
@@ -33,7 +33,6 @@ embassy_extras::peripherals! {
33 TIMER4, 33 TIMER4,
34 34
35 // GPIOTE 35 // GPIOTE
36 GPIOTE,
37 GPIOTE_CH0, 36 GPIOTE_CH0,
38 GPIOTE_CH1, 37 GPIOTE_CH1,
39 GPIOTE_CH2, 38 GPIOTE_CH2,
diff --git a/embassy-nrf/src/gpiote.rs b/embassy-nrf/src/gpiote.rs
index bfa5ba68b..f322c1694 100644
--- a/embassy-nrf/src/gpiote.rs
+++ b/embassy-nrf/src/gpiote.rs
@@ -2,7 +2,7 @@ use core::convert::Infallible;
2use core::future::Future; 2use core::future::Future;
3use core::marker::PhantomData; 3use core::marker::PhantomData;
4use core::task::{Context, Poll}; 4use core::task::{Context, Poll};
5use embassy::interrupt::InterruptExt; 5use embassy::interrupt::{Interrupt, InterruptExt};
6use embassy::traits::gpio::{WaitForAnyEdge, WaitForHigh, WaitForLow}; 6use embassy::traits::gpio::{WaitForAnyEdge, WaitForHigh, WaitForLow};
7use embassy::util::AtomicWaker; 7use embassy::util::AtomicWaker;
8use embassy_extras::impl_unborrow; 8use embassy_extras::impl_unborrow;
@@ -40,15 +40,7 @@ pub enum OutputChannelPolarity {
40 Toggle, 40 Toggle,
41} 41}
42 42
43/// Token indicating GPIOTE has been correctly initialized. 43pub(crate) fn init() {
44///
45/// This is not an owned singleton, it is Copy. Drivers that make use of GPIOTE require it.
46#[derive(Clone, Copy)]
47pub struct Initialized {
48 _private: (),
49}
50
51pub fn initialize(_gpiote: peripherals::GPIOTE, irq: interrupt::GPIOTE) -> Initialized {
52 #[cfg(any(feature = "nrf52833", feature = "nrf52840"))] 44 #[cfg(any(feature = "nrf52833", feature = "nrf52840"))]
53 let ports = unsafe { &[&*pac::P0::ptr(), &*pac::P1::ptr()] }; 45 let ports = unsafe { &[&*pac::P0::ptr(), &*pac::P1::ptr()] };
54 #[cfg(not(any(feature = "nrf52833", feature = "nrf52840")))] 46 #[cfg(not(any(feature = "nrf52833", feature = "nrf52840")))]
@@ -62,17 +54,18 @@ pub fn initialize(_gpiote: peripherals::GPIOTE, irq: interrupt::GPIOTE) -> Initi
62 } 54 }
63 55
64 // Enable interrupts 56 // Enable interrupts
65 let g = unsafe { &*pac::GPIOTE::ptr() }; 57
66 g.events_port.write(|w| w); 58 let irq = unsafe { interrupt::GPIOTE::steal() };
67 g.intenset.write(|w| w.port().set());
68 irq.set_handler(on_irq);
69 irq.unpend(); 59 irq.unpend();
70 irq.enable(); 60 irq.enable();
71 61
72 Initialized { _private: () } 62 let g = unsafe { &*pac::GPIOTE::ptr() };
63 g.events_port.write(|w| w);
64 g.intenset.write(|w| w.port().set());
73} 65}
74 66
75unsafe fn on_irq(_ctx: *mut ()) { 67#[interrupt]
68unsafe fn GPIOTE() {
76 let g = &*pac::GPIOTE::ptr(); 69 let g = &*pac::GPIOTE::ptr();
77 70
78 for i in 0..CHANNEL_COUNT { 71 for i in 0..CHANNEL_COUNT {
@@ -133,12 +126,7 @@ impl<'d, C: Channel, T: GpioPin> Drop for InputChannel<'d, C, T> {
133} 126}
134 127
135impl<'d, C: Channel, T: GpioPin> InputChannel<'d, C, T> { 128impl<'d, C: Channel, T: GpioPin> InputChannel<'d, C, T> {
136 pub fn new( 129 pub fn new(ch: C, pin: Input<'d, T>, polarity: InputChannelPolarity) -> Self {
137 _init: Initialized,
138 ch: C,
139 pin: Input<'d, T>,
140 polarity: InputChannelPolarity,
141 ) -> Self {
142 let g = unsafe { &*pac::GPIOTE::ptr() }; 130 let g = unsafe { &*pac::GPIOTE::ptr() };
143 let num = ch.number(); 131 let num = ch.number();
144 132
@@ -217,12 +205,7 @@ impl<'d, C: Channel, T: GpioPin> Drop for OutputChannel<'d, C, T> {
217} 205}
218 206
219impl<'d, C: Channel, T: GpioPin> OutputChannel<'d, C, T> { 207impl<'d, C: Channel, T: GpioPin> OutputChannel<'d, C, T> {
220 pub fn new( 208 pub fn new(ch: C, pin: Output<'d, T>, polarity: OutputChannelPolarity) -> Self {
221 _init: Initialized,
222 ch: C,
223 pin: Output<'d, T>,
224 polarity: OutputChannelPolarity,
225 ) -> Self {
226 let g = unsafe { &*pac::GPIOTE::ptr() }; 209 let g = unsafe { &*pac::GPIOTE::ptr() };
227 let num = ch.number(); 210 let num = ch.number();
228 211
@@ -297,7 +280,7 @@ pub struct PortInput<'d, T: GpioPin> {
297impl<'d, T: GpioPin> Unpin for PortInput<'d, T> {} 280impl<'d, T: GpioPin> Unpin for PortInput<'d, T> {}
298 281
299impl<'d, T: GpioPin> PortInput<'d, T> { 282impl<'d, T: GpioPin> PortInput<'d, T> {
300 pub fn new(_init: Initialized, pin: Input<'d, T>) -> Self { 283 pub fn new(pin: Input<'d, T>) -> Self {
301 Self { pin } 284 Self { pin }
302 } 285 }
303} 286}
diff --git a/embassy-nrf/src/system.rs b/embassy-nrf/src/system.rs
index 5d36e66fa..e358d2c38 100644
--- a/embassy-nrf/src/system.rs
+++ b/embassy-nrf/src/system.rs
@@ -73,4 +73,7 @@ pub unsafe fn configure(config: Config) {
73 r.events_lfclkstarted.write(|w| unsafe { w.bits(0) }); 73 r.events_lfclkstarted.write(|w| unsafe { w.bits(0) });
74 r.tasks_lfclkstart.write(|w| unsafe { w.bits(1) }); 74 r.tasks_lfclkstart.write(|w| unsafe { w.bits(1) });
75 while r.events_lfclkstarted.read().bits() == 0 {} 75 while r.events_lfclkstarted.read().bits() == 0 {}
76
77 // Init GPIOTE
78 crate::gpiote::init();
76} 79}