summaryrefslogtreecommitdiff
path: root/src/device
diff options
context:
space:
mode:
authorhathach <[email protected]>2018-07-13 18:01:16 +0700
committerhathach <[email protected]>2018-07-13 18:01:16 +0700
commit7a1f40593f984d37d602cdf6457d0f8c6f7c01d7 (patch)
tree4ed7d9c4f0cc2775985794ccab0f2543f9288468 /src/device
parent1efb552bfd097a23651bbb5ad29b6d8eb3bc9ccd (diff)
only call class xfer callback associated with endpoint address
Diffstat (limited to 'src/device')
-rw-r--r--src/device/usbd.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/src/device/usbd.c b/src/device/usbd.c
index d795e4f9a..e2ef5e7bb 100644
--- a/src/device/usbd.c
+++ b/src/device/usbd.c
@@ -269,14 +269,13 @@ static tusb_error_t usbd_main_st(void)
}
else if (USBD_EVT_XFER_DONE == event.event_id)
{
- // TODO only call respective interface callback
- // Call class handling function. Those does not own the endpoint should check and return
- for (uint8_t i = 0; i < USBD_CLASS_DRIVER_COUNT; i++)
+ // Invoke the class callback associated with the endpoint address
+ uint8_t const ep_addr = event.xfer_done.ep_addr;
+ uint8_t const drv_id = _usbd_dev.ep2drv[ edpt_dir(ep_addr) ][ edpt_number(ep_addr) ];
+
+ if (drv_id < USBD_CLASS_DRIVER_COUNT)
{
- if ( usbd_class_drivers[i].xfer_cb )
- {
- usbd_class_drivers[i].xfer_cb( event.rhport, event.xfer_done.ep_addr, (tusb_event_t) event.xfer_done.result, event.xfer_done.xferred_byte);
- }
+ usbd_class_drivers[drv_id].xfer_cb( event.rhport, ep_addr, (tusb_event_t) event.xfer_done.result, event.xfer_done.xferred_byte);
}
}
else if (USBD_EVT_SOF == event.event_id)