diff options
Diffstat (limited to 'embassy-rp/src/uart/buffered.rs')
| -rw-r--r-- | embassy-rp/src/uart/buffered.rs | 165 |
1 files changed, 78 insertions, 87 deletions
diff --git a/embassy-rp/src/uart/buffered.rs b/embassy-rp/src/uart/buffered.rs index 9f638761d..ca030f560 100644 --- a/embassy-rp/src/uart/buffered.rs +++ b/embassy-rp/src/uart/buffered.rs | |||
| @@ -668,126 +668,117 @@ impl<'d, T: Instance + 'd> embedded_io::Write for BufferedUartTx<'d, T> { | |||
| 668 | } | 668 | } |
| 669 | } | 669 | } |
| 670 | 670 | ||
| 671 | mod eh02 { | 671 | impl<'d, T: Instance> embedded_hal_02::serial::Read<u8> for BufferedUartRx<'d, T> { |
| 672 | use super::*; | 672 | type Error = Error; |
| 673 | 673 | ||
| 674 | impl<'d, T: Instance> embedded_hal_02::serial::Read<u8> for BufferedUartRx<'d, T> { | 674 | fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> { |
| 675 | type Error = Error; | 675 | let r = T::regs(); |
| 676 | if r.uartfr().read().rxfe() { | ||
| 677 | return Err(nb::Error::WouldBlock); | ||
| 678 | } | ||
| 676 | 679 | ||
| 677 | fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> { | 680 | let dr = r.uartdr().read(); |
| 678 | let r = T::regs(); | ||
| 679 | if r.uartfr().read().rxfe() { | ||
| 680 | return Err(nb::Error::WouldBlock); | ||
| 681 | } | ||
| 682 | 681 | ||
| 683 | let dr = r.uartdr().read(); | 682 | if dr.oe() { |
| 684 | 683 | Err(nb::Error::Other(Error::Overrun)) | |
| 685 | if dr.oe() { | 684 | } else if dr.be() { |
| 686 | Err(nb::Error::Other(Error::Overrun)) | 685 | Err(nb::Error::Other(Error::Break)) |
| 687 | } else if dr.be() { | 686 | } else if dr.pe() { |
| 688 | Err(nb::Error::Other(Error::Break)) | 687 | Err(nb::Error::Other(Error::Parity)) |
| 689 | } else if dr.pe() { | 688 | } else if dr.fe() { |
| 690 | Err(nb::Error::Other(Error::Parity)) | 689 | Err(nb::Error::Other(Error::Framing)) |
| 691 | } else if dr.fe() { | 690 | } else { |
| 692 | Err(nb::Error::Other(Error::Framing)) | 691 | Ok(dr.data()) |
| 693 | } else { | ||
| 694 | Ok(dr.data()) | ||
| 695 | } | ||
| 696 | } | 692 | } |
| 697 | } | 693 | } |
| 694 | } | ||
| 698 | 695 | ||
| 699 | impl<'d, T: Instance> embedded_hal_02::blocking::serial::Write<u8> for BufferedUartTx<'d, T> { | 696 | impl<'d, T: Instance> embedded_hal_02::blocking::serial::Write<u8> for BufferedUartTx<'d, T> { |
| 700 | type Error = Error; | 697 | type Error = Error; |
| 701 | 698 | ||
| 702 | fn bwrite_all(&mut self, mut buffer: &[u8]) -> Result<(), Self::Error> { | 699 | fn bwrite_all(&mut self, mut buffer: &[u8]) -> Result<(), Self::Error> { |
| 703 | while !buffer.is_empty() { | 700 | while !buffer.is_empty() { |
| 704 | match self.blocking_write(buffer) { | 701 | match self.blocking_write(buffer) { |
| 705 | Ok(0) => panic!("zero-length write."), | 702 | Ok(0) => panic!("zero-length write."), |
| 706 | Ok(n) => buffer = &buffer[n..], | 703 | Ok(n) => buffer = &buffer[n..], |
| 707 | Err(e) => return Err(e), | 704 | Err(e) => return Err(e), |
| 708 | } | ||
| 709 | } | 705 | } |
| 710 | Ok(()) | ||
| 711 | } | 706 | } |
| 707 | Ok(()) | ||
| 708 | } | ||
| 712 | 709 | ||
| 713 | fn bflush(&mut self) -> Result<(), Self::Error> { | 710 | fn bflush(&mut self) -> Result<(), Self::Error> { |
| 714 | self.blocking_flush() | 711 | self.blocking_flush() |
| 715 | } | ||
| 716 | } | 712 | } |
| 713 | } | ||
| 717 | 714 | ||
| 718 | impl<'d, T: Instance> embedded_hal_02::serial::Read<u8> for BufferedUart<'d, T> { | 715 | impl<'d, T: Instance> embedded_hal_02::serial::Read<u8> for BufferedUart<'d, T> { |
| 719 | type Error = Error; | 716 | type Error = Error; |
| 720 | 717 | ||
| 721 | fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> { | 718 | fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> { |
| 722 | embedded_hal_02::serial::Read::read(&mut self.rx) | 719 | embedded_hal_02::serial::Read::read(&mut self.rx) |
| 723 | } | ||
| 724 | } | 720 | } |
| 721 | } | ||
| 725 | 722 | ||
| 726 | impl<'d, T: Instance> embedded_hal_02::blocking::serial::Write<u8> for BufferedUart<'d, T> { | 723 | impl<'d, T: Instance> embedded_hal_02::blocking::serial::Write<u8> for BufferedUart<'d, T> { |
| 727 | type Error = Error; | 724 | type Error = Error; |
| 728 | 725 | ||
| 729 | fn bwrite_all(&mut self, mut buffer: &[u8]) -> Result<(), Self::Error> { | 726 | fn bwrite_all(&mut self, mut buffer: &[u8]) -> Result<(), Self::Error> { |
| 730 | while !buffer.is_empty() { | 727 | while !buffer.is_empty() { |
| 731 | match self.blocking_write(buffer) { | 728 | match self.blocking_write(buffer) { |
| 732 | Ok(0) => panic!("zero-length write."), | 729 | Ok(0) => panic!("zero-length write."), |
| 733 | Ok(n) => buffer = &buffer[n..], | 730 | Ok(n) => buffer = &buffer[n..], |
| 734 | Err(e) => return Err(e), | 731 | Err(e) => return Err(e), |
| 735 | } | ||
| 736 | } | 732 | } |
| 737 | Ok(()) | ||
| 738 | } | 733 | } |
| 734 | Ok(()) | ||
| 735 | } | ||
| 739 | 736 | ||
| 740 | fn bflush(&mut self) -> Result<(), Self::Error> { | 737 | fn bflush(&mut self) -> Result<(), Self::Error> { |
| 741 | self.blocking_flush() | 738 | self.blocking_flush() |
| 742 | } | ||
| 743 | } | 739 | } |
| 744 | } | 740 | } |
| 745 | 741 | ||
| 746 | #[cfg(feature = "unstable-traits")] | 742 | impl<'d, T: Instance> embedded_hal_nb::serial::ErrorType for BufferedUartRx<'d, T> { |
| 747 | mod eh1 { | 743 | type Error = Error; |
| 748 | use super::*; | 744 | } |
| 749 | 745 | ||
| 750 | impl<'d, T: Instance> embedded_hal_nb::serial::ErrorType for BufferedUartRx<'d, T> { | 746 | impl<'d, T: Instance> embedded_hal_nb::serial::ErrorType for BufferedUartTx<'d, T> { |
| 751 | type Error = Error; | 747 | type Error = Error; |
| 752 | } | 748 | } |
| 753 | 749 | ||
| 754 | impl<'d, T: Instance> embedded_hal_nb::serial::ErrorType for BufferedUartTx<'d, T> { | 750 | impl<'d, T: Instance> embedded_hal_nb::serial::ErrorType for BufferedUart<'d, T> { |
| 755 | type Error = Error; | 751 | type Error = Error; |
| 756 | } | 752 | } |
| 757 | 753 | ||
| 758 | impl<'d, T: Instance> embedded_hal_nb::serial::ErrorType for BufferedUart<'d, T> { | 754 | impl<'d, T: Instance> embedded_hal_nb::serial::Read for BufferedUartRx<'d, T> { |
| 759 | type Error = Error; | 755 | fn read(&mut self) -> nb::Result<u8, Self::Error> { |
| 756 | embedded_hal_02::serial::Read::read(self) | ||
| 760 | } | 757 | } |
| 758 | } | ||
| 761 | 759 | ||
| 762 | impl<'d, T: Instance> embedded_hal_nb::serial::Read for BufferedUartRx<'d, T> { | 760 | impl<'d, T: Instance> embedded_hal_nb::serial::Write for BufferedUartTx<'d, T> { |
| 763 | fn read(&mut self) -> nb::Result<u8, Self::Error> { | 761 | fn write(&mut self, char: u8) -> nb::Result<(), Self::Error> { |
| 764 | embedded_hal_02::serial::Read::read(self) | 762 | self.blocking_write(&[char]).map(drop).map_err(nb::Error::Other) |
| 765 | } | ||
| 766 | } | 763 | } |
| 767 | 764 | ||
| 768 | impl<'d, T: Instance> embedded_hal_nb::serial::Write for BufferedUartTx<'d, T> { | 765 | fn flush(&mut self) -> nb::Result<(), Self::Error> { |
| 769 | fn write(&mut self, char: u8) -> nb::Result<(), Self::Error> { | 766 | self.blocking_flush().map_err(nb::Error::Other) |
| 770 | self.blocking_write(&[char]).map(drop).map_err(nb::Error::Other) | ||
| 771 | } | ||
| 772 | |||
| 773 | fn flush(&mut self) -> nb::Result<(), Self::Error> { | ||
| 774 | self.blocking_flush().map_err(nb::Error::Other) | ||
| 775 | } | ||
| 776 | } | 767 | } |
| 768 | } | ||
| 777 | 769 | ||
| 778 | impl<'d, T: Instance> embedded_hal_nb::serial::Read for BufferedUart<'d, T> { | 770 | impl<'d, T: Instance> embedded_hal_nb::serial::Read for BufferedUart<'d, T> { |
| 779 | fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> { | 771 | fn read(&mut self) -> Result<u8, nb::Error<Self::Error>> { |
| 780 | embedded_hal_02::serial::Read::read(&mut self.rx) | 772 | embedded_hal_02::serial::Read::read(&mut self.rx) |
| 781 | } | ||
| 782 | } | 773 | } |
| 774 | } | ||
| 783 | 775 | ||
| 784 | impl<'d, T: Instance> embedded_hal_nb::serial::Write for BufferedUart<'d, T> { | 776 | impl<'d, T: Instance> embedded_hal_nb::serial::Write for BufferedUart<'d, T> { |
| 785 | fn write(&mut self, char: u8) -> nb::Result<(), Self::Error> { | 777 | fn write(&mut self, char: u8) -> nb::Result<(), Self::Error> { |
| 786 | self.blocking_write(&[char]).map(drop).map_err(nb::Error::Other) | 778 | self.blocking_write(&[char]).map(drop).map_err(nb::Error::Other) |
| 787 | } | 779 | } |
| 788 | 780 | ||
| 789 | fn flush(&mut self) -> nb::Result<(), Self::Error> { | 781 | fn flush(&mut self) -> nb::Result<(), Self::Error> { |
| 790 | self.blocking_flush().map_err(nb::Error::Other) | 782 | self.blocking_flush().map_err(nb::Error::Other) |
| 791 | } | ||
| 792 | } | 783 | } |
| 793 | } | 784 | } |
