diff options
| author | Dario Nieuwenhuis <[email protected]> | 2024-02-21 22:29:37 +0100 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2024-02-21 22:29:37 +0100 |
| commit | 4fbe18f82134567af4766d161e8385c7dd919a0b (patch) | |
| tree | c681ce44b8675ba9c5f0767fdfad632133e75f7b | |
| parent | 1f17fdf84ee30f989a1a5bd8945a76a9f5edac4b (diff) | |
nrf/uart: share waker state between buffered and nonbuffered.
| -rw-r--r-- | embassy-nrf/src/buffered_uarte.rs | 19 | ||||
| -rw-r--r-- | embassy-nrf/src/uarte.rs | 18 |
2 files changed, 18 insertions, 19 deletions
diff --git a/embassy-nrf/src/buffered_uarte.rs b/embassy-nrf/src/buffered_uarte.rs index b1b639f10..18416483f 100644 --- a/embassy-nrf/src/buffered_uarte.rs +++ b/embassy-nrf/src/buffered_uarte.rs | |||
| @@ -17,7 +17,6 @@ use core::task::Poll; | |||
| 17 | 17 | ||
| 18 | use embassy_hal_internal::atomic_ring_buffer::RingBuffer; | 18 | use embassy_hal_internal::atomic_ring_buffer::RingBuffer; |
| 19 | use embassy_hal_internal::{into_ref, PeripheralRef}; | 19 | use embassy_hal_internal::{into_ref, PeripheralRef}; |
| 20 | use embassy_sync::waitqueue::AtomicWaker; | ||
| 21 | // Re-export SVD variants to allow user to directly set values | 20 | // Re-export SVD variants to allow user to directly set values |
| 22 | pub use pac::uarte0::{baudrate::BAUDRATE_A as Baudrate, config::PARITY_A as Parity}; | 21 | pub use pac::uarte0::{baudrate::BAUDRATE_A as Baudrate, config::PARITY_A as Parity}; |
| 23 | 22 | ||
| @@ -35,11 +34,9 @@ mod sealed { | |||
| 35 | use super::*; | 34 | use super::*; |
| 36 | 35 | ||
| 37 | pub struct State { | 36 | pub struct State { |
| 38 | pub tx_waker: AtomicWaker, | ||
| 39 | pub tx_buf: RingBuffer, | 37 | pub tx_buf: RingBuffer, |
| 40 | pub tx_count: AtomicUsize, | 38 | pub tx_count: AtomicUsize, |
| 41 | 39 | ||
| 42 | pub rx_waker: AtomicWaker, | ||
| 43 | pub rx_buf: RingBuffer, | 40 | pub rx_buf: RingBuffer, |
| 44 | pub rx_started: AtomicBool, | 41 | pub rx_started: AtomicBool, |
| 45 | pub rx_started_count: AtomicU8, | 42 | pub rx_started_count: AtomicU8, |
| @@ -61,11 +58,9 @@ pub(crate) use sealed::State; | |||
| 61 | impl State { | 58 | impl State { |
| 62 | pub(crate) const fn new() -> Self { | 59 | pub(crate) const fn new() -> Self { |
| 63 | Self { | 60 | Self { |
| 64 | tx_waker: AtomicWaker::new(), | ||
| 65 | tx_buf: RingBuffer::new(), | 61 | tx_buf: RingBuffer::new(), |
| 66 | tx_count: AtomicUsize::new(0), | 62 | tx_count: AtomicUsize::new(0), |
| 67 | 63 | ||
| 68 | rx_waker: AtomicWaker::new(), | ||
| 69 | rx_buf: RingBuffer::new(), | 64 | rx_buf: RingBuffer::new(), |
| 70 | rx_started: AtomicBool::new(false), | 65 | rx_started: AtomicBool::new(false), |
| 71 | rx_started_count: AtomicU8::new(0), | 66 | rx_started_count: AtomicU8::new(0), |
| @@ -84,6 +79,7 @@ impl<U: UarteInstance> interrupt::typelevel::Handler<U::Interrupt> for Interrupt | |||
| 84 | unsafe fn on_interrupt() { | 79 | unsafe fn on_interrupt() { |
| 85 | //trace!("irq: start"); | 80 | //trace!("irq: start"); |
| 86 | let r = U::regs(); | 81 | let r = U::regs(); |
| 82 | let ss = U::state(); | ||
| 87 | let s = U::buffered_state(); | 83 | let s = U::buffered_state(); |
| 88 | 84 | ||
| 89 | if let Some(mut rx) = unsafe { s.rx_buf.try_writer() } { | 85 | if let Some(mut rx) = unsafe { s.rx_buf.try_writer() } { |
| @@ -104,7 +100,7 @@ impl<U: UarteInstance> interrupt::typelevel::Handler<U::Interrupt> for Interrupt | |||
| 104 | if r.inten.read().rxdrdy().bit_is_set() && r.events_rxdrdy.read().bits() != 0 { | 100 | if r.inten.read().rxdrdy().bit_is_set() && r.events_rxdrdy.read().bits() != 0 { |
| 105 | r.intenclr.write(|w| w.rxdrdy().clear()); | 101 | r.intenclr.write(|w| w.rxdrdy().clear()); |
| 106 | r.events_rxdrdy.reset(); | 102 | r.events_rxdrdy.reset(); |
| 107 | s.rx_waker.wake(); | 103 | ss.rx_waker.wake(); |
| 108 | } | 104 | } |
| 109 | 105 | ||
| 110 | if r.events_endrx.read().bits() != 0 { | 106 | if r.events_endrx.read().bits() != 0 { |
| @@ -190,7 +186,7 @@ impl<U: UarteInstance> interrupt::typelevel::Handler<U::Interrupt> for Interrupt | |||
| 190 | let n = s.tx_count.load(Ordering::Relaxed); | 186 | let n = s.tx_count.load(Ordering::Relaxed); |
| 191 | //trace!(" irq_tx: endtx {:?}", n); | 187 | //trace!(" irq_tx: endtx {:?}", n); |
| 192 | tx.pop_done(n); | 188 | tx.pop_done(n); |
| 193 | s.tx_waker.wake(); | 189 | ss.tx_waker.wake(); |
| 194 | s.tx_count.store(0, Ordering::Relaxed); | 190 | s.tx_count.store(0, Ordering::Relaxed); |
| 195 | } | 191 | } |
| 196 | 192 | ||
| @@ -477,13 +473,14 @@ impl<'d, U: UarteInstance> BufferedUarteTx<'d, U> { | |||
| 477 | pub async fn write(&mut self, buf: &[u8]) -> Result<usize, Error> { | 473 | pub async fn write(&mut self, buf: &[u8]) -> Result<usize, Error> { |
| 478 | poll_fn(move |cx| { | 474 | poll_fn(move |cx| { |
| 479 | //trace!("poll_write: {:?}", buf.len()); | 475 | //trace!("poll_write: {:?}", buf.len()); |
| 476 | let ss = U::state(); | ||
| 480 | let s = U::buffered_state(); | 477 | let s = U::buffered_state(); |
| 481 | let mut tx = unsafe { s.tx_buf.writer() }; | 478 | let mut tx = unsafe { s.tx_buf.writer() }; |
| 482 | 479 | ||
| 483 | let tx_buf = tx.push_slice(); | 480 | let tx_buf = tx.push_slice(); |
| 484 | if tx_buf.is_empty() { | 481 | if tx_buf.is_empty() { |
| 485 | //trace!("poll_write: pending"); | 482 | //trace!("poll_write: pending"); |
| 486 | s.tx_waker.register(cx.waker()); | 483 | ss.tx_waker.register(cx.waker()); |
| 487 | return Poll::Pending; | 484 | return Poll::Pending; |
| 488 | } | 485 | } |
| 489 | 486 | ||
| @@ -505,10 +502,11 @@ impl<'d, U: UarteInstance> BufferedUarteTx<'d, U> { | |||
| 505 | pub async fn flush(&mut self) -> Result<(), Error> { | 502 | pub async fn flush(&mut self) -> Result<(), Error> { |
| 506 | poll_fn(move |cx| { | 503 | poll_fn(move |cx| { |
| 507 | //trace!("poll_flush"); | 504 | //trace!("poll_flush"); |
| 505 | let ss = U::state(); | ||
| 508 | let s = U::buffered_state(); | 506 | let s = U::buffered_state(); |
| 509 | if !s.tx_buf.is_empty() { | 507 | if !s.tx_buf.is_empty() { |
| 510 | //trace!("poll_flush: pending"); | 508 | //trace!("poll_flush: pending"); |
| 511 | s.tx_waker.register(cx.waker()); | 509 | ss.tx_waker.register(cx.waker()); |
| 512 | return Poll::Pending; | 510 | return Poll::Pending; |
| 513 | } | 511 | } |
| 514 | 512 | ||
| @@ -567,6 +565,7 @@ impl<'d, U: UarteInstance, T: TimerInstance> BufferedUarteRx<'d, U, T> { | |||
| 567 | 565 | ||
| 568 | let r = U::regs(); | 566 | let r = U::regs(); |
| 569 | let s = U::buffered_state(); | 567 | let s = U::buffered_state(); |
| 568 | let ss = U::state(); | ||
| 570 | 569 | ||
| 571 | // Read the RXDRDY counter. | 570 | // Read the RXDRDY counter. |
| 572 | T::regs().tasks_capture[0].write(|w| unsafe { w.bits(1) }); | 571 | T::regs().tasks_capture[0].write(|w| unsafe { w.bits(1) }); |
| @@ -590,7 +589,7 @@ impl<'d, U: UarteInstance, T: TimerInstance> BufferedUarteRx<'d, U, T> { | |||
| 590 | let len = s.rx_buf.len(); | 589 | let len = s.rx_buf.len(); |
| 591 | if start == end { | 590 | if start == end { |
| 592 | //trace!(" empty"); | 591 | //trace!(" empty"); |
| 593 | s.rx_waker.register(cx.waker()); | 592 | ss.rx_waker.register(cx.waker()); |
| 594 | r.intenset.write(|w| w.rxdrdy().set_bit()); | 593 | r.intenset.write(|w| w.rxdrdy().set_bit()); |
| 595 | return Poll::Pending; | 594 | return Poll::Pending; |
| 596 | } | 595 | } |
diff --git a/embassy-nrf/src/uarte.rs b/embassy-nrf/src/uarte.rs index 90820acab..cd14c718a 100644 --- a/embassy-nrf/src/uarte.rs +++ b/embassy-nrf/src/uarte.rs | |||
| @@ -115,7 +115,7 @@ impl<T: Instance> interrupt::typelevel::Handler<T::Interrupt> for InterruptHandl | |||
| 115 | let endrx = r.events_endrx.read().bits(); | 115 | let endrx = r.events_endrx.read().bits(); |
| 116 | let error = r.events_error.read().bits(); | 116 | let error = r.events_error.read().bits(); |
| 117 | if endrx != 0 || error != 0 { | 117 | if endrx != 0 || error != 0 { |
| 118 | s.endrx_waker.wake(); | 118 | s.rx_waker.wake(); |
| 119 | if endrx != 0 { | 119 | if endrx != 0 { |
| 120 | r.intenclr.write(|w| w.endrx().clear()); | 120 | r.intenclr.write(|w| w.endrx().clear()); |
| 121 | } | 121 | } |
| @@ -124,7 +124,7 @@ impl<T: Instance> interrupt::typelevel::Handler<T::Interrupt> for InterruptHandl | |||
| 124 | } | 124 | } |
| 125 | } | 125 | } |
| 126 | if r.events_endtx.read().bits() != 0 { | 126 | if r.events_endtx.read().bits() != 0 { |
| 127 | s.endtx_waker.wake(); | 127 | s.tx_waker.wake(); |
| 128 | r.intenclr.write(|w| w.endtx().clear()); | 128 | r.intenclr.write(|w| w.endtx().clear()); |
| 129 | } | 129 | } |
| 130 | } | 130 | } |
| @@ -433,7 +433,7 @@ impl<'d, T: Instance> UarteTx<'d, T> { | |||
| 433 | r.tasks_starttx.write(|w| unsafe { w.bits(1) }); | 433 | r.tasks_starttx.write(|w| unsafe { w.bits(1) }); |
| 434 | 434 | ||
| 435 | poll_fn(|cx| { | 435 | poll_fn(|cx| { |
| 436 | s.endtx_waker.register(cx.waker()); | 436 | s.tx_waker.register(cx.waker()); |
| 437 | if r.events_endtx.read().bits() != 0 { | 437 | if r.events_endtx.read().bits() != 0 { |
| 438 | return Poll::Ready(()); | 438 | return Poll::Ready(()); |
| 439 | } | 439 | } |
| @@ -680,7 +680,7 @@ impl<'d, T: Instance> UarteRx<'d, T> { | |||
| 680 | r.tasks_startrx.write(|w| unsafe { w.bits(1) }); | 680 | r.tasks_startrx.write(|w| unsafe { w.bits(1) }); |
| 681 | 681 | ||
| 682 | let result = poll_fn(|cx| { | 682 | let result = poll_fn(|cx| { |
| 683 | s.endrx_waker.register(cx.waker()); | 683 | s.rx_waker.register(cx.waker()); |
| 684 | 684 | ||
| 685 | if let Err(e) = self.check_and_clear_errors() { | 685 | if let Err(e) = self.check_and_clear_errors() { |
| 686 | r.tasks_stoprx.write(|w| unsafe { w.bits(1) }); | 686 | r.tasks_stoprx.write(|w| unsafe { w.bits(1) }); |
| @@ -827,7 +827,7 @@ impl<'d, T: Instance, U: TimerInstance> UarteRxWithIdle<'d, T, U> { | |||
| 827 | r.tasks_startrx.write(|w| unsafe { w.bits(1) }); | 827 | r.tasks_startrx.write(|w| unsafe { w.bits(1) }); |
| 828 | 828 | ||
| 829 | let result = poll_fn(|cx| { | 829 | let result = poll_fn(|cx| { |
| 830 | s.endrx_waker.register(cx.waker()); | 830 | s.rx_waker.register(cx.waker()); |
| 831 | 831 | ||
| 832 | if let Err(e) = self.rx.check_and_clear_errors() { | 832 | if let Err(e) = self.rx.check_and_clear_errors() { |
| 833 | r.tasks_stoprx.write(|w| unsafe { w.bits(1) }); | 833 | r.tasks_stoprx.write(|w| unsafe { w.bits(1) }); |
| @@ -970,15 +970,15 @@ pub(crate) mod sealed { | |||
| 970 | use super::*; | 970 | use super::*; |
| 971 | 971 | ||
| 972 | pub struct State { | 972 | pub struct State { |
| 973 | pub endrx_waker: AtomicWaker, | 973 | pub rx_waker: AtomicWaker, |
| 974 | pub endtx_waker: AtomicWaker, | 974 | pub tx_waker: AtomicWaker, |
| 975 | pub tx_rx_refcount: AtomicU8, | 975 | pub tx_rx_refcount: AtomicU8, |
| 976 | } | 976 | } |
| 977 | impl State { | 977 | impl State { |
| 978 | pub const fn new() -> Self { | 978 | pub const fn new() -> Self { |
| 979 | Self { | 979 | Self { |
| 980 | endrx_waker: AtomicWaker::new(), | 980 | rx_waker: AtomicWaker::new(), |
| 981 | endtx_waker: AtomicWaker::new(), | 981 | tx_waker: AtomicWaker::new(), |
| 982 | tx_rx_refcount: AtomicU8::new(0), | 982 | tx_rx_refcount: AtomicU8::new(0), |
| 983 | } | 983 | } |
| 984 | } | 984 | } |
