fix(core/usbd_core): fix two bugs

- fix current_desc_len += p[DESC_bLength] before p+= p[DESC_bLength]
- fix reset all eps when alt_setting=0

Signed-off-by: sakumisu <1203593632@qq.com>
This commit is contained in:
sakumisu 2025-03-04 17:07:36 +08:00
parent 6378fb88d0
commit e581097309

View File

@ -446,8 +446,8 @@ static bool usbd_set_configuration(uint8_t busid, uint8_t config_index, uint8_t
} }
/* skip to next descriptor */ /* skip to next descriptor */
p += p[DESC_bLength];
current_desc_len += p[DESC_bLength]; current_desc_len += p[DESC_bLength];
p += p[DESC_bLength];
if (current_desc_len >= desc_len && desc_len) { if (current_desc_len >= desc_len && desc_len) {
break; break;
} }
@ -512,7 +512,6 @@ static bool usbd_set_interface(uint8_t busid, uint8_t iface, uint8_t alt_setting
if (alt_setting == 0) { if (alt_setting == 0) {
ret = usbd_reset_endpoint(busid, ep_desc); ret = usbd_reset_endpoint(busid, ep_desc);
goto find_end;
} else if (cur_alt_setting == alt_setting) { } else if (cur_alt_setting == alt_setting) {
ret = usbd_set_endpoint(busid, ep_desc); ret = usbd_set_endpoint(busid, ep_desc);
} else { } else {
@ -526,14 +525,13 @@ static bool usbd_set_interface(uint8_t busid, uint8_t iface, uint8_t alt_setting
} }
/* skip to next descriptor */ /* skip to next descriptor */
p += p[DESC_bLength];
current_desc_len += p[DESC_bLength]; current_desc_len += p[DESC_bLength];
p += p[DESC_bLength];
if (current_desc_len >= desc_len && desc_len) { if (current_desc_len >= desc_len && desc_len) {
break; break;
} }
} }
find_end:
usbd_class_event_notify_handler(busid, USBD_EVENT_SET_INTERFACE, (void *)if_desc); usbd_class_event_notify_handler(busid, USBD_EVENT_SET_INTERFACE, (void *)if_desc);
return ret; return ret;
@ -700,8 +698,8 @@ static bool usbd_std_interface_req_handler(uint8_t busid, struct usb_setup_packe
} }
/* skip to next descriptor */ /* skip to next descriptor */
p += p[DESC_bLength];
current_desc_len += p[DESC_bLength]; current_desc_len += p[DESC_bLength];
p += p[DESC_bLength];
if (current_desc_len >= desc_len && desc_len) { if (current_desc_len >= desc_len && desc_len) {
break; break;
} }