aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxoviat <[email protected]>2021-01-06 14:12:33 -0600
committerxoviat <[email protected]>2021-01-06 14:12:33 -0600
commit1c3b7541cbfb7793899b002d50700d62c5e1a205 (patch)
tree978645a59ed0c93c244c3e5a76689ea1f208a9fe
parent27cfcbacb8e54c0182e118d3170c6f8be83a6b7c (diff)
use transmute for now
-rw-r--r--embassy-stm32f4/src/serial.rs117
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};
10use core::task::{Context, Poll}; 10use core::task::{Context, Poll};
11 11
12use embassy::interrupt::OwnedInterrupt; 12use embassy::interrupt::OwnedInterrupt;
13use embassy::uart::Uart; 13use embassy::uart::{Error, Uart};
14use embassy::util::Signal; 14use embassy::util::Signal;
15use embedded_dma::StaticWriteBuffer; 15use embedded_dma::StaticWriteBuffer;
16 16
@@ -139,39 +139,49 @@ impl Serial<USART1, Stream7<DMA2>, Stream2<DMA2>> {
139} 139}
140 140
141impl Uart for Serial<USART1, Stream7<DMA2>, Stream2<DMA2>> { 141impl 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}