Skip to content

Commit 16ad918

Browse files
committed
prefer application callback over built-in driver
1 parent 77495cf commit 16ad918

File tree

1 file changed

+25
-31
lines changed

1 file changed

+25
-31
lines changed

src/host/usbh.c

Lines changed: 25 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -452,39 +452,28 @@ void tuh_task_ext(uint32_t timeout_ms, bool in_isr)
452452
TU_LOG_USBH("on EP %02X with %u bytes: %s\r\n", ep_addr, (unsigned int) event.xfer_complete.len,
453453
tu_str_xfer_result[event.xfer_complete.result]);
454454

455-
if (event.dev_addr == 0)
456-
{
455+
if (event.dev_addr == 0) {
457456
// device 0 only has control endpoint
458457
TU_ASSERT(epnum == 0, );
459458
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 {
463460
usbh_device_t* dev = get_device(event.dev_addr);
464461
TU_VERIFY(dev && dev->connected, );
465462

466463
dev->ep_status[epnum][ep_dir].busy = 0;
467464
dev->ep_status[epnum][ep_dir].claimed = 0;
468465

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 = {
488477
.daddr = event.dev_addr,
489478
.ep_addr = ep_addr,
490479
.result = event.xfer_complete.result,
@@ -493,16 +482,21 @@ void tuh_task_ext(uint32_t timeout_ms, bool in_isr)
493482
.buffer = NULL, // not available
494483
.complete_cb = complete_cb,
495484
.user_data = dev->ep_callback[epnum][ep_dir].user_data
496-
};
485+
};
497486

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 {
502497
// no driver/callback responsible for this transfer
503-
TU_ASSERT(false, );
498+
TU_ASSERT(false,);
504499
}
505-
506500
}
507501
}
508502
}

0 commit comments

Comments
 (0)