summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhathach <[email protected]>2021-03-10 11:33:03 +0700
committerhathach <[email protected]>2021-03-10 11:33:03 +0700
commiteeea19c0ab1c6e66c56eabac49e2c0f190e9a080 (patch)
treee26998c4995e0c662cbb2645b736801462829eba
parent38ebb8502da82e7deb1a3d8360bedc87c4923683 (diff)
usbd ack SET_INTERFACE if it is not implemented by class driver.
-rw-r--r--src/device/usbd.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/device/usbd.c b/src/device/usbd.c
index 911977eb0..ca5a482fc 100644
--- a/src/device/usbd.c
+++ b/src/device/usbd.c
@@ -699,13 +699,21 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const
// notable requests are: GET HID REPORT DESCRIPTOR, SET_INTERFACE, GET_INTERFACE
if ( !invoke_class_control(rhport, driver, p_request) )
{
- // For GET_INTERFACE, it is mandatory to respond even if the class
- // driver doesn't use alternate settings.
- TU_VERIFY( TUSB_REQ_TYPE_STANDARD == p_request->bmRequestType_bit.type &&
- TUSB_REQ_GET_INTERFACE == p_request->bRequest);
+ // For GET_INTERFACE and SET_INTERFACE, it is mandatory to respond even if the class
+ // driver doesn't use alternate settings or implement this
+ TU_VERIFY(TUSB_REQ_TYPE_STANDARD == p_request->bmRequestType_bit.type);
- uint8_t alternate = 0;
- tud_control_xfer(rhport, p_request, &alternate, 1);
+ if (TUSB_REQ_GET_INTERFACE == p_request->bRequest)
+ {
+ uint8_t alternate = 0;
+ tud_control_xfer(rhport, p_request, &alternate, 1);
+ }else if (TUSB_REQ_SET_INTERFACE == p_request->bRequest)
+ {
+ tud_control_status(rhport, p_request);
+ } else
+ {
+ return false;
+ }
}
}
break;