Skip to content

Commit 33bf9ad

Browse files
committed
Avoid accessing the same half of the sample buffer as the M0.
1 parent 8a9ea2e commit 33bf9ad

File tree

1 file changed

+8
-3
lines changed

1 file changed

+8
-3
lines changed

firmware/hackrf_usb/usb_api_transceiver.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@
5252
#define USB_TRANSFER_SIZE 0x4000
5353
#define DMA_TRANSFER_SIZE 0x2000
5454

55+
#define BUF_HALF_MASK (USB_SAMP_BUFFER_SIZE >> 1)
56+
5557
#define DMA_CHANNEL 1
5658

5759
volatile uint32_t dma_started, usb_started, usb_completed;
@@ -472,7 +474,8 @@ void rx_mode(uint32_t seq)
472474
uint32_t data_available = data_gathered - dma_started;
473475
uint32_t space_in_use = usb_completed - dma_completed;
474476
uint32_t space_available = USB_BULK_BUFFER_SIZE - space_in_use;
475-
if (!dma_busy && (data_available >= DMA_TRANSFER_SIZE) &&
477+
bool ahb_busy = !((data_gathered ^ dma_started) & BUF_HALF_MASK);
478+
if (!dma_busy && !ahb_busy && (data_available >= DMA_TRANSFER_SIZE) &&
476479
(space_available >= DMA_TRANSFER_SIZE)) {
477480
uint32_t samp_offset = dma_started & USB_SAMP_BUFFER_MASK;
478481
uint32_t bulk_offset = dma_started & USB_BULK_BUFFER_MASK;
@@ -536,7 +539,8 @@ void tx_mode(uint32_t seq)
536539
uint32_t data_available = usb_completed - dma_started;
537540
uint32_t space_in_use = dma_started - data_used;
538541
uint32_t space_available = USB_SAMP_BUFFER_SIZE - space_in_use;
539-
if (!dma_busy && (data_available >= DMA_TRANSFER_SIZE) &&
542+
bool ahb_busy = !((data_used ^ dma_started) & BUF_HALF_MASK);
543+
if (!dma_busy && !ahb_busy && (data_available >= DMA_TRANSFER_SIZE) &&
540544
(space_available >= DMA_TRANSFER_SIZE)) {
541545
uint32_t samp_offset = dma_started & USB_SAMP_BUFFER_MASK;
542546
uint32_t bulk_offset = dma_started & USB_BULK_BUFFER_MASK;
@@ -577,9 +581,10 @@ void tx_mode(uint32_t seq)
577581
uint32_t space_available = USB_SAMP_BUFFER_SIZE - space_in_use;
578582
uint32_t samp_offset = dma_started & USB_SAMP_BUFFER_MASK;
579583
uint32_t bulk_offset = dma_started & USB_BULK_BUFFER_MASK;
584+
bool ahb_busy = !((data_used ^ dma_started) & BUF_HALF_MASK);
580585
size_t size = data_available >= DMA_TRANSFER_SIZE ? DMA_TRANSFER_SIZE :
581586
data_available;
582-
if (dma_busy || size > space_available) {
587+
if (dma_busy || ahb_busy || size > space_available) {
583588
continue;
584589
}
585590
transceiver_start_dma(

0 commit comments

Comments
 (0)