summaryrefslogtreecommitdiff
path: root/src/class
diff options
context:
space:
mode:
authorhathach <[email protected]>2019-03-25 11:38:16 +0700
committerhathach <[email protected]>2019-03-25 11:38:16 +0700
commitaaf5714268fd8f6e3e0f0e337634338dd79344ec (patch)
treec84b28137ee2e1e3fb85d42682c445ec237cf110 /src/class
parentfad87202152603d8a6ea8c2ac205483fb908e4f3 (diff)
follow up to pr #46
Diffstat (limited to 'src/class')
-rw-r--r--src/class/cdc/cdc_device.c52
1 files changed, 22 insertions, 30 deletions
diff --git a/src/class/cdc/cdc_device.c b/src/class/cdc/cdc_device.c
index 0f18144ab..9a4deb3cc 100644
--- a/src/class/cdc/cdc_device.c
+++ b/src/class/cdc/cdc_device.c
@@ -75,22 +75,19 @@ typedef struct
//--------------------------------------------------------------------+
CFG_TUSB_MEM_SECTION static cdcd_interface_t _cdcd_itf[CFG_TUD_CDC] = { { 0 } };
-bool pending_read_from_host;
-static void _prep_next_transaction(void) {
- uint8_t const itf = 0;
- cdcd_interface_t* p_cdc = &_cdcd_itf[itf];
+static void _prep_out_transaction (uint8_t itf)
+{
+ cdcd_interface_t* p_cdc = &_cdcd_itf[itf];
- // skip if previous transfer not complete
- if (pending_read_from_host) {
- return;
- }
+ // skip if previous transfer not complete
+ if ( dcd_edpt_busy(TUD_OPT_RHPORT, p_cdc->ep_out) ) 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;
- }
+ // 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);
+ }
}
//--------------------------------------------------------------------+
@@ -129,18 +126,13 @@ uint32_t tud_cdc_n_available(uint8_t itf)
char tud_cdc_n_read_char(uint8_t itf)
{
char ch;
- if (!tu_fifo_read(&_cdcd_itf[itf].rx_ff, &ch)) {
- ch = -1;
- }
-
- _prep_next_transaction();
- return ch;
+ return tud_cdc_n_read(itf, &ch, 1) ? ch : (-1);
}
uint32_t tud_cdc_n_read(uint8_t itf, void* buffer, uint32_t bufsize)
{
uint32_t num_read = tu_fifo_read_n(&_cdcd_itf[itf].rx_ff, buffer, bufsize);
- _prep_next_transaction();
+ _prep_out_transaction(itf);
return num_read;
}
@@ -153,7 +145,7 @@ char tud_cdc_n_peek(uint8_t itf, int pos)
void tud_cdc_n_read_flush (uint8_t itf)
{
tu_fifo_clear(&_cdcd_itf[itf].rx_ff);
- _prep_next_transaction();
+ _prep_out_transaction(itf);
}
//--------------------------------------------------------------------+
@@ -254,11 +246,12 @@ bool cdcd_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t
// Find available interface
cdcd_interface_t * p_cdc = NULL;
- for(uint8_t i=0; i<CFG_TUD_CDC; i++)
+ uint8_t cdc_id;
+ for(cdc_id=0; cdc_id<CFG_TUD_CDC; cdc_id++)
{
- if ( _cdcd_itf[i].ep_in == 0 )
+ if ( _cdcd_itf[cdc_id].ep_in == 0 )
{
- p_cdc = &_cdcd_itf[i];
+ p_cdc = &_cdcd_itf[cdc_id];
break;
}
}
@@ -304,8 +297,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_next_transaction();
+ _prep_out_transaction(cdc_id);
return true;
}
@@ -398,11 +390,11 @@ bool cdcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_
// invoke receive callback (if there is still data)
if (tud_cdc_rx_cb && tu_fifo_count(&p_cdc->rx_ff) ) tud_cdc_rx_cb(itf);
- pending_read_from_host = false;
- _prep_next_transaction();
+ // prepare for OUT transaction
+ _prep_out_transaction(itf);
}
- // nothing to do with in and notif endpoint
+ // nothing to do with in and notif endpoint for now
return true;
}