aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2024-02-21 22:29:37 +0100
committerDario Nieuwenhuis <[email protected]>2024-02-21 22:29:37 +0100
commit4fbe18f82134567af4766d161e8385c7dd919a0b (patch)
treec681ce44b8675ba9c5f0767fdfad632133e75f7b
parent1f17fdf84ee30f989a1a5bd8945a76a9f5edac4b (diff)
nrf/uart: share waker state between buffered and nonbuffered.
-rw-r--r--embassy-nrf/src/buffered_uarte.rs19
-rw-r--r--embassy-nrf/src/uarte.rs18
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
18use embassy_hal_internal::atomic_ring_buffer::RingBuffer; 18use embassy_hal_internal::atomic_ring_buffer::RingBuffer;
19use embassy_hal_internal::{into_ref, PeripheralRef}; 19use embassy_hal_internal::{into_ref, PeripheralRef};
20use 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
22pub use pac::uarte0::{baudrate::BAUDRATE_A as Baudrate, config::PARITY_A as Parity}; 21pub 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;
61impl State { 58impl 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 }