diff options
| author | hathach <[email protected]> | 2019-09-22 11:00:35 +0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2019-09-22 11:00:35 +0700 |
| commit | b1d29947bcfb43587081a8828d832b5a9b139d18 (patch) | |
| tree | e37eaba8bba7864d9751b5edfd9a7316f71132f2 /src/device | |
| parent | f90f1a278b215aac492822fd686289683fc039a5 (diff) | |
| parent | 9498adef71fe2816d336061b38ed801dc980a8bb (diff) | |
Merge pull request #175 from pigrew/clear_feature_ordering
Clear feature ordering
Diffstat (limited to 'src/device')
| -rw-r--r-- | src/device/usbd.c | 27 | ||||
| -rw-r--r-- | src/device/usbd_control.c | 2 |
2 files changed, 16 insertions, 13 deletions
diff --git a/src/device/usbd.c b/src/device/usbd.c index 0366d1ece..50964bdee 100644 --- a/src/device/usbd.c +++ b/src/device/usbd.c @@ -499,10 +499,6 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const uint8_t const drv_id = _usbd_dev.ep2drv[ep_num][ep_dir];
TU_ASSERT(drv_id < USBD_CLASS_DRIVER_COUNT);
- // Some classes such as TMC needs to clear/re-init its buffer when receiving CLEAR_FEATURE request
- // We will forward all request targeted endpoint to its class driver
- // - For non-standard request: driver can ACK or Stall the request by return true/false
- // - For standard request: usbd decide the ACK stage regardless of driver return value
bool ret = false;
if ( TUSB_REQ_TYPE_STANDARD != p_request->bmRequestType_bit.type )
@@ -511,12 +507,6 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const usbd_control_set_complete_callback(usbd_class_drivers[drv_id].control_complete);
}
- // Invoke class driver first if available
- if ( usbd_class_drivers[drv_id].control_request )
- {
- ret = usbd_class_drivers[drv_id].control_request(rhport, p_request);
- }
-
// Then handle if it is standard request
if ( TUSB_REQ_TYPE_STANDARD == p_request->bmRequestType_bit.type )
{
@@ -552,7 +542,18 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const default: TU_BREAKPOINT(); return false;
}
}
+ // Some classes such as TMC needs to clear/re-init its buffer when receiving CLEAR_FEATURE request
+ // We will forward all request targeted endpoint to its class driver
+ // For class-type requests: must (call tud_control_status(); return true) or (return false)
+ // For std-type requests: non-std request codes are already discarded.
+ // must not call tud_control_status(), and return value will have no effect
+ // class driver is invoked last, so that EP already has EP stall cleared (in event of clear feature EP halt)
+ if ( usbd_class_drivers[drv_id].control_request &&
+ usbd_class_drivers[drv_id].control_request(rhport, p_request))
+ {
+ ret = true;
+ }
return ret;
}
break;
@@ -633,7 +634,7 @@ static void mark_interface_endpoint(uint8_t ep2drv[8][2], uint8_t const* p_desc, ep2drv[tu_edpt_number(ep_addr)][tu_edpt_dir(ep_addr)] = driver_id;
}
- len += tu_desc_len(p_desc);
+ len = (uint16_t)(len + tu_desc_len(p_desc));
p_desc = tu_desc_next(p_desc);
}
}
@@ -804,7 +805,7 @@ bool usbd_open_edpt_pair(uint8_t rhport, uint8_t const* p_desc, uint8_t ep_count {
tusb_desc_endpoint_t const * desc_ep = (tusb_desc_endpoint_t const *) p_desc;
- TU_VERIFY(TUSB_DESC_ENDPOINT == desc_ep->bDescriptorType && xfer_type == desc_ep->bmAttributes.xfer);
+ TU_ASSERT(TUSB_DESC_ENDPOINT == desc_ep->bDescriptorType && xfer_type == desc_ep->bmAttributes.xfer);
TU_ASSERT(dcd_edpt_open(rhport, desc_ep));
if ( tu_edpt_dir(desc_ep->bEndpointAddress) == TUSB_DIR_IN )
@@ -870,6 +871,7 @@ void usbd_edpt_stall(uint8_t rhport, uint8_t ep_addr) dcd_edpt_stall(rhport, ep_addr);
_usbd_dev.ep_stall_map[dir] = (uint8_t) tu_bit_set(_usbd_dev.ep_stall_map[dir], epnum);
+ _usbd_dev.ep_busy_map[dir] = (uint8_t) tu_bit_set(_usbd_dev.ep_busy_map[dir], epnum);
}
void usbd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)
@@ -878,6 +880,7 @@ void usbd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr) uint8_t const dir = tu_edpt_dir(ep_addr);
dcd_edpt_clear_stall(rhport, ep_addr);
+ _usbd_dev.ep_busy_map[dir] = (uint8_t) tu_bit_clear(_usbd_dev.ep_busy_map[dir], epnum);
_usbd_dev.ep_stall_map[dir] = (uint8_t) tu_bit_clear(_usbd_dev.ep_stall_map[dir], epnum);
}
diff --git a/src/device/usbd_control.c b/src/device/usbd_control.c index 4ec432185..eecc95edb 100644 --- a/src/device/usbd_control.c +++ b/src/device/usbd_control.c @@ -122,7 +122,7 @@ bool usbd_control_xfer_cb (uint8_t rhport, uint8_t ep_addr, xfer_result_t result }
_control_state.total_transferred += xferred_bytes;
- _control_state.buffer += xferred_bytes;
+ _control_state.buffer = ((uint8_t*)_control_state.buffer) + xferred_bytes;
if ( _control_state.total_len == _control_state.total_transferred || xferred_bytes < CFG_TUD_ENDOINT0_SIZE )
{
|
