|
52 | 52 | #define USB_TRANSFER_SIZE 0x4000 |
53 | 53 | #define DMA_TRANSFER_SIZE 0x2000 |
54 | 54 |
|
| 55 | +#define BUF_HALF_MASK (USB_SAMP_BUFFER_SIZE >> 1) |
| 56 | + |
55 | 57 | #define DMA_CHANNEL 1 |
56 | 58 |
|
57 | 59 | volatile uint32_t dma_started, usb_started, usb_completed; |
@@ -472,7 +474,8 @@ void rx_mode(uint32_t seq) |
472 | 474 | uint32_t data_available = data_gathered - dma_started; |
473 | 475 | uint32_t space_in_use = usb_completed - dma_completed; |
474 | 476 | 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) && |
476 | 479 | (space_available >= DMA_TRANSFER_SIZE)) { |
477 | 480 | uint32_t samp_offset = dma_started & USB_SAMP_BUFFER_MASK; |
478 | 481 | uint32_t bulk_offset = dma_started & USB_BULK_BUFFER_MASK; |
@@ -536,7 +539,8 @@ void tx_mode(uint32_t seq) |
536 | 539 | uint32_t data_available = usb_completed - dma_started; |
537 | 540 | uint32_t space_in_use = dma_started - data_used; |
538 | 541 | 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) && |
540 | 544 | (space_available >= DMA_TRANSFER_SIZE)) { |
541 | 545 | uint32_t samp_offset = dma_started & USB_SAMP_BUFFER_MASK; |
542 | 546 | uint32_t bulk_offset = dma_started & USB_BULK_BUFFER_MASK; |
@@ -577,9 +581,10 @@ void tx_mode(uint32_t seq) |
577 | 581 | uint32_t space_available = USB_SAMP_BUFFER_SIZE - space_in_use; |
578 | 582 | uint32_t samp_offset = dma_started & USB_SAMP_BUFFER_MASK; |
579 | 583 | uint32_t bulk_offset = dma_started & USB_BULK_BUFFER_MASK; |
| 584 | + bool ahb_busy = !((data_used ^ dma_started) & BUF_HALF_MASK); |
580 | 585 | size_t size = data_available >= DMA_TRANSFER_SIZE ? DMA_TRANSFER_SIZE : |
581 | 586 | data_available; |
582 | | - if (dma_busy || size > space_available) { |
| 587 | + if (dma_busy || ahb_busy || size > space_available) { |
583 | 588 | continue; |
584 | 589 | } |
585 | 590 | transceiver_start_dma( |
|
0 commit comments