@@ -452,39 +452,28 @@ void tuh_task_ext(uint32_t timeout_ms, bool in_isr)
452
452
TU_LOG_USBH ("on EP %02X with %u bytes: %s\r\n" , ep_addr , (unsigned int ) event .xfer_complete .len ,
453
453
tu_str_xfer_result [event .xfer_complete .result ]);
454
454
455
- if (event .dev_addr == 0 )
456
- {
455
+ if (event .dev_addr == 0 ) {
457
456
// device 0 only has control endpoint
458
457
TU_ASSERT (epnum == 0 , );
459
458
usbh_control_xfer_cb (event .dev_addr , ep_addr , (xfer_result_t ) event .xfer_complete .result , event .xfer_complete .len );
460
- }
461
- else
462
- {
459
+ } else {
463
460
usbh_device_t * dev = get_device (event .dev_addr );
464
461
TU_VERIFY (dev && dev -> connected , );
465
462
466
463
dev -> ep_status [epnum ][ep_dir ].busy = 0 ;
467
464
dev -> ep_status [epnum ][ep_dir ].claimed = 0 ;
468
465
469
- if ( 0 == epnum )
470
- {
471
- usbh_control_xfer_cb (event .dev_addr , ep_addr , (xfer_result_t ) event .xfer_complete .result , event .xfer_complete .len );
472
- }else
473
- {
474
- uint8_t drv_id = dev -> ep2drv [epnum ][ep_dir ];
475
- if (drv_id < USBH_CLASS_DRIVER_COUNT )
476
- {
477
- TU_LOG_USBH ("%s xfer callback\r\n" , usbh_class_drivers [drv_id ].name );
478
- usbh_class_drivers [drv_id ].xfer_cb (event .dev_addr , ep_addr , (xfer_result_t ) event .xfer_complete .result , event .xfer_complete .len );
479
- }
480
- else
481
- {
482
- #if CFG_TUH_API_EDPT_XFER
483
- tuh_xfer_cb_t complete_cb = dev -> ep_callback [epnum ][ep_dir ].complete_cb ;
484
- if ( complete_cb )
485
- {
486
- tuh_xfer_t xfer =
487
- {
466
+ if ( 0 == epnum ) {
467
+ usbh_control_xfer_cb (event .dev_addr , ep_addr , (xfer_result_t ) event .xfer_complete .result ,
468
+ event .xfer_complete .len );
469
+ }else {
470
+ // Prefer application callback over built-in one if available. This occurs when tuh_edpt_xfer() is used
471
+ // with enabled driver e.g HID endpoint
472
+ #if CFG_TUH_API_EDPT_XFER
473
+ tuh_xfer_cb_t const complete_cb = dev -> ep_callback [epnum ][ep_dir ].complete_cb ;
474
+ if ( complete_cb ) {
475
+ // re-construct xfer info
476
+ tuh_xfer_t xfer = {
488
477
.daddr = event .dev_addr ,
489
478
.ep_addr = ep_addr ,
490
479
.result = event .xfer_complete .result ,
@@ -493,16 +482,21 @@ void tuh_task_ext(uint32_t timeout_ms, bool in_isr)
493
482
.buffer = NULL , // not available
494
483
.complete_cb = complete_cb ,
495
484
.user_data = dev -> ep_callback [epnum ][ep_dir ].user_data
496
- };
485
+ };
497
486
498
- complete_cb (& xfer );
499
- }else
500
- #endif
501
- {
487
+ complete_cb (& xfer );
488
+ }else
489
+ #endif
490
+ {
491
+ uint8_t const drv_id = dev -> ep2drv [epnum ][ep_dir ];
492
+ if ( drv_id < USBH_CLASS_DRIVER_COUNT ) {
493
+ TU_LOG_USBH ("%s xfer callback\r\n" , usbh_class_drivers [drv_id ].name );
494
+ usbh_class_drivers [drv_id ].xfer_cb (event .dev_addr , ep_addr , (xfer_result_t ) event .xfer_complete .result ,
495
+ event .xfer_complete .len );
496
+ } else {
502
497
// no driver/callback responsible for this transfer
503
- TU_ASSERT (false, );
498
+ TU_ASSERT (false,);
504
499
}
505
-
506
500
}
507
501
}
508
502
}
0 commit comments