mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-05-29 04:08:46 +00:00
embed/trezorhal/usb: correct handling of interface messages in usb_class_setup
This commit is contained in:
parent
7b2fd6ae4c
commit
c115faf2cd
@ -373,21 +373,25 @@ static uint8_t usb_class_setup(USBD_HandleTypeDef *dev, USBD_SetupReqTypedef *re
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (req->wIndex >= USBD_MAX_NUM_INTERFACES) {
|
} else
|
||||||
USBD_CtlError(dev, req);
|
if ((req->bmRequest & USB_REQ_RECIPIENT_MASK) == USB_REQ_RECIPIENT_INTERFACE) {
|
||||||
return USBD_FAIL;
|
if (req->wIndex >= USBD_MAX_NUM_INTERFACES) {
|
||||||
}
|
|
||||||
switch (usb_ifaces[req->wIndex].type) {
|
|
||||||
case USB_IFACE_TYPE_HID:
|
|
||||||
return usb_hid_class_setup(dev, &usb_ifaces[req->wIndex].hid, req);
|
|
||||||
case USB_IFACE_TYPE_VCP:
|
|
||||||
return usb_vcp_class_setup(dev, &usb_ifaces[req->wIndex].vcp, req);
|
|
||||||
case USB_IFACE_TYPE_WEBUSB:
|
|
||||||
return usb_webusb_class_setup(dev, &usb_ifaces[req->wIndex].webusb, req);
|
|
||||||
default:
|
|
||||||
USBD_CtlError(dev, req);
|
USBD_CtlError(dev, req);
|
||||||
return USBD_FAIL;
|
return USBD_FAIL;
|
||||||
|
}
|
||||||
|
switch (usb_ifaces[req->wIndex].type) {
|
||||||
|
case USB_IFACE_TYPE_HID:
|
||||||
|
return usb_hid_class_setup(dev, &usb_ifaces[req->wIndex].hid, req);
|
||||||
|
case USB_IFACE_TYPE_VCP:
|
||||||
|
return usb_vcp_class_setup(dev, &usb_ifaces[req->wIndex].vcp, req);
|
||||||
|
case USB_IFACE_TYPE_WEBUSB:
|
||||||
|
return usb_webusb_class_setup(dev, &usb_ifaces[req->wIndex].webusb, req);
|
||||||
|
default:
|
||||||
|
USBD_CtlError(dev, req);
|
||||||
|
return USBD_FAIL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return USBD_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t usb_class_data_in(USBD_HandleTypeDef *dev, uint8_t ep_num) {
|
static uint8_t usb_class_data_in(USBD_HandleTypeDef *dev, uint8_t ep_num) {
|
||||||
|
@ -217,37 +217,25 @@ static void usb_webusb_class_deinit(USBD_HandleTypeDef *dev, usb_webusb_state_t
|
|||||||
|
|
||||||
static int usb_webusb_class_setup(USBD_HandleTypeDef *dev, usb_webusb_state_t *state, USBD_SetupReqTypedef *req) {
|
static int usb_webusb_class_setup(USBD_HandleTypeDef *dev, usb_webusb_state_t *state, USBD_SetupReqTypedef *req) {
|
||||||
|
|
||||||
switch (req->bmRequest & USB_REQ_TYPE_MASK) {
|
if ((req->bmRequest & USB_REQ_TYPE_MASK) != USB_REQ_TYPE_STANDARD) {
|
||||||
|
return USBD_OK;
|
||||||
// Class request
|
|
||||||
case USB_REQ_TYPE_CLASS:
|
|
||||||
switch (req->bRequest) {
|
|
||||||
default:
|
|
||||||
USBD_CtlError(dev, req);
|
|
||||||
return USBD_FAIL;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Interface & Endpoint request
|
|
||||||
case USB_REQ_TYPE_STANDARD:
|
|
||||||
switch (req->bRequest) {
|
|
||||||
|
|
||||||
case USB_REQ_SET_INTERFACE:
|
|
||||||
state->alt_setting = req->wValue;
|
|
||||||
USBD_CtlSendStatus(dev);
|
|
||||||
return USBD_OK;
|
|
||||||
|
|
||||||
case USB_REQ_GET_INTERFACE:
|
|
||||||
USBD_CtlSendData(dev, &state->alt_setting, sizeof(state->alt_setting));
|
|
||||||
return USBD_OK;
|
|
||||||
default:
|
|
||||||
USBD_CtlError(dev, req);
|
|
||||||
return USBD_FAIL;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return USBD_OK;
|
switch (req->bRequest) {
|
||||||
|
|
||||||
|
case USB_REQ_SET_INTERFACE:
|
||||||
|
state->alt_setting = req->wValue;
|
||||||
|
USBD_CtlSendStatus(dev);
|
||||||
|
return USBD_OK;
|
||||||
|
|
||||||
|
case USB_REQ_GET_INTERFACE:
|
||||||
|
USBD_CtlSendData(dev, &state->alt_setting, sizeof(state->alt_setting));
|
||||||
|
return USBD_OK;
|
||||||
|
|
||||||
|
default:
|
||||||
|
USBD_CtlError(dev, req);
|
||||||
|
return USBD_FAIL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void usb_webusb_class_data_in(USBD_HandleTypeDef *dev, usb_webusb_state_t *state, uint8_t ep_num) {
|
static void usb_webusb_class_data_in(USBD_HandleTypeDef *dev, usb_webusb_state_t *state, uint8_t ep_num) {
|
||||||
|
Loading…
Reference in New Issue
Block a user