@@ -224,9 +224,86 @@ bool tu_edpt_stream_init(tu_edpt_stream_t* s, bool is_host, bool is_tx, bool ove
224
224
return true;
225
225
}
226
226
227
- //------------- Stream Write -------------//
227
+ TU_ATTR_ALWAYS_INLINE static inline
228
+ bool stream_claim (tu_edpt_stream_t * s )
229
+ {
230
+ if (s -> is_host )
231
+ {
232
+ #if CFG_TUH_ENABLED
233
+ return usbh_edpt_claim (s -> daddr , s -> ep_addr );
234
+ #endif
235
+ }else
236
+ {
237
+ #if CFG_TUD_ENABLED
238
+ return usbd_edpt_claim (s -> rhport , s -> ep_addr );
239
+ #endif
240
+ }
241
+
242
+ return false;
243
+ }
228
244
229
- //------------- Stream Read -------------//
245
+
246
+ //--------------------------------------------------------------------+
247
+ // Stream Write
248
+ //--------------------------------------------------------------------+
249
+
250
+ bool tu_edpt_stream_write_zlp_if_needed (tu_edpt_stream_t * s , uint32_t last_xferred_bytes )
251
+ {
252
+ // ZLP condition: no pending data, last transferred bytes is multiple of packet size
253
+ TU_VERIFY ( !tu_fifo_count (& s -> ff ) && last_xferred_bytes && (0 == (last_xferred_bytes & (s -> ep_packetsize - 1 ))) );
254
+
255
+ TU_VERIFY ( stream_claim (s ) );
256
+ TU_ASSERT ( usbh_edpt_xfer (s -> daddr , s -> ep_addr , NULL , 0 ) );
257
+
258
+ return true;
259
+ }
260
+
261
+ uint32_t tu_edpt_stream_write_xfer (tu_edpt_stream_t * s )
262
+ {
263
+ // skip if no data
264
+ TU_VERIFY ( tu_fifo_count (& s -> ff ), 0 );
265
+
266
+ // Claim the endpoint
267
+ TU_VERIFY ( stream_claim (s ), 0 );
268
+
269
+ // Pull data from FIFO -> EP buf
270
+ uint16_t const count = tu_fifo_read_n (& s -> ff , s -> ep_buf , s -> ep_bufsize );
271
+
272
+ if ( count )
273
+ {
274
+ //TU_ASSERT( usbd_edpt_xfer(rhport, p_cdc->ep_in, p_cdc->epin_buf, count), 0 );
275
+ TU_ASSERT ( usbh_edpt_xfer (s -> daddr , s -> ep_addr , s -> ep_buf , count ), 0 );
276
+ return count ;
277
+ }else
278
+ {
279
+ // Release endpoint since we don't make any transfer
280
+ // Note: data is dropped if terminal is not connected
281
+ //usbd_edpt_release(rhport, p_cdc->ep_in);
282
+
283
+ usbh_edpt_release (s -> daddr , s -> ep_addr );
284
+ return 0 ;
285
+ }
286
+ }
287
+
288
+ uint32_t tu_edpt_stream_write (tu_edpt_stream_t * s , void const * buffer , uint32_t bufsize )
289
+ {
290
+ TU_VERIFY (bufsize ); // TODO support ZLP
291
+
292
+ uint16_t ret = tu_fifo_write_n (& s -> ff , buffer , (uint16_t ) bufsize );
293
+
294
+ // flush if fifo has more than packet size or
295
+ // in rare case: fifo depth is configured too small (which never reach packet size)
296
+ if ( (tu_fifo_count (& s -> ff ) >= s -> ep_packetsize ) || (tu_fifo_depth (& s -> ff ) < s -> ep_packetsize ) )
297
+ {
298
+ tu_edpt_stream_write_xfer (s );
299
+ }
300
+
301
+ return ret ;
302
+ }
303
+
304
+ //--------------------------------------------------------------------+
305
+ // Stream Read
306
+ //--------------------------------------------------------------------+
230
307
231
308
uint32_t tu_edpt_stream_read_xfer (tu_edpt_stream_t * s )
232
309
{
@@ -239,25 +316,15 @@ uint32_t tu_edpt_stream_read_xfer(tu_edpt_stream_t* s)
239
316
TU_VERIFY (available >= s -> ep_packetsize );
240
317
241
318
// claim endpoint
242
- if (s -> is_host )
243
- {
244
- #if CFG_TUH_ENABLED
245
- TU_VERIFY (usbh_edpt_claim (s -> daddr , s -> ep_addr ), 0 );
246
- #endif
247
- }else
248
- {
249
- #if CFG_TUD_ENABLED
250
- TU_VERIFY (usbd_edpt_claim (s -> rhport , s -> ep_addr ), 0 );
251
- #endif
252
- }
319
+ TU_VERIFY (stream_claim (s ), 0 );
253
320
254
321
// get available again since fifo can be changed before endpoint is claimed
255
322
available = tu_fifo_remaining (& s -> ff );
256
323
257
324
if ( available >= s -> ep_packetsize )
258
325
{
259
326
// multiple of packet size limit by ep bufsize
260
- uint16_t count = (uint16_t ) (available & (s -> ep_packetsize - 1 ));
327
+ uint16_t count = (uint16_t ) (available & ~ (s -> ep_packetsize - 1 ));
261
328
count = tu_min16 (count , s -> ep_bufsize );
262
329
263
330
if (s -> is_host )
@@ -301,6 +368,7 @@ uint32_t tu_edpt_stream_read(tu_edpt_stream_t* s, void* buffer, uint32_t bufsize
301
368
//--------------------------------------------------------------------+
302
369
// Debug
303
370
//--------------------------------------------------------------------+
371
+
304
372
#if CFG_TUSB_DEBUG
305
373
#include <ctype.h>
306
374
0 commit comments