@@ -567,19 +567,21 @@ void start_dma_if_possible(direction_t direction, size_t size)
567567 uint32_t dma_completed = m0_state .m4_count ;
568568 uint32_t samp_offset = dma_started & USB_SAMP_BUFFER_MASK ;
569569 uint32_t bulk_offset = dma_started & USB_BULK_BUFFER_MASK ;
570- uint32_t data_available , space_in_use , space_available ;
570+ uint32_t data_available , space_in_use , space_available , samp_buf_margin ;
571571 uint8_t * dest , * src ;
572572
573573 if (direction == DIRECTION_RX ) {
574574 data_available = sampling_completed - dma_started ;
575575 space_in_use = usb_completed - dma_completed ;
576576 space_available = USB_BULK_BUFFER_SIZE - space_in_use ;
577+ samp_buf_margin = USB_SAMP_BUFFER_SIZE - data_available ;
577578 src = & usb_samp_buffer [samp_offset ];
578579 dest = & usb_bulk_buffer [bulk_offset ];
579580 } else {
580581 data_available = usb_completed - dma_started ;
581582 space_in_use = dma_started - sampling_completed ;
582583 space_available = USB_SAMP_BUFFER_SIZE - space_in_use ;
584+ samp_buf_margin = space_available ;
583585 src = & usb_bulk_buffer [bulk_offset ];
584586 dest = & usb_samp_buffer [samp_offset ];
585587 }
@@ -588,9 +590,11 @@ void start_dma_if_possible(direction_t direction, size_t size)
588590 return ;
589591 }
590592
591- bool ahb_busy = !((sampling_completed ^ dma_started ) & BUF_HALF_MASK );
593+ uint32_t m0_buf_half = sampling_completed & BUF_HALF_MASK ;
594+ uint32_t dma_buf_half = dma_started & BUF_HALF_MASK ;
595+ bool same_buf_half = m0_buf_half == dma_buf_half ;
592596
593- if (ahb_busy ) {
597+ if (same_buf_half && samp_buf_margin >= ( USB_SAMP_BUFFER_SIZE / 2 ) ) {
594598 return ;
595599 }
596600
0 commit comments