aboutsummaryrefslogtreecommitdiff
path: root/embassy-rp/src/adc.rs
diff options
context:
space:
mode:
authorpennae <[email protected]>2023-05-15 15:21:05 +0200
committerpennae <[email protected]>2023-05-15 15:24:56 +0200
commit14a5d03af2a74eccaa9930bdf81eef43791a4b33 (patch)
tree3a0879c21cf09702c670b14672e62b940a2157f0 /embassy-rp/src/adc.rs
parent82f7e104d90a6628d1873017ea5ef6a7afb3b3f7 (diff)
rp: remove take!, add bind_interrupts!
Diffstat (limited to 'embassy-rp/src/adc.rs')
-rw-r--r--embassy-rp/src/adc.rs31
1 files changed, 19 insertions, 12 deletions
diff --git a/embassy-rp/src/adc.rs b/embassy-rp/src/adc.rs
index 145ba9c59..59c7a47ce 100644
--- a/embassy-rp/src/adc.rs
+++ b/embassy-rp/src/adc.rs
@@ -3,12 +3,12 @@ use core::marker::PhantomData;
3use core::sync::atomic::{compiler_fence, Ordering}; 3use core::sync::atomic::{compiler_fence, Ordering};
4use core::task::Poll; 4use core::task::Poll;
5 5
6use embassy_hal_common::into_ref; 6use embassy_cortex_m::interrupt::{Binding, Interrupt};
7use embassy_sync::waitqueue::AtomicWaker; 7use embassy_sync::waitqueue::AtomicWaker;
8use embedded_hal_02::adc::{Channel, OneShot}; 8use embedded_hal_02::adc::{Channel, OneShot};
9 9
10use crate::gpio::Pin; 10use crate::gpio::Pin;
11use crate::interrupt::{self, InterruptExt}; 11use crate::interrupt::{self, InterruptExt, ADC_IRQ_FIFO};
12use crate::peripherals::ADC; 12use crate::peripherals::ADC;
13use crate::{pac, peripherals, Peripheral}; 13use crate::{pac, peripherals, Peripheral};
14static WAKER: AtomicWaker = AtomicWaker::new(); 14static WAKER: AtomicWaker = AtomicWaker::new();
@@ -47,10 +47,9 @@ impl<'d> Adc<'d> {
47 47
48 pub fn new( 48 pub fn new(
49 _inner: impl Peripheral<P = ADC> + 'd, 49 _inner: impl Peripheral<P = ADC> + 'd,
50 irq: impl Peripheral<P = interrupt::ADC_IRQ_FIFO> + 'd, 50 _irq: impl Binding<ADC_IRQ_FIFO, InterruptHandler>,
51 _config: Config, 51 _config: Config,
52 ) -> Self { 52 ) -> Self {
53 into_ref!(irq);
54 unsafe { 53 unsafe {
55 let reset = Self::reset(); 54 let reset = Self::reset();
56 crate::reset::reset(reset); 55 crate::reset::reset(reset);
@@ -63,14 +62,10 @@ impl<'d> Adc<'d> {
63 } 62 }
64 63
65 // Setup IRQ 64 // Setup IRQ
66 irq.disable(); 65 unsafe {
67 irq.set_handler(|_| unsafe { 66 ADC_IRQ_FIFO::steal().unpend();
68 let r = Self::regs(); 67 ADC_IRQ_FIFO::steal().enable();
69 r.inte().write(|w| w.set_fifo(false)); 68 };
70 WAKER.wake();
71 });
72 irq.unpend();
73 irq.enable();
74 69
75 Self { phantom: PhantomData } 70 Self { phantom: PhantomData }
76 } 71 }
@@ -165,6 +160,18 @@ macro_rules! impl_pin {
165 }; 160 };
166} 161}
167 162
163pub struct InterruptHandler {
164 _empty: (),
165}
166
167impl interrupt::Handler<ADC_IRQ_FIFO> for InterruptHandler {
168 unsafe fn on_interrupt() {
169 let r = Adc::regs();
170 r.inte().write(|w| w.set_fifo(false));
171 WAKER.wake();
172 }
173}
174
168impl_pin!(PIN_26, 0); 175impl_pin!(PIN_26, 0);
169impl_pin!(PIN_27, 1); 176impl_pin!(PIN_27, 1);
170impl_pin!(PIN_28, 2); 177impl_pin!(PIN_28, 2);