diff --git a/src/portable/espressif/esp32s2/dcd_esp32s2.c b/src/portable/espressif/esp32s2/dcd_esp32s2.c index 72fb4ba4..25e54418 100644 --- a/src/portable/espressif/esp32s2/dcd_esp32s2.c +++ b/src/portable/espressif/esp32s2/dcd_esp32s2.c @@ -321,6 +321,7 @@ bool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t to xfer_ctl_t * xfer = XFER_CTL_BASE(epnum, dir); xfer->buffer = buffer; + xfer->ff = NULL; xfer->total_len = total_bytes; xfer->queued_len = 0; xfer->short_packet = false; @@ -523,7 +524,12 @@ static void receive_packet(xfer_ctl_t *xfer, /* usb_out_endpoint_t * out_ep, */ } // Common buffer read - if (xfer->buffer) + if (xfer->ff) + { + // Ring buffer + tu_fifo_write_n(xfer->ff, (const void *) rx_fifo, to_recv_size); + } + else { uint8_t to_recv_rem = to_recv_size % 4; uint16_t to_recv_size_aligned = to_recv_size - to_recv_rem; @@ -556,12 +562,6 @@ static void receive_packet(xfer_ctl_t *xfer, /* usb_out_endpoint_t * out_ep, */ last_32b_bound[2] = (tmp & 0x00FF0000) >> 16; } } - - } - else - { - // Ring buffer - tu_fifo_write_n(xfer->ff, (const void *) rx_fifo, to_recv_size); } xfer->queued_len += xfer_size; @@ -581,7 +581,11 @@ static void transmit_packet(xfer_ctl_t *xfer, volatile usb_in_endpoint_t *in_ep, uint16_t to_xfer_size = (remaining > xfer->max_size) ? xfer->max_size : remaining; - if (xfer->buffer) + if (xfer->ff) + { + tu_fifo_read_n(xfer->ff, (void *) tx_fifo, to_xfer_size); + } + else { uint8_t to_xfer_rem = to_xfer_size % 4; uint16_t to_xfer_size_aligned = to_xfer_size - to_xfer_rem; @@ -616,10 +620,6 @@ static void transmit_packet(xfer_ctl_t *xfer, volatile usb_in_endpoint_t *in_ep, (*tx_fifo) = tmp; } } - else - { - tu_fifo_read_n(xfer->ff, (void *) tx_fifo, to_xfer_size); - } } static void read_rx_fifo(void) diff --git a/src/portable/microchip/samg/dcd_samg.c b/src/portable/microchip/samg/dcd_samg.c index 6e7e84a9..12b2633a 100644 --- a/src/portable/microchip/samg/dcd_samg.c +++ b/src/portable/microchip/samg/dcd_samg.c @@ -61,6 +61,7 @@ void xfer_epsize_set(xfer_desc_t* xfer, uint16_t epsize) void xfer_begin(xfer_desc_t* xfer, uint8_t * buffer, uint16_t total_bytes) { xfer->buffer = buffer; + xfer->ff = NULL; xfer->total_len = total_bytes; xfer->actual_len = 0; } @@ -68,6 +69,7 @@ void xfer_begin(xfer_desc_t* xfer, uint8_t * buffer, uint16_t total_bytes) void xfer_end(xfer_desc_t* xfer) { xfer->buffer = NULL; + xfer->ff = NULL; xfer->total_len = 0; xfer->actual_len = 0; } @@ -82,7 +84,7 @@ void xfer_packet_done(xfer_desc_t* xfer) { uint16_t const xact_len = xfer_packet_len(xfer); - if (xfer->buffer) xfer->buffer += xact_len; + xfer->buffer += xact_len; xfer->actual_len += xact_len; } @@ -436,13 +438,13 @@ void dcd_int_handler(uint8_t rhport) if (xact_len) { // write to EP fifo - if (xfer->buffer) + if (xfer->ff) { - xact_ep_write(epnum, xfer->buffer, xact_len); + tu_fifo_read_n(ff, (void *) &UDP->UDP_FDR[epnum], xact_len); } else { - tu_fifo_read_n(ff, (void *) &UDP->UDP_FDR[epnum], xact_len); + xact_ep_write(epnum, xfer->buffer, xact_len); } // TX ready for transfer @@ -469,13 +471,13 @@ void dcd_int_handler(uint8_t rhport) uint16_t const xact_len = (uint16_t) ((UDP->UDP_CSR[epnum] & UDP_CSR_RXBYTECNT_Msk) >> UDP_CSR_RXBYTECNT_Pos); // Read from EP fifo - if (xfer->buffer) + if (xfer->ff) { - xact_ep_read(epnum, xfer->buffer, xact_len); + tu_fifo_write_n(xfer->ff, (const void *) &UDP->UDP_FDR[epnum], xact_len); } else { - tu_fifo_write_n(xfer->ff, (const void *) &UDP->UDP_FDR[epnum], xact_len); + xact_ep_read(epnum, xfer->buffer, xact_len); } xfer_packet_done(xfer); diff --git a/src/portable/nuvoton/nuc120/dcd_nuc120.c b/src/portable/nuvoton/nuc120/dcd_nuc120.c index 0c3bd9a6..9ff34e76 100644 --- a/src/portable/nuvoton/nuc120/dcd_nuc120.c +++ b/src/portable/nuvoton/nuc120/dcd_nuc120.c @@ -144,13 +144,13 @@ static void dcd_in_xfer(struct xfer_ctl_t *xfer, USBD_EP_T *ep) { uint16_t bytes_now = tu_min16(xfer->in_remaining_bytes, xfer->max_packet_size); - if (xfer->data_ptr) + if (xfer->ff) { - memcpy((uint8_t *)(USBD_BUF_BASE + ep->BUFSEG), xfer->data_ptr, bytes_now); + tu_fifo_read_n(xfer->ff, (void *) (USBD_BUF_BASE + ep->BUFSEG), bytes_now); } else { - tu_fifo_read_n(xfer->ff, (void *) (USBD_BUF_BASE + ep->BUFSEG), bytes_now); + memcpy((uint8_t *)(USBD_BUF_BASE + ep->BUFSEG), xfer->data_ptr, bytes_now); } ep->MXPLD = bytes_now; @@ -277,6 +277,7 @@ bool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t to /* store away the information we'll needing now and later */ xfer->data_ptr = buffer; + xfer->ff = NULL; xfer->in_remaining_bytes = total_bytes; xfer->total_bytes = total_bytes; @@ -429,14 +430,14 @@ void dcd_int_handler(uint8_t rhport) if (out_ep) { /* copy the data from the PC to the previously provided buffer */ - if (xfer->data_ptr) + if (xfer->ff) { - memcpy(xfer->data_ptr, (uint8_t *)(USBD_BUF_BASE + ep->BUFSEG), available_bytes); - xfer->data_ptr += available_bytes; + tu_fifo_write_n(xfer->ff, (const void *) (USBD_BUF_BASE + ep->BUFSEG), available_bytes); } else { - tu_fifo_write_n(xfer->ff, (const void *) (USBD_BUF_BASE + ep->BUFSEG), available_bytes); + memcpy(xfer->data_ptr, (uint8_t *)(USBD_BUF_BASE + ep->BUFSEG), available_bytes); + xfer->data_ptr += available_bytes; } xfer->out_bytes_so_far += available_bytes; @@ -452,8 +453,7 @@ void dcd_int_handler(uint8_t rhport) /* update the bookkeeping to reflect the data that has now been sent to the PC */ xfer->in_remaining_bytes -= available_bytes; - /* increment only if xfer->data_ptr != NULL - if xfer->data_ptr == NULL then a FIFO is used for which xfer->data_ptr MUST STAY ZERO! */ - if (xfer->data_ptr) xfer->data_ptr += available_bytes; + xfer->data_ptr += available_bytes; /* if more data to send, send it; otherwise, alert TinyUSB that we've finished */ if (xfer->in_remaining_bytes) diff --git a/src/portable/nuvoton/nuc121/dcd_nuc121.c b/src/portable/nuvoton/nuc121/dcd_nuc121.c index 1560d564..a689470d 100644 --- a/src/portable/nuvoton/nuc121/dcd_nuc121.c +++ b/src/portable/nuvoton/nuc121/dcd_nuc121.c @@ -144,13 +144,13 @@ static void dcd_in_xfer(struct xfer_ctl_t *xfer, USBD_EP_T *ep) { uint16_t bytes_now = tu_min16(xfer->in_remaining_bytes, xfer->max_packet_size); - if (xfer->data_ptr) + if (xfer->ff) { - memcpy((uint8_t *)(USBD_BUF_BASE + ep->BUFSEG), xfer->data_ptr, bytes_now); + tu_fifo_read_n(xfer->ff, (void *) (USBD_BUF_BASE + ep->BUFSEG), bytes_now); } else { - tu_fifo_read_n(xfer->ff, (void *) (USBD_BUF_BASE + ep->BUFSEG), bytes_now); + memcpy((uint8_t *)(USBD_BUF_BASE + ep->BUFSEG), xfer->data_ptr, bytes_now); } ep->MXPLD = bytes_now; @@ -281,6 +281,7 @@ bool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t to /* store away the information we'll needing now and later */ xfer->data_ptr = buffer; + xfer->ff = NULL; xfer->in_remaining_bytes = total_bytes; xfer->total_bytes = total_bytes; @@ -438,14 +439,14 @@ void dcd_int_handler(uint8_t rhport) if (out_ep) { /* copy the data from the PC to the previously provided buffer */ - if (xfer->data_ptr) + if (xfer->ff) { - memcpy(xfer->data_ptr, (uint8_t *)(USBD_BUF_BASE + ep->BUFSEG), available_bytes); - xfer->data_ptr += available_bytes; + tu_fifo_write_n(xfer->ff, (const void *) (USBD_BUF_BASE + ep->BUFSEG), available_bytes); } else { - tu_fifo_write_n(xfer->ff, (const void *) (USBD_BUF_BASE + ep->BUFSEG), available_bytes); + memcpy(xfer->data_ptr, (uint8_t *)(USBD_BUF_BASE + ep->BUFSEG), available_bytes); + xfer->data_ptr += available_bytes; } xfer->out_bytes_so_far += available_bytes; @@ -460,7 +461,7 @@ void dcd_int_handler(uint8_t rhport) { /* update the bookkeeping to reflect the data that has now been sent to the PC */ xfer->in_remaining_bytes -= available_bytes; - if (xfer->data_ptr) xfer->data_ptr += available_bytes; + xfer->data_ptr += available_bytes; /* if more data to send, send it; otherwise, alert TinyUSB that we've finished */ if (xfer->in_remaining_bytes) diff --git a/src/portable/nuvoton/nuc505/dcd_nuc505.c b/src/portable/nuvoton/nuc505/dcd_nuc505.c index 92656488..3641b704 100644 --- a/src/portable/nuvoton/nuc505/dcd_nuc505.c +++ b/src/portable/nuvoton/nuc505/dcd_nuc505.c @@ -181,7 +181,11 @@ static void dcd_userEP_in_xfer(struct xfer_ctl_t *xfer, USBD_EP_T *ep) } /* provided buffers are thankfully 32-bit aligned, allowing most data to be transfered as 32-bit */ - if (xfer->data_ptr) + if (xfer->ff) + { + tu_fifo_read_n(xfer->ff, (void *) (ep->EPDAT_BYTE), bytes_now); + } + else { uint16_t countdown = bytes_now; while (countdown > 3) @@ -195,10 +199,6 @@ static void dcd_userEP_in_xfer(struct xfer_ctl_t *xfer, USBD_EP_T *ep) while (countdown--) ep->EPDAT_BYTE = *xfer->data_ptr++; } - else - { - tu_fifo_read_n(xfer->ff, (void *) (ep->EPDAT_BYTE), bytes_now); - } /* for short packets, we must nudge the peripheral to say 'that's all folks' */ if (bytes_now != xfer->max_packet_size) @@ -394,6 +394,7 @@ bool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t to /* store away the information we'll needing now and later */ xfer->data_ptr = buffer; + xfer->ff = NULL; xfer->in_remaining_bytes = total_bytes; xfer->total_bytes = total_bytes; @@ -656,14 +657,15 @@ void dcd_int_handler(uint8_t rhport) #else uint16_t const available_bytes = ep->EPDATCNT & USBD_EPDATCNT_DATCNT_Msk; /* copy the data from the PC to the previously provided buffer */ - if (xfer->data_ptr) + if (xfer->ff) { - for (int count = 0; (count < available_bytes) && (xfer->out_bytes_so_far < xfer->total_bytes); count++, xfer->out_bytes_so_far++) - *xfer->data_ptr++ = ep->EPDAT_BYTE; + tu_fifo_write_n(xfer->ff, (const void *) &ep->EPDAT_BYTE, tu_min16(available_bytes, xfer->total_bytes - xfer->out_bytes_so_far)); } else { - tu_fifo_write_n(xfer->ff, (const void *) &ep->EPDAT_BYTE, tu_min16(available_bytes, xfer->total_bytes - xfer->out_bytes_so_far)); + for (int count = 0; (count < available_bytes) && (xfer->out_bytes_so_far < xfer->total_bytes); count++, xfer->out_bytes_so_far++) + *xfer->data_ptr++ = ep->EPDAT_BYTE; + } /* when the transfer is finished, alert TinyUSB; otherwise, continue accepting more data */ diff --git a/src/portable/st/synopsys/dcd_synopsys.c b/src/portable/st/synopsys/dcd_synopsys.c index b6dacd92..5f8c4463 100644 --- a/src/portable/st/synopsys/dcd_synopsys.c +++ b/src/portable/st/synopsys/dcd_synopsys.c @@ -646,6 +646,7 @@ bool dcd_edpt_xfer (uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t xfer_ctl_t * xfer = XFER_CTL_BASE(epnum, dir); xfer->buffer = buffer; + xfer->ff = NULL; xfer->total_len = total_bytes; // EP0 can only handle one packet @@ -908,7 +909,12 @@ static void handle_rxflvl_ints(uint8_t rhport, USB_OTG_OUTEndpointTypeDef * out_ xfer_ctl_t * xfer = XFER_CTL_BASE(epnum, TUSB_DIR_OUT); // Read packet off RxFIFO - if (xfer->buffer) + if (xfer->ff) + { + // Ring buffer + tu_fifo_write_n(xfer->ff, (const void *) rx_fifo, bcnt); + } + else { // Linear buffer read_fifo_packet(rhport, xfer->buffer, bcnt); @@ -916,11 +922,6 @@ static void handle_rxflvl_ints(uint8_t rhport, USB_OTG_OUTEndpointTypeDef * out_ // Increment pointer to xfer data xfer->buffer += bcnt; } - else - { - // Ring buffer - tu_fifo_write_n(xfer->ff, (const void *) rx_fifo, bcnt); - } // Truncate transfer length in case of short packet if(bcnt < xfer->max_size) { @@ -1028,18 +1029,18 @@ static void handle_epin_ints(uint8_t rhport, USB_OTG_DeviceTypeDef * dev, USB_OT } // Push packet to Tx-FIFO - if (xfer->buffer) + if (xfer->ff) + { + usb_fifo_t tx_fifo = FIFO_BASE(rhport, n); + tu_fifo_read_n(xfer->ff, (void *) tx_fifo, packet_size); + } + else { write_fifo_packet(rhport, n, xfer->buffer, packet_size); // Increment pointer to xfer data xfer->buffer += packet_size; } - else - { - usb_fifo_t tx_fifo = FIFO_BASE(rhport, n); - tu_fifo_read_n(xfer->ff, (void *) tx_fifo, packet_size); - } } // Turn off TXFE if all bytes are written.