@@ -467,8 +467,11 @@ where
467
467
468
468
/// Changes the buffer and restarts or continues a double buffer
469
469
/// transfer. This must be called immediately after a transfer complete
470
- /// event. Returns the old buffer together with its `CurrentBuffer`. If an
471
- /// error occurs, this method will return the new buffer with the error.
470
+ /// event. Returns (old_buffer, `CurrentBuffer`, remaining), where
471
+ /// `old_buffer` is the old buffer, `CurrentBuffer` indicates which buffer
472
+ /// the data represents, and `remaining` indicates the number of remaining
473
+ /// data in the transfer. If an error occurs, this method will return the
474
+ /// new buffer with the error.
472
475
///
473
476
/// This method will clear the transfer complete flag on entry, it will also
474
477
/// clear it again if an overrun occurs during its execution. Moreover, if
@@ -481,7 +484,7 @@ where
481
484
pub fn next_transfer (
482
485
& mut self ,
483
486
mut new_buf : BUF ,
484
- ) -> Result < ( BUF , CurrentBuffer ) , DMAError < BUF > > {
487
+ ) -> Result < ( BUF , CurrentBuffer , usize ) , DMAError < BUF > > {
485
488
if self . double_buf . is_some ( )
486
489
&& DIR :: direction ( ) != DmaDirection :: MemoryToMemory
487
490
{
@@ -513,10 +516,10 @@ where
513
516
// preceding reads"
514
517
compiler_fence ( Ordering :: Acquire ) ;
515
518
516
- let old_buf = self . buf . replace ( new_buf) ;
517
-
518
519
// We always have a buffer, so unwrap can't fail
519
- return Ok ( ( old_buf. unwrap ( ) , CurrentBuffer :: FirstBuffer ) ) ;
520
+ let old_buf = self . buf . replace ( new_buf) . unwrap ( ) ;
521
+
522
+ return Ok ( ( old_buf, CurrentBuffer :: FirstBuffer , 0 ) ) ;
520
523
} else {
521
524
unsafe {
522
525
self . stream
@@ -535,10 +538,10 @@ where
535
538
// preceding reads"
536
539
compiler_fence ( Ordering :: Acquire ) ;
537
540
538
- let old_buf = self . double_buf . replace ( new_buf) ;
539
-
540
541
// double buffering, unwrap can never fail
541
- return Ok ( ( old_buf. unwrap ( ) , CurrentBuffer :: DoubleBuffer ) ) ;
542
+ let old_buf = self . double_buf . replace ( new_buf) . unwrap ( ) ;
543
+
544
+ return Ok ( ( old_buf, CurrentBuffer :: DoubleBuffer , 0 ) ) ;
542
545
}
543
546
}
544
547
self . stream . disable ( ) ;
@@ -547,6 +550,9 @@ where
547
550
// "No re-ordering of reads and writes across this point is allowed"
548
551
compiler_fence ( Ordering :: SeqCst ) ;
549
552
553
+ // Check how many data in the transfer are remaining.
554
+ let remaining_data = STREAM :: get_number_of_transfers ( ) ;
555
+
550
556
// NOTE(unsafe) We now own this buffer and we won't call any &mut
551
557
// methods on it until the end of the DMA transfer
552
558
let buf_len = unsafe {
@@ -556,7 +562,9 @@ where
556
562
buf_len
557
563
} ;
558
564
self . stream . set_number_of_transfers ( buf_len as u16 ) ;
559
- let old_buf = self . buf . replace ( new_buf) ;
565
+
566
+ // We own the buffer now, so unwrap is always safe.
567
+ let old_buf = self . buf . replace ( new_buf) . unwrap ( ) ;
560
568
561
569
// Ensure that all transfers to normal memory complete before
562
570
// subsequent memory transfers.
@@ -573,7 +581,7 @@ where
573
581
self . stream . enable ( ) ;
574
582
}
575
583
576
- Ok ( ( old_buf. unwrap ( ) , CurrentBuffer :: FirstBuffer ) )
584
+ Ok ( ( old_buf, CurrentBuffer :: FirstBuffer , remaining_data as usize ) )
577
585
}
578
586
579
587
/// Stops the stream and returns the underlying resources.
@@ -651,6 +659,10 @@ where
651
659
/// error will be returned if this method is called before the end of a
652
660
/// transfer while double buffering and the closure won't be executed.
653
661
///
662
+ /// The closure accepts the current buffer, the `CurrentBuffer` indicating
663
+ /// which buffer is provided, and a `remaining` parameter indicating the
664
+ /// number of transfers not completed in the DMA transfer.
665
+ ///
654
666
/// # Panics
655
667
///
656
668
/// This method will panic when double buffering and one or both of the
@@ -672,7 +684,7 @@ where
672
684
f : F ,
673
685
) -> Result < T , DMAError < ( ) > >
674
686
where
675
- F : FnOnce ( BUF , CurrentBuffer ) -> ( BUF , T ) ,
687
+ F : FnOnce ( BUF , CurrentBuffer , usize ) -> ( BUF , T ) ,
676
688
{
677
689
if self . double_buf . is_some ( )
678
690
&& DIR :: direction ( ) != DmaDirection :: MemoryToMemory
@@ -689,7 +701,7 @@ where
689
701
} else {
690
702
self . double_buf . take ( ) . unwrap ( )
691
703
} ;
692
- let r = f ( db, !current_buffer) ;
704
+ let r = f ( db, !current_buffer, 0 ) ;
693
705
let mut new_buf = r. 0 ;
694
706
let ( new_buf_ptr, new_buf_len) = new_buf. write_buffer ( ) ;
695
707
@@ -749,9 +761,11 @@ where
749
761
// "No re-ordering of reads and writes across this point is allowed"
750
762
compiler_fence ( Ordering :: SeqCst ) ;
751
763
764
+ let remaining_data = STREAM :: get_number_of_transfers ( ) ;
765
+
752
766
// Can never fail, we never let the Transfer without a buffer
753
767
let old_buf = self . buf . take ( ) . unwrap ( ) ;
754
- let r = f ( old_buf, CurrentBuffer :: FirstBuffer ) ;
768
+ let r = f ( old_buf, CurrentBuffer :: FirstBuffer , remaining_data as usize ) ;
755
769
let mut new_buf = r. 0 ;
756
770
757
771
let ( buf_ptr, buf_len) = new_buf. write_buffer ( ) ;
0 commit comments