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) ) ]
@@ -995,7 +996,9 @@ impl<'d, M: Mode> UartRx<'d, M> {
995
996
let info = self . info ;
996
997
let state = self . state ;
997
998
state. tx_rx_refcount . store ( 1 , Ordering :: Relaxed ) ;
998
- state. eager_reads . store ( config. eager_reads , Ordering :: Relaxed ) ;
999
+ state
1000
+ . eager_reads
1001
+ . store ( config. eager_reads . unwrap_or ( 0 ) , Ordering :: Relaxed ) ;
999
1002
1000
1003
info. rcc . enable_and_reset ( ) ;
1001
1004
@@ -1012,7 +1015,9 @@ impl<'d, M: Mode> UartRx<'d, M> {
1012
1015
1013
1016
/// Reconfigure the driver
1014
1017
pub fn set_config ( & mut self , config : & Config ) -> Result < ( ) , ConfigError > {
1015
- self . state . eager_reads . store ( config. eager_reads , Ordering :: Relaxed ) ;
1018
+ self . state
1019
+ . eager_reads
1020
+ . store ( config. eager_reads . unwrap_or ( 0 ) , Ordering :: Relaxed ) ;
1016
1021
reconfigure ( self . info , self . kernel_clock , config)
1017
1022
}
1018
1023
@@ -1493,7 +1498,9 @@ impl<'d, M: Mode> Uart<'d, M> {
1493
1498
let info = self . rx . info ;
1494
1499
let state = self . rx . state ;
1495
1500
state. tx_rx_refcount . store ( 2 , Ordering :: Relaxed ) ;
1496
- state. eager_reads . store ( config. eager_reads , Ordering :: Relaxed ) ;
1501
+ state
1502
+ . eager_reads
1503
+ . store ( config. eager_reads . unwrap_or ( 0 ) , Ordering :: Relaxed ) ;
1497
1504
1498
1505
info. rcc . enable_and_reset ( ) ;
1499
1506
@@ -2078,7 +2085,7 @@ struct State {
2078
2085
rx_waker : AtomicWaker ,
2079
2086
tx_waker : AtomicWaker ,
2080
2087
tx_rx_refcount : AtomicU8 ,
2081
- eager_reads : AtomicBool ,
2088
+ eager_reads : AtomicUsize ,
2082
2089
}
2083
2090
2084
2091
impl State {
@@ -2087,7 +2094,7 @@ impl State {
2087
2094
rx_waker : AtomicWaker :: new ( ) ,
2088
2095
tx_waker : AtomicWaker :: new ( ) ,
2089
2096
tx_rx_refcount : AtomicU8 :: new ( 0 ) ,
2090
- eager_reads : AtomicBool :: new ( false ) ,
2097
+ eager_reads : AtomicUsize :: new ( 0 ) ,
2091
2098
}
2092
2099
}
2093
2100
}
0 commit comments