Explorar el Código

Smarter CDC TX refill logic

Gavin Li hace 5 años
padre
commit
15b063beb2
Se han modificado 2 ficheros con 7 adiciones y 5 borrados
  1. 6 4
      src/class/cdc/cdc_device.c
  2. 1 1
      src/class/cdc/cdc_device.h

+ 6 - 4
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

+ 1 - 1
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);