summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGavin Li <[email protected]>2020-08-20 02:20:01 -0700
committerGavin Li <[email protected]>2020-08-20 02:20:01 -0700
commit15b063beb287785b2bf84d00361000036afaba2c (patch)
tree32955fb4259c32f01b01e1767367476b6010a6f5 /src
parent7ae47a93979071ec3c7724c35f1ef55572ad1a1f (diff)
Smarter CDC TX refill logic
Diffstat (limited to 'src')
-rw-r--r--src/class/cdc/cdc_device.c10
-rw-r--r--src/class/cdc/cdc_device.h2
2 files changed, 7 insertions, 5 deletions
diff --git a/src/class/cdc/cdc_device.c b/src/class/cdc/cdc_device.c
index d8be48688..da9e94133 100644
--- a/src/class/cdc/cdc_device.c
+++ b/src/class/cdc/cdc_device.c
@@ -416,7 +416,12 @@ bool cdcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_
// Though maybe the baudrate is not really important !!!
if ( ep_addr == p_cdc->ep_in )
{
- if ( 0 == tud_cdc_n_write_flush(itf) )
+ uint32_t flushed = tud_cdc_n_write_flush(itf);
+
+ // invoke transmit callback to possibly refill tx fifo
+ if ( tud_cdc_tx_complete_cb ) tud_cdc_tx_complete_cb(itf);
+
+ if ( 0 == flushed && tu_fifo_empty(&p_cdc->tx_ff) )
{
// There is no data left, a ZLP should be sent if
// xferred_bytes is multiple of EP size and not zero
@@ -425,9 +430,6 @@ bool cdcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_
usbd_edpt_xfer(TUD_OPT_RHPORT, p_cdc->ep_in, NULL, 0);
}
}
-
- // invoke transmit callback to possibly refill tx fifo
- if ( tud_cdc_tx_cb && !tu_fifo_full(&p_cdc->tx_ff) ) tud_cdc_tx_cb(itf);
}
// nothing to do with notif endpoint for now
diff --git a/src/class/cdc/cdc_device.h b/src/class/cdc/cdc_device.h
index 13b59416b..7e9e8ca21 100644
--- a/src/class/cdc/cdc_device.h
+++ b/src/class/cdc/cdc_device.h
@@ -129,7 +129,7 @@ TU_ATTR_WEAK void tud_cdc_rx_cb(uint8_t itf);
TU_ATTR_WEAK void tud_cdc_rx_wanted_cb(uint8_t itf, char wanted_char);
// Invoked when space becomes available in TX buffer
-TU_ATTR_WEAK void tud_cdc_tx_cb(uint8_t itf);
+TU_ATTR_WEAK void tud_cdc_tx_complete_cb(uint8_t itf);
// Invoked when line state DTR & RTS are changed via SET_CONTROL_LINE_STATE
TU_ATTR_WEAK void tud_cdc_line_state_cb(uint8_t itf, bool dtr, bool rts);