aboutsummaryrefslogtreecommitdiff
path: root/embassy-rp/src/uart/buffered.rs
diff options
context:
space:
mode:
Diffstat (limited to 'embassy-rp/src/uart/buffered.rs')
-rw-r--r--embassy-rp/src/uart/buffered.rs165
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
671mod eh02 { 671impl<'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> { 696impl<'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> { 715impl<'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> { 723impl<'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")] 742impl<'d, T: Instance> embedded_hal_nb::serial::ErrorType for BufferedUartRx<'d, T> {
747mod 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> { 746impl<'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> { 750impl<'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> { 754impl<'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> { 760impl<'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> { 770impl<'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> { 776impl<'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}