diff options
| author | pennae <[email protected]> | 2023-05-15 15:21:05 +0200 |
|---|---|---|
| committer | pennae <[email protected]> | 2023-05-15 15:24:56 +0200 |
| commit | 14a5d03af2a74eccaa9930bdf81eef43791a4b33 (patch) | |
| tree | 3a0879c21cf09702c670b14672e62b940a2157f0 /embassy-rp/src/adc.rs | |
| parent | 82f7e104d90a6628d1873017ea5ef6a7afb3b3f7 (diff) | |
rp: remove take!, add bind_interrupts!
Diffstat (limited to 'embassy-rp/src/adc.rs')
| -rw-r--r-- | embassy-rp/src/adc.rs | 31 |
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; | |||
| 3 | use core::sync::atomic::{compiler_fence, Ordering}; | 3 | use core::sync::atomic::{compiler_fence, Ordering}; |
| 4 | use core::task::Poll; | 4 | use core::task::Poll; |
| 5 | 5 | ||
| 6 | use embassy_hal_common::into_ref; | 6 | use embassy_cortex_m::interrupt::{Binding, Interrupt}; |
| 7 | use embassy_sync::waitqueue::AtomicWaker; | 7 | use embassy_sync::waitqueue::AtomicWaker; |
| 8 | use embedded_hal_02::adc::{Channel, OneShot}; | 8 | use embedded_hal_02::adc::{Channel, OneShot}; |
| 9 | 9 | ||
| 10 | use crate::gpio::Pin; | 10 | use crate::gpio::Pin; |
| 11 | use crate::interrupt::{self, InterruptExt}; | 11 | use crate::interrupt::{self, InterruptExt, ADC_IRQ_FIFO}; |
| 12 | use crate::peripherals::ADC; | 12 | use crate::peripherals::ADC; |
| 13 | use crate::{pac, peripherals, Peripheral}; | 13 | use crate::{pac, peripherals, Peripheral}; |
| 14 | static WAKER: AtomicWaker = AtomicWaker::new(); | 14 | static 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 | ||
| 163 | pub struct InterruptHandler { | ||
| 164 | _empty: (), | ||
| 165 | } | ||
| 166 | |||
| 167 | impl 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 | |||
| 168 | impl_pin!(PIN_26, 0); | 175 | impl_pin!(PIN_26, 0); |
| 169 | impl_pin!(PIN_27, 1); | 176 | impl_pin!(PIN_27, 1); |
| 170 | impl_pin!(PIN_28, 2); | 177 | impl_pin!(PIN_28, 2); |
