summaryrefslogtreecommitdiff
path: root/src/device
diff options
context:
space:
mode:
authorHa Thach <[email protected]>2020-04-16 21:33:03 +0700
committerGitHub <[email protected]>2020-04-16 21:33:03 +0700
commitbfec3b44795e92469f5d4ff16f1caf131114d54f (patch)
treeabeaf6853d3a27a5b1edc459a5143f749410f6e4 /src/device
parent33888519dd3a972fdef21ad259d060ff6cef36db (diff)
parent2eed58d0962849014ab3166d4a3f0d3677d32c01 (diff)
Merge pull request #345 from hathach/add-alt-itf
Implement setInterface(alt) for usb net driver
Diffstat (limited to 'src/device')
-rw-r--r--src/device/usbd.c40
1 files changed, 9 insertions, 31 deletions
diff --git a/src/device/usbd.c b/src/device/usbd.c
index ad5a32f92..29845ff36 100644
--- a/src/device/usbd.c
+++ b/src/device/usbd.c
@@ -571,39 +571,17 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const
uint8_t const drvid = _usbd_dev.itf2drv[itf];
TU_VERIFY(drvid < USBD_CLASS_DRIVER_COUNT);
- if (p_request->bmRequestType_bit.type == TUSB_REQ_TYPE_STANDARD)
+ // all requests to Interface (STD or Class) is forwarded to class driver.
+ // notable requests are: GET HID REPORT DESCRIPTOR, SET_INTERFACE, GET_INTERFACE
+ if ( !invoke_class_control(rhport, drvid, p_request) )
{
- 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 const alternate = (uint8_t) p_request->wValue;
- (void) alternate;
+ // 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);
- // TODO not support alternate interface yet
-// TU_ASSERT(alternate == 0);
- tud_control_status(rhport, p_request);
- }
- break;
-
- default:
- // forward to class driver: "STD request to Interface"
- // GET HID REPORT DESCRIPTOR falls into this case
- TU_VERIFY(invoke_class_control(rhport, drvid, p_request));
- break;
- }
- }else
- {
- // forward to class driver: "non-STD request to Interface"
- TU_VERIFY(invoke_class_control(rhport, drvid, p_request));
+ uint8_t alternate = 0;
+ tud_control_xfer(rhport, p_request, &alternate, 1);
}
}
break;