@@ -840,6 +840,7 @@ where
840840
841841pub mod dma {
842842 use core:: {
843+ cell:: Cell ,
843844 cmp:: min,
844845 sync:: atomic:: { fence, Ordering } ,
845846 } ;
@@ -1046,6 +1047,9 @@ pub mod dma {
10461047 dma_buf : Buf ,
10471048 is_rx : bool ,
10481049 is_tx : bool ,
1050+
1051+ rx_future_awaited : bool ,
1052+ tx_future_awaited : bool ,
10491053 }
10501054
10511055 impl < ' d , T , C , M , DmaMode , Buf > SpiDmaTransfer < ' d , T , C , M , DmaMode , Buf >
@@ -1056,14 +1060,30 @@ pub mod dma {
10561060 M : DuplexMode ,
10571061 DmaMode : Mode ,
10581062 {
1063+ fn new (
1064+ spi_dma : SpiDma < ' d , T , C , M , DmaMode > ,
1065+ dma_buf : Buf ,
1066+ is_rx : bool ,
1067+ is_tx : bool ,
1068+ ) -> Self {
1069+ Self {
1070+ spi_dma,
1071+ dma_buf,
1072+ is_rx,
1073+ is_tx,
1074+ rx_future_awaited : false ,
1075+ tx_future_awaited : false ,
1076+ }
1077+ }
1078+
10591079 pub fn is_done ( & self ) -> bool {
1060- if self . is_tx && !self . spi_dma . channel . tx . is_done ( ) {
1080+ if self . is_tx && !self . tx_future_awaited && ! self . spi_dma . channel . tx . is_done ( ) {
10611081 return false ;
10621082 }
10631083 if self . spi_dma . spi . busy ( ) {
10641084 return false ;
10651085 }
1066- if self . is_rx {
1086+ if self . is_rx && ! self . rx_future_awaited {
10671087 // If this is an asymmetric transfer and the RX side is smaller, the RX channel
10681088 // will never be "done" as it won't have enough descriptors/buffer to receive
10691089 // the EOF bit from the SPI. So instead the RX channel will hit
@@ -1096,14 +1116,16 @@ pub mod dma {
10961116 M : DuplexMode ,
10971117 {
10981118 pub async fn wait_for_done ( & mut self ) {
1099- if self . is_tx {
1119+ if self . is_tx && ! self . tx_future_awaited {
11001120 let _ = DmaTxFuture :: new ( & mut self . spi_dma . channel . tx ) . await ;
1121+ self . tx_future_awaited = true ;
11011122 }
11021123
11031124 // As a future enhancement, setup Spi Future in here as well.
11041125
1105- if self . is_rx {
1126+ if self . is_rx && ! self . rx_future_awaited {
11061127 let _ = DmaRxFuture :: new ( & mut self . spi_dma . channel . rx ) . await ;
1128+ self . rx_future_awaited = true ;
11071129 }
11081130 }
11091131 }
@@ -1141,12 +1163,7 @@ pub mod dma {
11411163 return Err ( ( e, self , buffer) ) ;
11421164 }
11431165
1144- Ok ( SpiDmaTransfer {
1145- spi_dma : self ,
1146- dma_buf : buffer,
1147- is_tx : true ,
1148- is_rx : false ,
1149- } )
1166+ Ok ( SpiDmaTransfer :: new ( self , buffer, true , false ) )
11501167 }
11511168
11521169 /// Perform a DMA read.
@@ -1161,7 +1178,7 @@ pub mod dma {
11611178 buffer : DmaRxBuf ,
11621179 ) -> Result < SpiDmaTransfer < ' d , T , C , M , DmaMode , DmaRxBuf > , ( Error , Self , DmaRxBuf ) >
11631180 {
1164- let bytes_to_read = buffer. capacity ( ) ;
1181+ let bytes_to_read = buffer. len ( ) ;
11651182 if bytes_to_read > MAX_DMA_SIZE {
11661183 return Err ( ( Error :: MaxDmaTransferSizeExceeded , self , buffer) ) ;
11671184 }
@@ -1174,12 +1191,7 @@ pub mod dma {
11741191 return Err ( ( e, self , buffer) ) ;
11751192 }
11761193
1177- Ok ( SpiDmaTransfer {
1178- spi_dma : self ,
1179- dma_buf : buffer,
1180- is_tx : false ,
1181- is_rx : true ,
1182- } )
1194+ Ok ( SpiDmaTransfer :: new ( self , buffer, false , true ) )
11831195 }
11841196
11851197 /// Perform a DMA transfer
@@ -1197,7 +1209,7 @@ pub mod dma {
11971209 ( Error , Self , DmaTxBuf , DmaRxBuf ) ,
11981210 > {
11991211 let bytes_to_write = tx_buffer. len ( ) ;
1200- let bytes_to_read = rx_buffer. capacity ( ) ;
1212+ let bytes_to_read = rx_buffer. len ( ) ;
12011213
12021214 if bytes_to_write > MAX_DMA_SIZE || bytes_to_read > MAX_DMA_SIZE {
12031215 return Err ( (
@@ -1222,12 +1234,12 @@ pub mod dma {
12221234 return Err ( ( e, self , tx_buffer, rx_buffer) ) ;
12231235 }
12241236
1225- Ok ( SpiDmaTransfer {
1226- spi_dma : self ,
1227- dma_buf : ( tx_buffer, rx_buffer) ,
1228- is_tx : true ,
1229- is_rx : true ,
1230- } )
1237+ Ok ( SpiDmaTransfer :: new (
1238+ self ,
1239+ ( tx_buffer, rx_buffer) ,
1240+ true ,
1241+ true ,
1242+ ) )
12311243 }
12321244 }
12331245
@@ -1250,7 +1262,7 @@ pub mod dma {
12501262 buffer : DmaRxBuf ,
12511263 ) -> Result < SpiDmaTransfer < ' d , T , C , M , DmaMode , DmaRxBuf > , ( Error , Self , DmaRxBuf ) >
12521264 {
1253- let bytes_to_read = buffer. capacity ( ) ;
1265+ let bytes_to_read = buffer. len ( ) ;
12541266 if bytes_to_read > MAX_DMA_SIZE {
12551267 return Err ( ( Error :: MaxDmaTransferSizeExceeded , self , buffer) ) ;
12561268 }
@@ -1313,12 +1325,7 @@ pub mod dma {
13131325 return Err ( ( e, self , buffer) ) ;
13141326 }
13151327
1316- Ok ( SpiDmaTransfer {
1317- spi_dma : self ,
1318- dma_buf : buffer,
1319- is_tx : false ,
1320- is_rx : true ,
1321- } )
1328+ Ok ( SpiDmaTransfer :: new ( self , buffer, false , true ) )
13221329 }
13231330
13241331 #[ allow( clippy:: type_complexity) ]
@@ -1395,12 +1402,7 @@ pub mod dma {
13951402 return Err ( ( e, self , buffer) ) ;
13961403 }
13971404
1398- Ok ( SpiDmaTransfer {
1399- spi_dma : self ,
1400- dma_buf : buffer,
1401- is_tx : true ,
1402- is_rx : false ,
1403- } )
1405+ Ok ( SpiDmaTransfer :: new ( self , buffer, true , false ) )
14041406 }
14051407 }
14061408
0 commit comments