@@ -3,7 +3,7 @@ use core::{
3
3
sync:: atomic:: { AtomicPtr , Ordering } ,
4
4
} ;
5
5
6
- use crate :: LineStsFlags ;
6
+ use crate :: { LineStsFlags , WouldBlockError } ;
7
7
8
8
/// A memory-mapped UART.
9
9
#[ derive( Debug ) ]
@@ -90,18 +90,36 @@ impl MmioSerialPort {
90
90
91
91
/// Sends a raw byte on the serial port, intended for binary data.
92
92
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 )
97
106
}
98
107
}
99
108
100
109
/// Receives a byte on the serial port.
101
110
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
+ }
105
123
}
106
124
}
107
125
0 commit comments