Merge pull request #3319 from badrbouslikhin/buffered-uart-rx-fix
fix(stm32): fix dma and idle line detection in ringbuffereduartrx
This commit is contained in:
commit
d5e77f69c1
@ -777,6 +777,7 @@ impl<'a, W: Word> ReadableRingBuffer<'a, W> {
|
|||||||
let dir = Dir::PeripheralToMemory;
|
let dir = Dir::PeripheralToMemory;
|
||||||
let data_size = W::size();
|
let data_size = W::size();
|
||||||
|
|
||||||
|
options.half_transfer_ir = true;
|
||||||
options.complete_transfer_ir = true;
|
options.complete_transfer_ir = true;
|
||||||
options.circular = true;
|
options.circular = true;
|
||||||
|
|
||||||
|
|||||||
@ -184,20 +184,6 @@ impl<'d> RingBufferedUartRx<'d> {
|
|||||||
async fn wait_for_data_or_idle(&mut self) -> Result<(), Error> {
|
async fn wait_for_data_or_idle(&mut self) -> Result<(), Error> {
|
||||||
compiler_fence(Ordering::SeqCst);
|
compiler_fence(Ordering::SeqCst);
|
||||||
|
|
||||||
let mut dma_init = false;
|
|
||||||
// Future which completes when there is dma is half full or full
|
|
||||||
let dma = poll_fn(|cx| {
|
|
||||||
self.ring_buf.set_waker(cx.waker());
|
|
||||||
|
|
||||||
let status = match dma_init {
|
|
||||||
false => Poll::Pending,
|
|
||||||
true => Poll::Ready(()),
|
|
||||||
};
|
|
||||||
|
|
||||||
dma_init = true;
|
|
||||||
status
|
|
||||||
});
|
|
||||||
|
|
||||||
// Future which completes when idle line is detected
|
// Future which completes when idle line is detected
|
||||||
let s = self.state;
|
let s = self.state;
|
||||||
let uart = poll_fn(|cx| {
|
let uart = poll_fn(|cx| {
|
||||||
@ -219,9 +205,23 @@ impl<'d> RingBufferedUartRx<'d> {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
match select(dma, uart).await {
|
let mut dma_init = false;
|
||||||
Either::Left(((), _)) => Ok(()),
|
// Future which completes when there is dma is half full or full
|
||||||
Either::Right((result, _)) => result,
|
let dma = poll_fn(|cx| {
|
||||||
|
self.ring_buf.set_waker(cx.waker());
|
||||||
|
|
||||||
|
let status = match dma_init {
|
||||||
|
false => Poll::Pending,
|
||||||
|
true => Poll::Ready(()),
|
||||||
|
};
|
||||||
|
|
||||||
|
dma_init = true;
|
||||||
|
status
|
||||||
|
});
|
||||||
|
|
||||||
|
match select(uart, dma).await {
|
||||||
|
Either::Left((result, _)) => result,
|
||||||
|
Either::Right(((), _)) => Ok(()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user