aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Špaček <[email protected]>2024-05-26 16:21:11 +0200
committerJan Špaček <[email protected]>2024-06-01 19:46:39 +0200
commitade27b7f212f9548816e5ae21826a230c2345574 (patch)
tree177efd1346ae09ae71d357ec64824ebd53c06e4e
parent41711195e305e45caec3ff8316688a6b6d6af955 (diff)
stm32/usart: disconnect pins of RingBufferedUartRx on drop
-rw-r--r--embassy-stm32/src/usart/ringbuffered.rs10
1 files changed, 10 insertions, 0 deletions
diff --git a/embassy-stm32/src/usart/ringbuffered.rs b/embassy-stm32/src/usart/ringbuffered.rs
index f3a88b93f..8cf75933a 100644
--- a/embassy-stm32/src/usart/ringbuffered.rs
+++ b/embassy-stm32/src/usart/ringbuffered.rs
@@ -4,10 +4,12 @@ use core::sync::atomic::{compiler_fence, Ordering};
4use core::task::Poll; 4use core::task::Poll;
5 5
6use embassy_embedded_hal::SetConfig; 6use embassy_embedded_hal::SetConfig;
7use embassy_hal_internal::PeripheralRef;
7use futures_util::future::{select, Either}; 8use futures_util::future::{select, Either};
8 9
9use super::{clear_interrupt_flags, rdr, reconfigure, sr, Config, ConfigError, Error, Info, State, UartRx}; 10use super::{clear_interrupt_flags, rdr, reconfigure, sr, Config, ConfigError, Error, Info, State, UartRx};
10use crate::dma::ReadableRingBuffer; 11use crate::dma::ReadableRingBuffer;
12use crate::gpio::{AnyPin, SealedPin as _};
11use crate::mode::Async; 13use crate::mode::Async;
12use crate::time::Hertz; 14use crate::time::Hertz;
13use crate::usart::{Regs, Sr}; 15use crate::usart::{Regs, Sr};
@@ -19,6 +21,8 @@ pub struct RingBufferedUartRx<'d> {
19 info: &'static Info, 21 info: &'static Info,
20 state: &'static State, 22 state: &'static State,
21 kernel_clock: Hertz, 23 kernel_clock: Hertz,
24 rx: Option<PeripheralRef<'d, AnyPin>>,
25 rts: Option<PeripheralRef<'d, AnyPin>>,
22 ring_buf: ReadableRingBuffer<'d, u8>, 26 ring_buf: ReadableRingBuffer<'d, u8>,
23} 27}
24 28
@@ -49,6 +53,8 @@ impl<'d> UartRx<'d, Async> {
49 let state = self.state; 53 let state = self.state;
50 let kernel_clock = self.kernel_clock; 54 let kernel_clock = self.kernel_clock;
51 let ring_buf = unsafe { ReadableRingBuffer::new(rx_dma, request, rdr(info.regs), dma_buf, opts) }; 55 let ring_buf = unsafe { ReadableRingBuffer::new(rx_dma, request, rdr(info.regs), dma_buf, opts) };
56 let rx = unsafe { self.rx.as_ref().map(|x| x.clone_unchecked()) };
57 let rts = unsafe { self.rts.as_ref().map(|x| x.clone_unchecked()) };
52 58
53 // Don't disable the clock 59 // Don't disable the clock
54 mem::forget(self); 60 mem::forget(self);
@@ -57,6 +63,8 @@ impl<'d> UartRx<'d, Async> {
57 info, 63 info,
58 state, 64 state,
59 kernel_clock, 65 kernel_clock,
66 rx,
67 rts,
60 ring_buf, 68 ring_buf,
61 } 69 }
62 } 70 }
@@ -221,6 +229,8 @@ impl<'d> RingBufferedUartRx<'d> {
221impl Drop for RingBufferedUartRx<'_> { 229impl Drop for RingBufferedUartRx<'_> {
222 fn drop(&mut self) { 230 fn drop(&mut self) {
223 self.teardown_uart(); 231 self.teardown_uart();
232 self.rx.as_ref().map(|x| x.set_as_disconnected());
233 self.rts.as_ref().map(|x| x.set_as_disconnected());
224 super::drop_tx_rx(self.info, self.state); 234 super::drop_tx_rx(self.info, self.state);
225 } 235 }
226} 236}