aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-rp/src/uart/buffered.rs38
1 files changed, 28 insertions, 10 deletions
diff --git a/embassy-rp/src/uart/buffered.rs b/embassy-rp/src/uart/buffered.rs
index e89970d11..1d1fe37c2 100644
--- a/embassy-rp/src/uart/buffered.rs
+++ b/embassy-rp/src/uart/buffered.rs
@@ -402,27 +402,45 @@ pub(crate) unsafe fn on_interrupt<T: Instance>(_: *mut ()) {
402 } 402 }
403 403
404 let mut rx_writer = s.rx_buf.writer(); 404 let mut rx_writer = s.rx_buf.writer();
405 if !r.uartfr().read().rxfe() { 405 let rx_buf = rx_writer.push_slice();
406 let val = r.uartdr().read().data(); 406 let mut n_read = 0;
407 if !rx_writer.push_one(val) { 407 for rx_byte in rx_buf {
408 warn!("RX buffer full, discard received byte"); 408 if r.uartfr().read().rxfe() {
409 break;
409 } 410 }
411 *rx_byte = r.uartdr().read().data();
412 n_read += 1;
413 }
414 if n_read > 0 {
415 rx_writer.push_done(n_read);
410 s.rx_waker.wake(); 416 s.rx_waker.wake();
411 } 417 }
412 418
413 // TX 419 // TX
414 let mut tx_reader = s.tx_buf.reader(); 420 let mut tx_reader = s.tx_buf.reader();
415 if let Some(val) = tx_reader.pop_one() { 421 let tx_buf = tx_reader.pop_slice();
422 if tx_buf.len() == 0 {
423 // Disable interrupt until we have something to transmit again
416 r.uartimsc().modify(|w| { 424 r.uartimsc().modify(|w| {
417 w.set_txim(true); 425 w.set_txim(false);
418 }); 426 });
419 r.uartdr().write(|w| w.set_data(val));
420 s.tx_waker.wake();
421 } else { 427 } else {
422 // Disable interrupt until we have something to transmit again
423 r.uartimsc().modify(|w| { 428 r.uartimsc().modify(|w| {
424 w.set_txim(false); 429 w.set_txim(true);
425 }); 430 });
431
432 let mut n_written = 0;
433 for tx_byte in tx_buf.iter_mut() {
434 if r.uartfr().read().txff() {
435 break;
436 }
437 r.uartdr().write(|w| w.set_data(*tx_byte));
438 n_written += 1;
439 }
440 if n_written > 0 {
441 tx_reader.pop_done(n_written);
442 s.tx_waker.wake();
443 }
426 } 444 }
427 } 445 }
428} 446}