|
|
@@ -75,14 +75,27 @@ CFG_TUSB_MEM_SECTION static cdcd_interface_t _cdcd_itf[CFG_TUD_CDC];
|
|
|
|
|
|
static void _prep_out_transaction (cdcd_interface_t* p_cdc)
|
|
|
{
|
|
|
+ uint8_t const rhport = TUD_OPT_RHPORT;
|
|
|
+ uint16_t available = tu_fifo_remaining(&p_cdc->rx_ff);
|
|
|
+
|
|
|
// Prepare for incoming data but only allow what we can store in the ring buffer.
|
|
|
- uint16_t const available = tu_fifo_remaining(&p_cdc->rx_ff);
|
|
|
- TU_VERIFY( available >= sizeof(p_cdc->epout_buf), );
|
|
|
+ // TODO Actually we can still carry out the transfer, keeping count of received bytes
|
|
|
+ // and slowly move it to the FIFO when read().
|
|
|
+ // This pre-check reduces endpoint claiming
|
|
|
+ TU_VERIFY(available >= sizeof(p_cdc->epout_buf), );
|
|
|
+
|
|
|
+ // claim endpoint
|
|
|
+ TU_VERIFY(usbd_edpt_claim(rhport, p_cdc->ep_out), );
|
|
|
|
|
|
- // claim endpoint and submit transfer
|
|
|
- if ( usbd_edpt_claim(TUD_OPT_RHPORT, p_cdc->ep_out) )
|
|
|
+ // fifo can be changed before endpoint is claimed
|
|
|
+ available = tu_fifo_remaining(&p_cdc->rx_ff);
|
|
|
+
|
|
|
+ if ( available >= sizeof(p_cdc->epout_buf) ) {
|
|
|
+ usbd_edpt_xfer(rhport, p_cdc->ep_out, p_cdc->epout_buf, sizeof(p_cdc->epout_buf));
|
|
|
+ }else
|
|
|
{
|
|
|
- usbd_edpt_xfer(TUD_OPT_RHPORT, p_cdc->ep_out, p_cdc->epout_buf, sizeof(p_cdc->epout_buf));
|
|
|
+ // Release endpoint since we don't make any transfer
|
|
|
+ usbd_edpt_release(rhport, p_cdc->ep_out);
|
|
|
}
|
|
|
}
|
|
|
|