2121// FIFO buffer for loopback data
2222tu_fifo_t loopback_fifo ;
2323uint8_t loopback_buffer [512 ];
24+ bool delay_loopback_reset = false;
2425
2526// RX buffer for loopback
2627uint8_t loopback_rx_buffer [64 ];
@@ -62,7 +63,11 @@ int main(void) {
6263
6364// reset device in predictable state
6465void reset_buffers (void ) {
65- tu_fifo_clear (& loopback_fifo );
66+ if (cust_vendor_is_transmitting (EP_LOOPBACK_TX )) {
67+ delay_loopback_reset = true;
68+ } else {
69+ tu_fifo_clear (& loopback_fifo );
70+ }
6671}
6772
6873// --- Loopback
@@ -74,6 +79,11 @@ void loopback_init(void) {
7479// Check if the next transmission should be started
7580void loopback_check_tx (void ) {
7681
82+ if (delay_loopback_reset ) {
83+ tu_fifo_clear (& loopback_fifo );
84+ delay_loopback_reset = false;
85+ }
86+
7787 tu_fifo_buffer_info_t info ;
7888 tu_fifo_get_read_info (& loopback_fifo , & info );
7989
@@ -123,19 +133,15 @@ void cust_vendor_rx_cb(uint8_t ep_addr, uint32_t recv_bytes) {
123133
124134// Invoked when last tx transfer finished
125135void cust_vendor_tx_cb (uint8_t ep_addr , uint32_t sent_bytes ) {
126- // If buffer has been reset in the mean time,
127- // we might not be able to advance it fully or at all.
128- int max_advance = tu_fifo_count (& loopback_fifo );
129- if (sent_bytes > max_advance )
130- sent_bytes = max_advance ;
131136 if (sent_bytes > 0 )
132137 tu_fifo_advance_read_pointer (& loopback_fifo , sent_bytes );
133138
134139 loopback_check_tx ();
135140 loopback_check_rx ();
136141
137142 // check ZLP
138- if ((sent_bytes & (BULK_MAX_PACKET_SIZE - 1 )) == 0
143+ if (sent_bytes > 0
144+ && (sent_bytes & (BULK_MAX_PACKET_SIZE - 1 )) == 0
139145 && !cust_vendor_is_transmitting (ep_addr ))
140146 cust_vendor_start_transmit (EP_LOOPBACK_TX , NULL , 0 );
141147
0 commit comments