@@ -3,7 +3,7 @@ use core::{
33 sync:: atomic:: { AtomicPtr , Ordering } ,
44} ;
55
6- use crate :: LineStsFlags ;
6+ use crate :: { LineStsFlags , WouldBlockError } ;
77
88/// A memory-mapped UART.
99#[ derive( Debug ) ]
@@ -90,18 +90,36 @@ impl MmioSerialPort {
9090
9191 /// Sends a raw byte on the serial port, intended for binary data.
9292 pub fn send_raw ( & mut self , data : u8 ) {
93- wait_for ! ( self . line_sts( ) . contains( LineStsFlags :: OUTPUT_EMPTY ) ) ;
94- let self_data = self . data . load ( Ordering :: Relaxed ) ;
95- unsafe {
96- self_data. write ( data) ;
93+ retry_until_ok ! ( self . try_send_raw( data) )
94+ }
95+
96+ /// Tries to send a raw byte on the serial port, intended for binary data.
97+ pub fn try_send_raw ( & mut self , data : u8 ) -> Result < ( ) , WouldBlockError > {
98+ if self . line_sts ( ) . contains ( LineStsFlags :: OUTPUT_EMPTY ) {
99+ let self_data = self . data . load ( Ordering :: Relaxed ) ;
100+ unsafe {
101+ self_data. write ( data) ;
102+ }
103+ Ok ( ( ) )
104+ } else {
105+ Err ( WouldBlockError )
97106 }
98107 }
99108
100109 /// Receives a byte on the serial port.
101110 pub fn receive ( & mut self ) -> u8 {
102- wait_for ! ( self . line_sts( ) . contains( LineStsFlags :: INPUT_FULL ) ) ;
103- let self_data = self . data . load ( Ordering :: Relaxed ) ;
104- unsafe { self_data. read ( ) }
111+ retry_until_ok ! ( self . try_receive( ) )
112+ }
113+
114+ /// Tries to receive a byte on the serial port.
115+ pub fn try_receive ( & mut self ) -> Result < u8 , WouldBlockError > {
116+ if self . line_sts ( ) . contains ( LineStsFlags :: INPUT_FULL ) {
117+ let self_data = self . data . load ( Ordering :: Relaxed ) ;
118+ let data = unsafe { self_data. read ( ) } ;
119+ Ok ( data)
120+ } else {
121+ Err ( WouldBlockError )
122+ }
105123 }
106124}
107125
0 commit comments