@@ -76,31 +76,46 @@ bool tu_edpt_stream_clear(tu_edpt_stream_t* s)
76
76
return tu_fifo_clear (& s -> ff );
77
77
}
78
78
79
- uint32_t tud_edpt_stream_write_xfer (uint8_t dev_addr , tu_edpt_stream_t * s )
79
+ bool tu_edpt_stream_write_zlp_if_needed (uint8_t daddr , tu_edpt_stream_t * s , uint32_t last_xferred_bytes )
80
80
{
81
- // No data to send
82
- if ( !tu_fifo_count (& s -> ff ) ) return 0 ;
81
+ uint16_t const bulk_packet_size = (tuh_speed_get (daddr ) == TUSB_SPEED_HIGH ) ? TUSB_EPSIZE_BULK_HS : TUSB_EPSIZE_BULK_FS ;
82
+
83
+ // ZLP condition: no pending data, last transferred bytes is multiple of packet size
84
+ TU_VERIFY ( !tu_fifo_count (& s -> ff ) && last_xferred_bytes && (0 == (last_xferred_bytes & (bulk_packet_size - 1 ))) );
85
+
86
+ if ( usbh_edpt_claim (daddr , s -> ep_addr ) )
87
+ {
88
+ TU_ASSERT ( usbh_edpt_xfer (daddr , s -> ep_addr , NULL , 0 ) );
89
+ }
90
+
91
+ return true;
92
+ }
93
+
94
+ uint32_t tu_edpt_stream_write_xfer (uint8_t daddr , tu_edpt_stream_t * s )
95
+ {
96
+ // skip if no data
97
+ TU_VERIFY ( tu_fifo_count (& s -> ff ), 0 );
83
98
84
99
// Claim the endpoint
85
100
// uint8_t const rhport = 0;
86
101
// TU_VERIFY( usbd_edpt_claim(rhport, p_cdc->ep_in), 0 );
87
- TU_VERIFY ( usbh_edpt_claim (dev_addr , s -> ep_addr ) );
102
+ TU_VERIFY ( usbh_edpt_claim (daddr , s -> ep_addr ) );
88
103
89
104
// Pull data from FIFO -> EP buf
90
105
uint16_t const count = tu_fifo_read_n (& s -> ff , s -> ep_buf , s -> ep_bufsize );
91
106
92
107
if ( count )
93
108
{
94
109
//TU_ASSERT( usbd_edpt_xfer(rhport, p_cdc->ep_in, p_cdc->epin_buf, count), 0 );
95
- TU_ASSERT ( usbh_edpt_xfer (dev_addr , s -> ep_addr , s -> ep_buf , count ), 0 );
110
+ TU_ASSERT ( usbh_edpt_xfer (daddr , s -> ep_addr , s -> ep_buf , count ), 0 );
96
111
return count ;
97
112
}else
98
113
{
99
114
// Release endpoint since we don't make any transfer
100
115
// Note: data is dropped if terminal is not connected
101
116
//usbd_edpt_release(rhport, p_cdc->ep_in);
102
117
103
- usbh_edpt_release (dev_addr , s -> ep_addr );
118
+ usbh_edpt_release (daddr , s -> ep_addr );
104
119
return 0 ;
105
120
}
106
121
}
@@ -114,7 +129,7 @@ uint32_t tu_edpt_stream_write(uint8_t daddr, tu_edpt_stream_t* s, void const *bu
114
129
if ( (tu_fifo_count (& s -> ff ) >= bulk_packet_size )
115
130
/* || ((CFG_TUD_CDC_TX_BUFSIZE < BULK_PACKET_SIZE) && tu_fifo_full(&p_cdc->tx_ff)) */ )
116
131
{
117
- tud_edpt_stream_write_xfer (daddr , s );
132
+ tu_edpt_stream_write_xfer (daddr , s );
118
133
}
119
134
120
135
return ret ;
@@ -302,7 +317,7 @@ uint32_t tuh_cdc_write_flush(uint8_t idx)
302
317
cdch_interface_t * p_cdc = get_itf (idx );
303
318
TU_VERIFY (p_cdc );
304
319
305
- return tud_edpt_stream_write_xfer (p_cdc -> daddr , & p_cdc -> stream .tx );
320
+ return tu_edpt_stream_write_xfer (p_cdc -> daddr , & p_cdc -> stream .tx );
306
321
}
307
322
308
323
uint32_t tuh_cdc_read (uint8_t idx , void * buffer , uint32_t bufsize )
@@ -435,18 +450,11 @@ bool cdch_xfer_cb(uint8_t daddr, uint8_t ep_addr, xfer_result_t event, uint32_t
435
450
436
451
if ( ep_addr == p_cdc -> stream .tx .ep_addr )
437
452
{
438
- if ( 0 == tud_edpt_stream_write_xfer (daddr , & p_cdc -> stream .tx ) )
453
+ if ( 0 == tu_edpt_stream_write_xfer (daddr , & p_cdc -> stream .tx ) )
439
454
{
440
- // If there is no data left, a ZLP should be sent if
455
+ // If there is no data left, a ZLP should be sent if needed
441
456
// xferred_bytes is multiple of EP Packet size and not zero
442
- uint16_t const bulk_packet_size = (tuh_speed_get (daddr ) == TUSB_SPEED_HIGH ) ? TUSB_EPSIZE_BULK_HS : TUSB_EPSIZE_BULK_FS ;
443
- if ( !tu_fifo_count (& p_cdc -> stream .tx .ff ) && xferred_bytes && (0 == (xferred_bytes & (bulk_packet_size - 1 ))) )
444
- {
445
- if ( usbh_edpt_claim (daddr , p_cdc -> stream .tx .ep_addr ) )
446
- {
447
- usbh_edpt_xfer (daddr , p_cdc -> stream .tx .ep_addr , NULL , 0 );
448
- }
449
- }
457
+ tu_edpt_stream_write_zlp_if_needed (daddr , & p_cdc -> stream .tx , xferred_bytes );
450
458
}
451
459
}
452
460
else if ( ep_addr == p_cdc -> stream .rx .ep_addr )
0 commit comments