summaryrefslogtreecommitdiff
path: root/src/class/cdc
diff options
context:
space:
mode:
authorJan Dümpelmann <[email protected]>2020-11-18 09:42:50 +0100
committerJan Dümpelmann <[email protected]>2020-11-18 09:42:50 +0100
commit54e29e9ff451d5e30eb59d0411adbe5d4993c59b (patch)
treec02d2127a93a4f9ea67f1155ee83cd87976534ac /src/class/cdc
parentaf9f0f1cd64283116716d6bcadc9f33214e88c57 (diff)
Implementation of the discussed changes
- remove usbd_edpt_xfer_abort - rename tu_fifo_change_mode to tu_fifo_set_mode - remove CFG_TUD_CDC_CLEAR_AT_CONNECTION definition - remove auto fifo clear at connection event - add tud_cdc_n_write_clear function
Diffstat (limited to 'src/class/cdc')
-rw-r--r--src/class/cdc/cdc_device.c21
-rw-r--r--src/class/cdc/cdc_device.h13
2 files changed, 20 insertions, 14 deletions
diff --git a/src/class/cdc/cdc_device.c b/src/class/cdc/cdc_device.c
index 7eace24ff..2d0aed238 100644
--- a/src/class/cdc/cdc_device.c
+++ b/src/class/cdc/cdc_device.c
@@ -207,6 +207,10 @@ uint32_t tud_cdc_n_write_available (uint8_t itf)
return tu_fifo_remaining(&_cdcd_itf[itf].tx_ff);
}
+bool tud_cdc_n_write_clear (uint8_t itf)
+{
+ return tu_fifo_clear(&_cdcd_itf[itf].tx_ff);
+}
//--------------------------------------------------------------------+
// USBD Driver API
@@ -229,6 +233,9 @@ void cdcd_init(void)
// config fifo
tu_fifo_config(&p_cdc->rx_ff, p_cdc->rx_ff_buf, TU_ARRAY_SIZE(p_cdc->rx_ff_buf), 1, false);
+ // tx fifo is set to overwritable at initialization and will be changed to not overwritable
+ // if terminal supports DTR bit. Without DTR we do not know if data is actually polled by terminal.
+ // In this way, the most current data is prioritized.
tu_fifo_config(&p_cdc->tx_ff, p_cdc->tx_ff_buf, TU_ARRAY_SIZE(p_cdc->tx_ff_buf), 1, true);
#if CFG_FIFO_MUTEX
@@ -384,20 +391,14 @@ bool cdcd_control_request(uint8_t rhport, tusb_control_request_t const * request
bool const dtr = tu_bit_test(request->wValue, 0);
bool const rts = tu_bit_test(request->wValue, 1);
-#if CFG_TUD_CDC_CLEAR_AT_CONNECTION
- // DTE connected event (if DTE supports DTR bit)
- if ( dtr && !tu_bit_test(p_cdc->line_state, 0) )
- {
- // Clear not transmitted data
- usbd_edpt_xfer_abort(rhport, p_cdc->ep_in);
- tu_fifo_clear(&p_cdc->tx_ff);
- }
-#endif
+ // TODO if terminal supports DTR we can check for an connection event here and
+ // clear the fifo as well as ongoing transfers with new usbd_edpt_xfer_abort api.
+ // Until then user can self clear the buffer with tud_cdc_n_write_clear in tud_cdc_line_state_cb
p_cdc->line_state = (uint8_t) request->wValue;
// Disable fifo overwriting if DTR bit is set
- tu_fifo_change_mode(&p_cdc->tx_ff, (dtr?false:true));
+ tu_fifo_set_mode(&p_cdc->tx_ff, !dtr);
TU_LOG2(" Set Control Line State: DTR = %d, RTS = %d\r\n", dtr, rts);
diff --git a/src/class/cdc/cdc_device.h b/src/class/cdc/cdc_device.h
index 3bd2741bc..342025961 100644
--- a/src/class/cdc/cdc_device.h
+++ b/src/class/cdc/cdc_device.h
@@ -43,10 +43,6 @@
#define CFG_TUD_CDC_EP_BUFSIZE (TUD_OPT_HIGH_SPEED ? 512 : 64)
#endif
-#ifndef CFG_TUD_CDC_CLEAR_AT_CONNECTION
- #define CFG_TUD_CDC_CLEAR_AT_CONNECTION 0
-#endif
-
#ifdef __cplusplus
extern "C" {
#endif
@@ -106,6 +102,9 @@ uint32_t tud_cdc_n_write_flush (uint8_t itf);
// Return the number of bytes (characters) available for writing to TX FIFO buffer in a single n_write operation.
uint32_t tud_cdc_n_write_available (uint8_t itf);
+// Clear the transmit FIFO
+bool tud_cdc_n_write_clear (uint8_t itf);
+
//--------------------------------------------------------------------+
// Application API (Single Port)
//--------------------------------------------------------------------+
@@ -125,6 +124,7 @@ static inline uint32_t tud_cdc_write (void const* buffer, uint32_t buf
static inline uint32_t tud_cdc_write_str (char const* str);
static inline uint32_t tud_cdc_write_flush (void);
static inline uint32_t tud_cdc_write_available (void);
+static inline bool tud_cdc_write_clear (void);
//--------------------------------------------------------------------+
// Application Callback API (weak is optional)
@@ -234,6 +234,11 @@ static inline uint32_t tud_cdc_write_available(void)
return tud_cdc_n_write_available(0);
}
+static inline bool tud_cdc_write_clear(void)
+{
+ return tud_cdc_n_write_clear(0);
+}
+
/** @} */
/** @} */