1
- use core:: { cell :: RefCell , marker:: PhantomData , ops :: { Deref , DerefMut } } ;
1
+ use core:: { marker:: PhantomData , num :: NonZeroUsize } ;
2
2
3
3
use embedded_dma:: { ReadBuffer , WriteBuffer } ;
4
4
@@ -151,14 +151,14 @@ where
151
151
}
152
152
}
153
153
154
- pub struct DuplexDmaTransfer < SPI : ' static , W : FrameSize + ' static , TX , RX , S , D >
155
- {
156
- spi : & ' static mut Spi < SPI , W > ,
154
+ pub struct DuplexDmaTransfer < ' a , SPI , W : FrameSize , TX , RX , S , D > {
155
+ spi : & ' a mut Spi < SPI , W > ,
157
156
tx_transfer : DmaTransfer < TX , S , DmaTx < SPI , W > , MemoryToPeripheral > ,
158
157
rx_transfer : DmaTransfer < RX , DmaRx < SPI , W > , D , PeripheralToMemory > ,
158
+ len : usize ,
159
159
}
160
160
161
- impl < SPI , W , RX , TX , S , D > DuplexDmaTransfer < SPI , W , TX , RX , S , D >
161
+ impl < ' a , SPI , W , RX , TX , S , D > DuplexDmaTransfer < ' a , SPI , W , TX , RX , S , D >
162
162
where
163
163
SPI : Instance ,
164
164
W : FrameSize + Word ,
@@ -168,12 +168,14 @@ where
168
168
D : WriteBuffer < Word = W > ,
169
169
{
170
170
pub fn new (
171
- spi : & ' static mut Spi < SPI , W > ,
171
+ spi : & ' a mut Spi < SPI , W > ,
172
172
tx_channel : TX ,
173
173
rx_channel : RX ,
174
174
source : S ,
175
- destination : D ,
175
+ mut destination : D ,
176
176
) -> Self {
177
+ let ( _, dest_len) = unsafe { destination. write_buffer ( ) } ;
178
+
177
179
let tx_config = DmaConfig :: new ( ) . with_request ( SPI :: tx_dma_request ( ) ) ;
178
180
let tx_destination = DmaTx :: new ( ) ;
179
181
let tx_transfer = DmaTransfer :: memory_to_peripheral (
@@ -194,6 +196,7 @@ where
194
196
spi,
195
197
tx_transfer,
196
198
rx_transfer,
199
+ len : dest_len,
197
200
}
198
201
}
199
202
@@ -207,12 +210,11 @@ where
207
210
208
211
pub fn start ( & mut self ) -> Result < ( ) , Error > {
209
212
self . spi . enable_rx_dma ( ) ;
210
-
211
- self . rx_transfer . start ( ) ?;
213
+ self . rx_transfer . start_nb ( ) ;
212
214
self . tx_transfer . start_nb ( ) ;
213
215
self . spi . enable_tx_dma ( ) ;
214
- self . spi . enable ( ) ;
215
- self . spi . start_transfer ( ) ;
216
+ self . spi
217
+ . setup_transaction ( NonZeroUsize :: new ( self . len ) . unwrap ( ) ) ? ;
216
218
Ok ( ( ) )
217
219
}
218
220
@@ -235,7 +237,15 @@ where
235
237
self . spi . disable_dma ( ) ;
236
238
}
237
239
238
- pub fn free ( self ) -> Result < ( TX , RX , S , D ) , Error > {
240
+ pub fn abort ( & mut self ) -> Result < ( ) , Error > {
241
+ self . end_transfer ( ) ;
242
+ self . tx_transfer . abort ( ) ?;
243
+ self . rx_transfer . abort ( ) ?;
244
+ Ok ( ( ) )
245
+ }
246
+
247
+ pub fn free ( mut self ) -> Result < ( TX , RX , S , D ) , Error > {
248
+ self . end_transfer ( ) ;
239
249
let ( tx, s, _) = self . tx_transfer . free ( ) ?;
240
250
let ( rx, _, d) = self . rx_transfer . free ( ) ?;
241
251
Ok ( ( tx, rx, s, d) )
0 commit comments