summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhathach <[email protected]>2019-03-27 00:39:14 +0700
committerhathach <[email protected]>2019-03-27 00:39:14 +0700
commit89b9ee2f52a970ffa162ccd1d9244fe5ead90ed8 (patch)
treea9c3a751ca49e77cb429cdc29f6b96365553c2f1 /src
parentaaf5714268fd8f6e3e0f0e337634338dd79344ec (diff)
revert to use pending_read_from_host (temp) since
Diffstat (limited to 'src')
-rw-r--r--src/class/cdc/cdc_device.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/class/cdc/cdc_device.c b/src/class/cdc/cdc_device.c
index 9a4deb3cc..48e94a6e1 100644
--- a/src/class/cdc/cdc_device.c
+++ b/src/class/cdc/cdc_device.c
@@ -75,18 +75,23 @@ typedef struct
//--------------------------------------------------------------------+
CFG_TUSB_MEM_SECTION static cdcd_interface_t _cdcd_itf[CFG_TUD_CDC] = { { 0 } };
+// TODO will be replaced by dcd_edpt_busy()
+bool pending_read_from_host;
static void _prep_out_transaction (uint8_t itf)
{
cdcd_interface_t* p_cdc = &_cdcd_itf[itf];
// skip if previous transfer not complete
- if ( dcd_edpt_busy(TUD_OPT_RHPORT, p_cdc->ep_out) ) return;
+ // dcd_edpt_busy() doesn't work, probably transfer is complete but not properly handled by the stack
+// if ( dcd_edpt_busy(TUD_OPT_RHPORT, p_cdc->ep_out) ) return;
+ if (pending_read_from_host) return;
// Prepare for incoming data but only allow what we can store in the ring buffer.
uint16_t max_read = tu_fifo_remaining(&p_cdc->rx_ff);
if ( max_read >= CFG_TUD_CDC_EPSIZE )
{
dcd_edpt_xfer(TUD_OPT_RHPORT, p_cdc->ep_out, p_cdc->epout_buf, CFG_TUD_CDC_EPSIZE);
+ pending_read_from_host = true;
}
}
@@ -297,6 +302,7 @@ bool cdcd_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t
}
// Prepare for incoming data
+ pending_read_from_host = false;
_prep_out_transaction(cdc_id);
return true;
@@ -367,6 +373,7 @@ bool cdcd_control_request(uint8_t rhport, tusb_control_request_t const * request
bool cdcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes)
{
+ (void) rhport;
(void) result;
// TODO Support multiple interfaces
@@ -391,6 +398,7 @@ bool cdcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_
if (tud_cdc_rx_cb && tu_fifo_count(&p_cdc->rx_ff) ) tud_cdc_rx_cb(itf);
// prepare for OUT transaction
+ pending_read_from_host = false;
_prep_out_transaction(itf);
}