From cdaf455461c5ac5867f5eba2eb8874d1a32f0e82 Mon Sep 17 00:00:00 2001 From: hathach Date: Fri, 26 Jul 2019 20:14:56 +0700 Subject: fix stall response with SET_INTERFACE/GET_INTERFACE webusb work with linux & macos --- src/device/usbd.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) (limited to 'src/device') diff --git a/src/device/usbd.c b/src/device/usbd.c index f737f5d36..a6eda79de 100644 --- a/src/device/usbd.c +++ b/src/device/usbd.c @@ -439,10 +439,34 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const TU_VERIFY(drvid < USBD_CLASS_DRIVER_COUNT); - usbd_control_set_complete_callback(usbd_class_drivers[drvid].control_complete); + switch ( p_request->bRequest ) + { + case TUSB_REQ_GET_INTERFACE: + { + // TODO not support alternate interface yet + uint8_t alternate = 0; + tud_control_xfer(rhport, p_request, &alternate, 1); + } + break; + + case TUSB_REQ_SET_INTERFACE: + { + uint8_t alternate = (uint8_t) p_request->wValue; - // stall control endpoint if driver return false - return usbd_class_drivers[drvid].control_request(rhport, p_request); + // TODO not support alternate interface yet + TU_ASSERT(alternate == 0); + + tud_control_status(rhport, p_request); + } + break; + + default: + // forward to class driver + // stall control endpoint if driver return false + usbd_control_set_complete_callback(usbd_class_drivers[drvid].control_complete); + TU_ASSERT(usbd_class_drivers[drvid].control_request(rhport, p_request)); + break; + } } break; -- cgit v1.3.1