From aaf5714268fd8f6e3e0f0e337634338dd79344ec Mon Sep 17 00:00:00 2001 From: hathach Date: Mon, 25 Mar 2019 11:38:16 +0700 Subject: [PATCH 1/2] follow up to pr #46 --- src/class/cdc/cdc_device.c | 52 ++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 30 deletions(-) diff --git a/src/class/cdc/cdc_device.c b/src/class/cdc/cdc_device.c index 0f18144a..9a4deb3c 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; irx_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; } From 89b9ee2f52a970ffa162ccd1d9244fe5ead90ed8 Mon Sep 17 00:00:00 2001 From: hathach Date: Wed, 27 Mar 2019 00:39:14 +0700 Subject: [PATCH 2/2] revert to use pending_read_from_host (temp) since --- src/class/cdc/cdc_device.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/class/cdc/cdc_device.c b/src/class/cdc/cdc_device.c index 9a4deb3c..48e94a6e 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); }