diff options
| -rw-r--r-- | embassy-rp/src/uart/buffered.rs | 66 |
1 files changed, 56 insertions, 10 deletions
diff --git a/embassy-rp/src/uart/buffered.rs b/embassy-rp/src/uart/buffered.rs index 32e5ddf14..88628d97b 100644 --- a/embassy-rp/src/uart/buffered.rs +++ b/embassy-rp/src/uart/buffered.rs | |||
| @@ -124,7 +124,7 @@ impl<'d, T: Instance> BufferedUart<'d, T> { | |||
| 124 | } | 124 | } |
| 125 | } | 125 | } |
| 126 | 126 | ||
| 127 | pub fn blocking_write(&mut self, buffer: &[u8]) -> Result<(), Error> { | 127 | pub fn blocking_write(&mut self, buffer: &[u8]) -> Result<usize, Error> { |
| 128 | self.tx.blocking_write(buffer) | 128 | self.tx.blocking_write(buffer) |
| 129 | } | 129 | } |
| 130 | 130 | ||
| @@ -132,7 +132,7 @@ impl<'d, T: Instance> BufferedUart<'d, T> { | |||
| 132 | self.tx.blocking_flush() | 132 | self.tx.blocking_flush() |
| 133 | } | 133 | } |
| 134 | 134 | ||
| 135 | pub fn blocking_read(&mut self, buffer: &mut [u8]) -> Result<(), Error> { | 135 | pub fn blocking_read(&mut self, buffer: &mut [u8]) -> Result<usize, Error> { |
| 136 | self.rx.blocking_read(buffer) | 136 | self.rx.blocking_read(buffer) |
| 137 | } | 137 | } |
| 138 | 138 | ||
| @@ -201,7 +201,7 @@ impl<'d, T: Instance> BufferedUartRx<'d, T> { | |||
| 201 | }) | 201 | }) |
| 202 | } | 202 | } |
| 203 | 203 | ||
| 204 | pub fn blocking_read(&mut self, buf: &mut [u8]) -> Result<(), Error> { | 204 | pub fn blocking_read(&mut self, buf: &mut [u8]) -> Result<usize, Error> { |
| 205 | loop { | 205 | loop { |
| 206 | let state = T::state(); | 206 | let state = T::state(); |
| 207 | let mut rx_reader = unsafe { state.rx_buf.reader() }; | 207 | let mut rx_reader = unsafe { state.rx_buf.reader() }; |
| @@ -222,7 +222,7 @@ impl<'d, T: Instance> BufferedUartRx<'d, T> { | |||
| 222 | }); | 222 | }); |
| 223 | } | 223 | } |
| 224 | 224 | ||
| 225 | return Ok(()); | 225 | return Ok(n); |
| 226 | } | 226 | } |
| 227 | } | 227 | } |
| 228 | } | 228 | } |
| @@ -326,7 +326,7 @@ impl<'d, T: Instance> BufferedUartTx<'d, T> { | |||
| 326 | }) | 326 | }) |
| 327 | } | 327 | } |
| 328 | 328 | ||
| 329 | pub fn blocking_write(&mut self, buf: &[u8]) -> Result<(), Error> { | 329 | pub fn blocking_write(&mut self, buf: &[u8]) -> Result<usize, Error> { |
| 330 | loop { | 330 | loop { |
| 331 | let state = T::state(); | 331 | let state = T::state(); |
| 332 | let mut tx_writer = unsafe { state.tx_buf.writer() }; | 332 | let mut tx_writer = unsafe { state.tx_buf.writer() }; |
| @@ -342,7 +342,7 @@ impl<'d, T: Instance> BufferedUartTx<'d, T> { | |||
| 342 | // FIFO was empty we have to manually pend the interrupt to shovel | 342 | // FIFO was empty we have to manually pend the interrupt to shovel |
| 343 | // TX data from the buffer into the FIFO. | 343 | // TX data from the buffer into the FIFO. |
| 344 | unsafe { T::Interrupt::steal() }.pend(); | 344 | unsafe { T::Interrupt::steal() }.pend(); |
| 345 | return Ok(()); | 345 | return Ok(n); |
| 346 | } | 346 | } |
| 347 | } | 347 | } |
| 348 | } | 348 | } |
| @@ -533,6 +533,38 @@ impl<'d, T: Instance + 'd> embedded_io::asynch::Write for BufferedUartTx<'d, T> | |||
| 533 | } | 533 | } |
| 534 | } | 534 | } |
| 535 | 535 | ||
| 536 | impl<'d, T: Instance + 'd> embedded_io::blocking::Read for BufferedUart<'d, T> { | ||
| 537 | fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error> { | ||
| 538 | self.rx.blocking_read(buf) | ||
| 539 | } | ||
| 540 | } | ||
| 541 | |||
| 542 | impl<'d, T: Instance + 'd> embedded_io::blocking::Read for BufferedUartRx<'d, T> { | ||
| 543 | fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error> { | ||
| 544 | self.blocking_read(buf) | ||
| 545 | } | ||
| 546 | } | ||
| 547 | |||
| 548 | impl<'d, T: Instance + 'd> embedded_io::blocking::Write for BufferedUart<'d, T> { | ||
| 549 | fn write(&mut self, buf: &[u8]) -> Result<usize, Self::Error> { | ||
| 550 | self.tx.blocking_write(buf) | ||
| 551 | } | ||
| 552 | |||
| 553 | fn flush(&mut self) -> Result<(), Self::Error> { | ||
| 554 | self.tx.blocking_flush() | ||
| 555 | } | ||
| 556 | } | ||
| 557 | |||
| 558 | impl<'d, T: Instance + 'd> embedded_io::blocking::Write for BufferedUartTx<'d, T> { | ||
| 559 | fn write(&mut self, buf: &[u8]) -> Result<usize, Self::Error> { | ||
| 560 | self.blocking_write(buf) | ||
| 561 | } | ||
| 562 | |||
| 563 | fn flush(&mut self) -> Result<(), Self::Error> { | ||
| 564 | self.blocking_flush() | ||
| 565 | } | ||
| 566 | } | ||
| 567 | |||
| 536 | mod eh02 { | 568 | mod eh02 { |
| 537 | use super::*; | 569 | use super::*; |
| 538 | 570 | ||
| @@ -566,8 +598,15 @@ mod eh02 { | |||
| 566 | impl<'d, T: Instance> embedded_hal_02::blocking::serial::Write<u8> for BufferedUartTx<'d, T> { | 598 | impl<'d, T: Instance> embedded_hal_02::blocking::serial::Write<u8> for BufferedUartTx<'d, T> { |
| 567 | type Error = Error; | 599 | type Error = Error; |
| 568 | 600 | ||
| 569 | fn bwrite_all(&mut self, buffer: &[u8]) -> Result<(), Self::Error> { | 601 | fn bwrite_all(&mut self, mut buffer: &[u8]) -> Result<(), Self::Error> { |
| 570 | self.blocking_write(buffer) | 602 | while !buffer.is_empty() { |
| 603 | match self.blocking_write(buffer) { | ||
| 604 | Ok(0) => panic!("zero-length write."), | ||
| 605 | Ok(n) => buffer = &buffer[n..], | ||
| 606 | Err(e) => return Err(e), | ||
| 607 | } | ||
| 608 | } | ||
| 609 | Ok(()) | ||
| 571 | } | 610 | } |
| 572 | 611 | ||
| 573 | fn bflush(&mut self) -> Result<(), Self::Error> { | 612 | fn bflush(&mut self) -> Result<(), Self::Error> { |
| @@ -586,8 +625,15 @@ mod eh02 { | |||
| 586 | impl<'d, T: Instance> embedded_hal_02::blocking::serial::Write<u8> for BufferedUart<'d, T> { | 625 | impl<'d, T: Instance> embedded_hal_02::blocking::serial::Write<u8> for BufferedUart<'d, T> { |
| 587 | type Error = Error; | 626 | type Error = Error; |
| 588 | 627 | ||
| 589 | fn bwrite_all(&mut self, buffer: &[u8]) -> Result<(), Self::Error> { | 628 | fn bwrite_all(&mut self, mut buffer: &[u8]) -> Result<(), Self::Error> { |
| 590 | self.blocking_write(buffer) | 629 | while !buffer.is_empty() { |
| 630 | match self.blocking_write(buffer) { | ||
| 631 | Ok(0) => panic!("zero-length write."), | ||
| 632 | Ok(n) => buffer = &buffer[n..], | ||
| 633 | Err(e) => return Err(e), | ||
| 634 | } | ||
| 635 | } | ||
| 636 | Ok(()) | ||
| 591 | } | 637 | } |
| 592 | 638 | ||
| 593 | fn bflush(&mut self) -> Result<(), Self::Error> { | 639 | fn bflush(&mut self) -> Result<(), Self::Error> { |
