@@ -86,15 +86,20 @@ static void _prep_out_transaction (vendord_interface_t* p_itf)
86
86
{
87
87
uint8_t const rhport = 0 ;
88
88
89
- // skip if previous transfer not complete
90
- if ( usbd_edpt_busy (rhport , p_itf -> ep_out ) ) return ;
89
+ // claim endpoint
90
+ TU_VERIFY ( usbd_edpt_claim (rhport , p_itf -> ep_out ), ) ;
91
91
92
92
// Prepare for incoming data but only allow what we can store in the ring buffer.
93
93
uint16_t max_read = tu_fifo_remaining (& p_itf -> rx_ff );
94
94
if ( max_read >= CFG_TUD_VENDOR_EPSIZE )
95
95
{
96
96
usbd_edpt_xfer (rhport , p_itf -> ep_out , p_itf -> epout_buf , CFG_TUD_VENDOR_EPSIZE );
97
97
}
98
+ else
99
+ {
100
+ // Release endpoint since we don't make any transfer
101
+ usbd_edpt_release (rhport , p_itf -> ep_out );
102
+ }
98
103
}
99
104
100
105
uint32_t tud_vendor_n_read (uint8_t itf , void * buffer , uint32_t bufsize )
@@ -115,37 +120,47 @@ void tud_vendor_n_read_flush (uint8_t itf)
115
120
//--------------------------------------------------------------------+
116
121
// Write API
117
122
//--------------------------------------------------------------------+
118
- static uint16_t maybe_transmit (vendord_interface_t * p_itf )
119
- {
120
- uint8_t const rhport = 0 ;
121
-
122
- // skip if previous transfer not complete
123
- TU_VERIFY ( !usbd_edpt_busy (rhport , p_itf -> ep_in ) );
124
-
125
- uint16_t count = tu_fifo_read_n (& p_itf -> tx_ff , p_itf -> epin_buf , CFG_TUD_VENDOR_EPSIZE );
126
- if (count > 0 )
127
- {
128
- TU_ASSERT ( usbd_edpt_xfer (rhport , p_itf -> ep_in , p_itf -> epin_buf , count ) );
129
- }
130
- return count ;
131
- }
132
-
133
123
uint32_t tud_vendor_n_write (uint8_t itf , void const * buffer , uint32_t bufsize )
134
124
{
135
125
vendord_interface_t * p_itf = & _vendord_itf [itf ];
136
126
uint16_t ret = tu_fifo_write_n (& p_itf -> tx_ff , buffer , (uint16_t ) bufsize );
127
+
128
+ // flush if queue more than packet size
137
129
if (tu_fifo_count (& p_itf -> tx_ff ) >= CFG_TUD_VENDOR_EPSIZE ) {
138
- maybe_transmit ( p_itf );
130
+ tud_vendor_n_write_flush ( itf );
139
131
}
140
132
return ret ;
141
133
}
142
134
143
- uint32_t tud_vendor_n_flush (uint8_t itf )
135
+ uint32_t tud_vendor_n_write_flush (uint8_t itf )
144
136
{
145
137
vendord_interface_t * p_itf = & _vendord_itf [itf ];
146
- uint32_t ret = maybe_transmit (p_itf );
147
138
148
- return ret ;
139
+ // Skip if usb is not ready yet
140
+ TU_VERIFY ( tud_ready (), 0 );
141
+
142
+ // No data to send
143
+ if ( !tu_fifo_count (& p_itf -> tx_ff ) ) return 0 ;
144
+
145
+ uint8_t const rhport = 0 ;
146
+
147
+ // Claim the endpoint
148
+ TU_VERIFY ( usbd_edpt_claim (rhport , p_itf -> ep_in ), 0 );
149
+
150
+ // Pull data from FIFO
151
+ uint16_t const count = tu_fifo_read_n (& p_itf -> tx_ff , p_itf -> epin_buf , sizeof (p_itf -> epin_buf ));
152
+
153
+ if ( count )
154
+ {
155
+ TU_ASSERT ( usbd_edpt_xfer (rhport , p_itf -> ep_in , p_itf -> epin_buf , count ), 0 );
156
+ return count ;
157
+ }else
158
+ {
159
+ // Release endpoint since we don't make any transfer
160
+ // Note: data is dropped if terminal is not connected
161
+ usbd_edpt_release (rhport , p_itf -> ep_in );
162
+ return 0 ;
163
+ }
149
164
}
150
165
151
166
uint32_t tud_vendor_n_write_available (uint8_t itf )
@@ -225,10 +240,10 @@ uint16_t vendord_open(uint8_t rhport, tusb_desc_interface_t const * desc_itf, ui
225
240
// Prepare for incoming data
226
241
if ( p_vendor -> ep_out )
227
242
{
228
- TU_ASSERT ( usbd_edpt_xfer ( rhport , p_vendor -> ep_out , p_vendor -> epout_buf , sizeof ( p_vendor -> epout_buf )), 0 );
243
+ _prep_out_transaction ( p_vendor );
229
244
}
230
245
231
- if ( p_vendor -> ep_in ) maybe_transmit ( p_vendor );
246
+ if ( p_vendor -> ep_in ) tud_vendor_n_write_flush (( uint8_t )( p_vendor - _vendord_itf ) );
232
247
}
233
248
234
249
return (uint16_t ) ((uintptr_t ) p_desc - (uintptr_t ) desc_itf );
@@ -263,7 +278,7 @@ bool vendord_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint
263
278
{
264
279
if (tud_vendor_tx_cb ) tud_vendor_tx_cb (itf , (uint16_t ) xferred_bytes );
265
280
// Send complete, try to send more if possible
266
- maybe_transmit ( p_itf );
281
+ tud_vendor_n_write_flush ( itf );
267
282
}
268
283
269
284
return true;
0 commit comments