prefer application callback over built-in driver

This commit is contained in:
hathach 2023-07-20 17:37:06 +07:00
parent 77495cf119
commit 16ad918d96
No known key found for this signature in database
GPG Key ID: F5D50C6D51D17CBA
1 changed files with 25 additions and 31 deletions

View File

@ -452,39 +452,28 @@ void tuh_task_ext(uint32_t timeout_ms, bool in_isr)
TU_LOG_USBH("on EP %02X with %u bytes: %s\r\n", ep_addr, (unsigned int) event.xfer_complete.len, TU_LOG_USBH("on EP %02X with %u bytes: %s\r\n", ep_addr, (unsigned int) event.xfer_complete.len,
tu_str_xfer_result[event.xfer_complete.result]); tu_str_xfer_result[event.xfer_complete.result]);
if (event.dev_addr == 0) if (event.dev_addr == 0) {
{
// device 0 only has control endpoint // device 0 only has control endpoint
TU_ASSERT(epnum == 0, ); TU_ASSERT(epnum == 0, );
usbh_control_xfer_cb(event.dev_addr, ep_addr, (xfer_result_t) event.xfer_complete.result, event.xfer_complete.len); usbh_control_xfer_cb(event.dev_addr, ep_addr, (xfer_result_t) event.xfer_complete.result, event.xfer_complete.len);
} } else {
else
{
usbh_device_t* dev = get_device(event.dev_addr); usbh_device_t* dev = get_device(event.dev_addr);
TU_VERIFY(dev && dev->connected, ); TU_VERIFY(dev && dev->connected, );
dev->ep_status[epnum][ep_dir].busy = 0; dev->ep_status[epnum][ep_dir].busy = 0;
dev->ep_status[epnum][ep_dir].claimed = 0; dev->ep_status[epnum][ep_dir].claimed = 0;
if ( 0 == epnum ) if ( 0 == epnum ) {
{ usbh_control_xfer_cb(event.dev_addr, ep_addr, (xfer_result_t) event.xfer_complete.result,
usbh_control_xfer_cb(event.dev_addr, ep_addr, (xfer_result_t) event.xfer_complete.result, event.xfer_complete.len); event.xfer_complete.len);
}else }else {
{ // Prefer application callback over built-in one if available. This occurs when tuh_edpt_xfer() is used
uint8_t drv_id = dev->ep2drv[epnum][ep_dir]; // with enabled driver e.g HID endpoint
if(drv_id < USBH_CLASS_DRIVER_COUNT)
{
TU_LOG_USBH("%s xfer callback\r\n", usbh_class_drivers[drv_id].name);
usbh_class_drivers[drv_id].xfer_cb(event.dev_addr, ep_addr, (xfer_result_t) event.xfer_complete.result, event.xfer_complete.len);
}
else
{
#if CFG_TUH_API_EDPT_XFER #if CFG_TUH_API_EDPT_XFER
tuh_xfer_cb_t complete_cb = dev->ep_callback[epnum][ep_dir].complete_cb; tuh_xfer_cb_t const complete_cb = dev->ep_callback[epnum][ep_dir].complete_cb;
if ( complete_cb ) if ( complete_cb ) {
{ // re-construct xfer info
tuh_xfer_t xfer = tuh_xfer_t xfer = {
{
.daddr = event.dev_addr, .daddr = event.dev_addr,
.ep_addr = ep_addr, .ep_addr = ep_addr,
.result = event.xfer_complete.result, .result = event.xfer_complete.result,
@ -499,10 +488,15 @@ void tuh_task_ext(uint32_t timeout_ms, bool in_isr)
}else }else
#endif #endif
{ {
uint8_t const drv_id = dev->ep2drv[epnum][ep_dir];
if ( drv_id < USBH_CLASS_DRIVER_COUNT ) {
TU_LOG_USBH("%s xfer callback\r\n", usbh_class_drivers[drv_id].name);
usbh_class_drivers[drv_id].xfer_cb(event.dev_addr, ep_addr, (xfer_result_t) event.xfer_complete.result,
event.xfer_complete.len);
} else {
// no driver/callback responsible for this transfer // no driver/callback responsible for this transfer
TU_ASSERT(false,); TU_ASSERT(false,);
} }
} }
} }
} }