diff options
| author | hathach <[email protected]> | 2020-01-09 21:31:01 +0700 |
|---|---|---|
| committer | hathach <[email protected]> | 2020-01-09 21:31:01 +0700 |
| commit | dd96be492f055734da83a079e6c1332819ce07c7 (patch) | |
| tree | 929880cf55fc690ff14df4d832ee724d8f033846 /src/device | |
| parent | 0268f24227c19145d7fe1fefda91673bc7a0514b (diff) | |
| parent | 99f76eaaaaceea1adcf010b6ab29246f5a32b08a (diff) | |
Merge branch 'master' into develop
Diffstat (limited to 'src/device')
| -rw-r--r-- | src/device/usbd.c | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/src/device/usbd.c b/src/device/usbd.c index 949e14096..fcc623d33 100644 --- a/src/device/usbd.c +++ b/src/device/usbd.c @@ -519,9 +519,11 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const uint8_t const cfg_num = (uint8_t) p_request->wValue;
dcd_set_config(rhport, cfg_num);
+
+ if ( !_usbd_dev.configured && cfg_num ) TU_ASSERT( process_set_config(rhport, cfg_num) );
+
_usbd_dev.configured = cfg_num ? 1 : 0;
- if ( cfg_num ) TU_ASSERT( process_set_config(rhport, cfg_num) );
tud_control_status(rhport, p_request);
}
break;
@@ -618,7 +620,6 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const TU_ASSERT(ep_num < TU_ARRAY_SIZE(_usbd_dev.ep2drv) );
uint8_t const drvid = _usbd_dev.ep2drv[ep_num][ep_dir];
- TU_ASSERT(drvid < USBD_CLASS_DRIVER_COUNT);
bool ret = false;
@@ -658,13 +659,17 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const }
}
- // Some classes such as USBTMC needs to clear/re-init its buffer when receiving CLEAR_FEATURE request
- // We will forward all request targeted endpoint to class drivers after
- // - For class-type requests: driver is fully responsible to reply to host
- // - For std-type requests : driver init/re-init internal variable/buffer only, and
- // must not call tud_control_status(), driver's return value will have no effect.
- // EP state has already affected (stalled/cleared)
- if ( invoke_class_control(rhport, drvid, p_request) ) ret = true;
+ if (drvid < 0xFF) {
+ TU_ASSERT(drvid < USBD_CLASS_DRIVER_COUNT);
+
+ // Some classes such as USBTMC needs to clear/re-init its buffer when receiving CLEAR_FEATURE request
+ // We will forward all request targeted endpoint to class drivers after
+ // - For class-type requests: driver is fully responsible to reply to host
+ // - For std-type requests : driver init/re-init internal variable/buffer only, and
+ // must not call tud_control_status(), driver's return value will have no effect.
+ // EP state has already affected (stalled/cleared)
+ if ( invoke_class_control(rhport, drvid, p_request) ) ret = true;
+ }
if ( TUSB_REQ_TYPE_STANDARD == p_request->bmRequestType_bit.type )
{
|
