diff options
| author | Timo Kröger <[email protected]> | 2022-12-27 10:20:51 +0100 |
|---|---|---|
| committer | Timo Kröger <[email protected]> | 2022-12-27 11:28:52 +0100 |
| commit | e4f457646f216f36cd86fcfe54af0d7956d17932 (patch) | |
| tree | d189e0e6f4e37cac576e722eaedc365df09feb70 | |
| parent | 3afb62d8d6d6f9737f3e2275e2bfb2a2f799b758 (diff) | |
rp: Fill and empty FIFOs in buffered uart interrupt
Fixes an issue where only the first byte was transmitted.
Should improve throughput aswell.
| -rw-r--r-- | embassy-rp/src/uart/buffered.rs | 38 |
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 | } |
