diff options
| author | xoviat <[email protected]> | 2021-01-06 14:12:33 -0600 |
|---|---|---|
| committer | xoviat <[email protected]> | 2021-01-06 14:12:33 -0600 |
| commit | 1c3b7541cbfb7793899b002d50700d62c5e1a205 (patch) | |
| tree | 978645a59ed0c93c244c3e5a76689ea1f208a9fe | |
| parent | 27cfcbacb8e54c0182e118d3170c6f8be83a6b7c (diff) | |
use transmute for now
| -rw-r--r-- | embassy-stm32f4/src/serial.rs | 117 |
1 files changed, 63 insertions, 54 deletions
diff --git a/embassy-stm32f4/src/serial.rs b/embassy-stm32f4/src/serial.rs index ea84a2278..a34db9de6 100644 --- a/embassy-stm32f4/src/serial.rs +++ b/embassy-stm32f4/src/serial.rs | |||
| @@ -10,7 +10,7 @@ use core::sync::atomic::{self, Ordering}; | |||
| 10 | use core::task::{Context, Poll}; | 10 | use core::task::{Context, Poll}; |
| 11 | 11 | ||
| 12 | use embassy::interrupt::OwnedInterrupt; | 12 | use embassy::interrupt::OwnedInterrupt; |
| 13 | use embassy::uart::Uart; | 13 | use embassy::uart::{Error, Uart}; |
| 14 | use embassy::util::Signal; | 14 | use embassy::util::Signal; |
| 15 | use embedded_dma::StaticWriteBuffer; | 15 | use embedded_dma::StaticWriteBuffer; |
| 16 | 16 | ||
| @@ -139,39 +139,49 @@ impl Serial<USART1, Stream7<DMA2>, Stream2<DMA2>> { | |||
| 139 | } | 139 | } |
| 140 | 140 | ||
| 141 | impl Uart for Serial<USART1, Stream7<DMA2>, Stream2<DMA2>> { | 141 | impl Uart for Serial<USART1, Stream7<DMA2>, Stream2<DMA2>> { |
| 142 | type SendFuture<'a> = impl Future<Output = Result<(), Error>> + 'a; | ||
| 143 | type ReceiveFuture<'a> = impl Future<Output = Result<(), Error>> + 'a; | ||
| 144 | |||
| 142 | /// Sends serial data. | 145 | /// Sends serial data. |
| 143 | /// | 146 | /// |
| 144 | /// `tx_buffer` is marked as static as per `embedded-dma` requirements. | 147 | /// `tx_buffer` is marked as static as per `embedded-dma` requirements. |
| 145 | /// It it safe to use a buffer with a non static lifetime if memory is not | 148 | /// It it safe to use a buffer with a non static lifetime if memory is not |
| 146 | /// reused until the future has finished. | 149 | /// reused until the future has finished. |
| 147 | fn send<'a>(&'a mut self, buf: &'a mut [u8]) -> dyn Future<Output = Result<(), Error>> { | 150 | #[allow(mutable_transmutes)] |
| 151 | fn send<'a>(&'a mut self, buf: &'a [u8]) -> Self::SendFuture<'a> { | ||
| 148 | unsafe { INSTANCE = self }; | 152 | unsafe { INSTANCE = self }; |
| 149 | 153 | ||
| 150 | let tx_stream = self.tx_stream.take().unwrap(); | 154 | unsafe { |
| 151 | let usart = self.usart.take().unwrap(); | 155 | let static_buf = core::mem::transmute::<&'a [u8], &'static mut [u8]>(buf); |
| 152 | STATE.tx_int.reset(); | 156 | |
| 153 | 157 | let tx_stream = self.tx_stream.take().unwrap(); | |
| 154 | async move { | 158 | let usart = self.usart.take().unwrap(); |
| 155 | let mut tx_transfer = Transfer::init( | 159 | STATE.tx_int.reset(); |
| 156 | tx_stream, | 160 | |
| 157 | usart, | 161 | async move { |
| 158 | buf, | 162 | let mut tx_transfer = Transfer::init( |
| 159 | None, | 163 | tx_stream, |
| 160 | DmaConfig::default() | 164 | usart, |
| 161 | .transfer_complete_interrupt(true) | 165 | static_buf, |
| 162 | .memory_increment(true) | 166 | None, |
| 163 | .double_buffer(false), | 167 | DmaConfig::default() |
| 164 | ); | 168 | .transfer_complete_interrupt(true) |
| 165 | 169 | .memory_increment(true) | |
| 166 | self.tx_int.unpend(); | 170 | .double_buffer(false), |
| 167 | self.tx_int.enable(); | 171 | ); |
| 168 | tx_transfer.start(|_usart| {}); | 172 | |
| 169 | 173 | self.tx_int.unpend(); | |
| 170 | STATE.tx_int.wait().await; | 174 | self.tx_int.enable(); |
| 171 | 175 | tx_transfer.start(|_usart| {}); | |
| 172 | let (tx_stream, usart, _buf, _) = tx_transfer.free(); | 176 | |
| 173 | self.tx_stream.replace(tx_stream); | 177 | STATE.tx_int.wait().await; |
| 174 | self.usart.replace(usart); | 178 | |
| 179 | let (tx_stream, usart, _buf, _) = tx_transfer.free(); | ||
| 180 | self.tx_stream.replace(tx_stream); | ||
| 181 | self.usart.replace(usart); | ||
| 182 | |||
| 183 | Ok(()) | ||
| 184 | } | ||
| 175 | } | 185 | } |
| 176 | } | 186 | } |
| 177 | 187 | ||
| @@ -185,35 +195,34 @@ impl Uart for Serial<USART1, Stream7<DMA2>, Stream2<DMA2>> { | |||
| 185 | /// `rx_buffer` is marked as static as per `embedded-dma` requirements. | 195 | /// `rx_buffer` is marked as static as per `embedded-dma` requirements. |
| 186 | /// It it safe to use a buffer with a non static lifetime if memory is not | 196 | /// It it safe to use a buffer with a non static lifetime if memory is not |
| 187 | /// reused until the future has finished. | 197 | /// reused until the future has finished. |
| 188 | fn receive<'a>(&'a mut self, buf: &'a mut [u8]) -> dyn Future<Output = Result<(), Error>> { | 198 | fn receive<'a>(&'a mut self, buf: &'a mut [u8]) -> Self::ReceiveFuture<'a> { |
| 189 | unsafe { INSTANCE = self }; | 199 | unsafe { INSTANCE = self }; |
| 190 | 200 | ||
| 191 | let rx_stream = self.rx_stream.take().unwrap(); | 201 | unsafe { |
| 192 | let usart = self.usart.take().unwrap(); | 202 | let static_buf = core::mem::transmute::<&'a mut [u8], &'static mut [u8]>(buf); |
| 193 | STATE.rx_int.reset(); | 203 | let rx_stream = self.rx_stream.take().unwrap(); |
| 194 | 204 | let usart = self.usart.take().unwrap(); | |
| 195 | async move { | 205 | STATE.rx_int.reset(); |
| 196 | let mut rx_transfer = Transfer::init( | 206 | async move { |
| 197 | rx_stream, | 207 | let mut rx_transfer = Transfer::init( |
| 198 | usart, | 208 | rx_stream, |
| 199 | buf.static_write_buffer(), | 209 | usart, |
| 200 | None, | 210 | static_buf, |
| 201 | DmaConfig::default() | 211 | None, |
| 202 | .transfer_complete_interrupt(true) | 212 | DmaConfig::default() |
| 203 | .memory_increment(true) | 213 | .transfer_complete_interrupt(true) |
| 204 | .double_buffer(false), | 214 | .memory_increment(true) |
| 205 | ); | 215 | .double_buffer(false), |
| 206 | 216 | ); | |
| 207 | self.rx_int.unpend(); | 217 | self.rx_int.unpend(); |
| 208 | self.rx_int.enable(); | 218 | self.rx_int.enable(); |
| 209 | 219 | rx_transfer.start(|_usart| {}); | |
| 210 | rx_transfer.start(|_usart| {}); | 220 | STATE.rx_int.wait().await; |
| 211 | 221 | let (rx_stream, usart, buf, _) = rx_transfer.free(); | |
| 212 | STATE.rx_int.wait().await; | 222 | self.rx_stream.replace(rx_stream); |
| 213 | 223 | self.usart.replace(usart); | |
| 214 | let (rx_stream, usart, buf, _) = rx_transfer.free(); | 224 | Ok(()) |
| 215 | self.rx_stream.replace(rx_stream); | 225 | } |
| 216 | self.usart.replace(usart); | ||
| 217 | } | 226 | } |
| 218 | } | 227 | } |
| 219 | } | 228 | } |
