4
4
5
5
use core:: future:: poll_fn;
6
6
use core:: marker:: PhantomData ;
7
- use core:: sync:: atomic:: { compiler_fence, AtomicBool , AtomicU8 , Ordering } ;
7
+ use core:: sync:: atomic:: { compiler_fence, AtomicU8 , AtomicUsize , Ordering } ;
8
8
use core:: task:: Poll ;
9
9
10
10
use embassy_embedded_hal:: SetConfig ;
@@ -212,17 +212,18 @@ pub struct Config {
212
212
/// If false: the error is ignored and cleared
213
213
pub detect_previous_overrun : bool ,
214
214
215
- /// If true then read-like calls on `BufferedUartRx` and `RingBufferedUartRx`
216
- /// are woken/return as soon as any data is available in the buffer.
215
+ /// If `None` (the default) then read-like calls on `BufferedUartRx` and `RingBufferedUartRx`
216
+ /// typically only wake/return after line idle or after the buffer is at least half full
217
+ /// (for `BufferedUartRx`) or the DMA buffer is written at the half or full positions
218
+ /// (for `RingBufferedUartRx`), though it may also wake/return earlier in some circumstances.
217
219
///
218
- /// If false (the default) then reads started typically only wake/return after
219
- /// line idle or after the buffer is at least half full (`BufferedUartRx`) or
220
- /// the DMA buffer is written at the half or full positions (`RingBufferedUartRx`),
221
- /// though it may also wake/return earlier in some circumstances.
220
+ /// If `Some(n)` then such reads are also woken/return as soon as at least `n` words are
221
+ /// available in the buffer, in addition to waking/returning when the conditions described
222
+ /// above are met. `Some(0)` is treated as `None`.
222
223
///
223
224
/// Has no effect on plain `Uart` or `UartRx` reads, which are specified to either
224
225
/// return a single word, a full buffer, or after line idle.
225
- pub eager_reads : bool ,
226
+ pub eager_reads : Option < usize > ,
226
227
227
228
/// Set this to true if the line is considered noise free.
228
229
/// This will increase the receiver’s tolerance to clock deviations,
@@ -296,7 +297,7 @@ impl Default for Config {
296
297
parity : Parity :: ParityNone ,
297
298
// historical behavior
298
299
detect_previous_overrun : false ,
299
- eager_reads : false ,
300
+ eager_reads : None ,
300
301
#[ cfg( not( usart_v1) ) ]
301
302
assume_noise_free : false ,
302
303
#[ cfg( any( usart_v3, usart_v4) ) ]
@@ -997,7 +998,9 @@ impl<'d, M: Mode> UartRx<'d, M> {
997
998
let info = self . info ;
998
999
let state = self . state ;
999
1000
state. tx_rx_refcount . store ( 1 , Ordering :: Relaxed ) ;
1000
- state. eager_reads . store ( config. eager_reads , Ordering :: Relaxed ) ;
1001
+ state
1002
+ . eager_reads
1003
+ . store ( config. eager_reads . unwrap_or ( 0 ) , Ordering :: Relaxed ) ;
1001
1004
1002
1005
info. rcc . enable_and_reset ( ) ;
1003
1006
@@ -1014,7 +1017,9 @@ impl<'d, M: Mode> UartRx<'d, M> {
1014
1017
1015
1018
/// Reconfigure the driver
1016
1019
pub fn set_config ( & mut self , config : & Config ) -> Result < ( ) , ConfigError > {
1017
- self . state . eager_reads . store ( config. eager_reads , Ordering :: Relaxed ) ;
1020
+ self . state
1021
+ . eager_reads
1022
+ . store ( config. eager_reads . unwrap_or ( 0 ) , Ordering :: Relaxed ) ;
1018
1023
reconfigure ( self . info , self . kernel_clock , config)
1019
1024
}
1020
1025
@@ -1495,7 +1500,9 @@ impl<'d, M: Mode> Uart<'d, M> {
1495
1500
let info = self . rx . info ;
1496
1501
let state = self . rx . state ;
1497
1502
state. tx_rx_refcount . store ( 2 , Ordering :: Relaxed ) ;
1498
- state. eager_reads . store ( config. eager_reads , Ordering :: Relaxed ) ;
1503
+ state
1504
+ . eager_reads
1505
+ . store ( config. eager_reads . unwrap_or ( 0 ) , Ordering :: Relaxed ) ;
1499
1506
1500
1507
info. rcc . enable_and_reset ( ) ;
1501
1508
@@ -2080,7 +2087,7 @@ struct State {
2080
2087
rx_waker : AtomicWaker ,
2081
2088
tx_waker : AtomicWaker ,
2082
2089
tx_rx_refcount : AtomicU8 ,
2083
- eager_reads : AtomicBool ,
2090
+ eager_reads : AtomicUsize ,
2084
2091
}
2085
2092
2086
2093
impl State {
@@ -2089,7 +2096,7 @@ impl State {
2089
2096
rx_waker : AtomicWaker :: new ( ) ,
2090
2097
tx_waker : AtomicWaker :: new ( ) ,
2091
2098
tx_rx_refcount : AtomicU8 :: new ( 0 ) ,
2092
- eager_reads : AtomicBool :: new ( false ) ,
2099
+ eager_reads : AtomicUsize :: new ( 0 ) ,
2093
2100
}
2094
2101
}
2095
2102
}
0 commit comments