|
|
|
@ -343,7 +343,6 @@ static uint8_t usb_class_deinit(USBD_HandleTypeDef *dev, uint8_t cfg_idx) {
|
|
|
|
|
|
|
|
|
|
static uint8_t usb_class_setup(USBD_HandleTypeDef *dev,
|
|
|
|
|
USBD_SetupReqTypedef *req) {
|
|
|
|
|
wait_random();
|
|
|
|
|
if (((req->bmRequest & USB_REQ_TYPE_MASK) != USB_REQ_TYPE_CLASS) &&
|
|
|
|
|
((req->bmRequest & USB_REQ_TYPE_MASK) != USB_REQ_TYPE_STANDARD) &&
|
|
|
|
|
((req->bmRequest & USB_REQ_TYPE_MASK) != USB_REQ_TYPE_VENDOR)) {
|
|
|
|
@ -375,10 +374,12 @@ static uint8_t usb_class_setup(USBD_HandleTypeDef *dev,
|
|
|
|
|
'r',
|
|
|
|
|
't', // char URL[]
|
|
|
|
|
};
|
|
|
|
|
wait_random();
|
|
|
|
|
USBD_CtlSendData(dev, UNCONST(webusb_url),
|
|
|
|
|
MIN_8bits(req->wLength, sizeof(webusb_url)));
|
|
|
|
|
return USBD_OK;
|
|
|
|
|
} else {
|
|
|
|
|
wait_random();
|
|
|
|
|
USBD_CtlError(dev, req);
|
|
|
|
|
return USBD_FAIL;
|
|
|
|
|
}
|
|
|
|
@ -402,10 +403,12 @@ static uint8_t usb_class_setup(USBD_HandleTypeDef *dev,
|
|
|
|
|
0x00, // subCompatibleId
|
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // reserved
|
|
|
|
|
};
|
|
|
|
|
wait_random();
|
|
|
|
|
USBD_CtlSendData(dev, UNCONST(winusb_wcid),
|
|
|
|
|
MIN_8bits(req->wLength, sizeof(winusb_wcid)));
|
|
|
|
|
return USBD_OK;
|
|
|
|
|
} else {
|
|
|
|
|
wait_random();
|
|
|
|
|
USBD_CtlError(dev, req);
|
|
|
|
|
return USBD_FAIL;
|
|
|
|
|
}
|
|
|
|
@ -440,10 +443,12 @@ static uint8_t usb_class_setup(USBD_HandleTypeDef *dev,
|
|
|
|
|
'c', 0x00, 'e', 0x00, 'a', 0x00, '5', 0x00, '0', 0x00, '3', 0x00,
|
|
|
|
|
'd', 0x00, '}', 0x00, 0x00, 0x00, 0x00, 0x00, // propertyData
|
|
|
|
|
};
|
|
|
|
|
wait_random();
|
|
|
|
|
USBD_CtlSendData(dev, UNCONST(winusb_guid),
|
|
|
|
|
MIN_8bits(req->wLength, sizeof(winusb_guid)));
|
|
|
|
|
return USBD_OK;
|
|
|
|
|
} else {
|
|
|
|
|
wait_random();
|
|
|
|
|
USBD_CtlError(dev, req);
|
|
|
|
|
return USBD_FAIL;
|
|
|
|
|
}
|
|
|
|
@ -452,18 +457,23 @@ static uint8_t usb_class_setup(USBD_HandleTypeDef *dev,
|
|
|
|
|
} else if ((req->bmRequest & USB_REQ_RECIPIENT_MASK) ==
|
|
|
|
|
USB_REQ_RECIPIENT_INTERFACE) {
|
|
|
|
|
if (req->wIndex >= USBD_MAX_NUM_INTERFACES) {
|
|
|
|
|
wait_random();
|
|
|
|
|
USBD_CtlError(dev, req);
|
|
|
|
|
return USBD_FAIL;
|
|
|
|
|
}
|
|
|
|
|
switch (usb_ifaces[req->wIndex].type) {
|
|
|
|
|
case USB_IFACE_TYPE_HID:
|
|
|
|
|
wait_random();
|
|
|
|
|
return usb_hid_class_setup(dev, &usb_ifaces[req->wIndex].hid, req);
|
|
|
|
|
case USB_IFACE_TYPE_VCP:
|
|
|
|
|
wait_random();
|
|
|
|
|
return usb_vcp_class_setup(dev, &usb_ifaces[req->wIndex].vcp, req);
|
|
|
|
|
case USB_IFACE_TYPE_WEBUSB:
|
|
|
|
|
wait_random();
|
|
|
|
|
return usb_webusb_class_setup(dev, &usb_ifaces[req->wIndex].webusb,
|
|
|
|
|
req);
|
|
|
|
|
default:
|
|
|
|
|
wait_random();
|
|
|
|
|
USBD_CtlError(dev, req);
|
|
|
|
|
return USBD_FAIL;
|
|
|
|
|
}
|
|
|
|
@ -472,16 +482,18 @@ static uint8_t usb_class_setup(USBD_HandleTypeDef *dev,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static uint8_t usb_class_data_in(USBD_HandleTypeDef *dev, uint8_t ep_num) {
|
|
|
|
|
wait_random();
|
|
|
|
|
for (int i = 0; i < USBD_MAX_NUM_INTERFACES; i++) {
|
|
|
|
|
switch (usb_ifaces[i].type) {
|
|
|
|
|
case USB_IFACE_TYPE_HID:
|
|
|
|
|
wait_random();
|
|
|
|
|
usb_hid_class_data_in(dev, &usb_ifaces[i].hid, ep_num);
|
|
|
|
|
break;
|
|
|
|
|
case USB_IFACE_TYPE_VCP:
|
|
|
|
|
wait_random();
|
|
|
|
|
usb_vcp_class_data_in(dev, &usb_ifaces[i].vcp, ep_num);
|
|
|
|
|
break;
|
|
|
|
|
case USB_IFACE_TYPE_WEBUSB:
|
|
|
|
|
wait_random();
|
|
|
|
|
usb_webusb_class_data_in(dev, &usb_ifaces[i].webusb, ep_num);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
@ -492,16 +504,18 @@ static uint8_t usb_class_data_in(USBD_HandleTypeDef *dev, uint8_t ep_num) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static uint8_t usb_class_data_out(USBD_HandleTypeDef *dev, uint8_t ep_num) {
|
|
|
|
|
wait_random();
|
|
|
|
|
for (int i = 0; i < USBD_MAX_NUM_INTERFACES; i++) {
|
|
|
|
|
switch (usb_ifaces[i].type) {
|
|
|
|
|
case USB_IFACE_TYPE_HID:
|
|
|
|
|
wait_random();
|
|
|
|
|
usb_hid_class_data_out(dev, &usb_ifaces[i].hid, ep_num);
|
|
|
|
|
break;
|
|
|
|
|
case USB_IFACE_TYPE_VCP:
|
|
|
|
|
wait_random();
|
|
|
|
|
usb_vcp_class_data_out(dev, &usb_ifaces[i].vcp, ep_num);
|
|
|
|
|
break;
|
|
|
|
|
case USB_IFACE_TYPE_WEBUSB:
|
|
|
|
|
wait_random();
|
|
|
|
|
usb_webusb_class_data_out(dev, &usb_ifaces[i].webusb, ep_num);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
@ -512,10 +526,10 @@ static uint8_t usb_class_data_out(USBD_HandleTypeDef *dev, uint8_t ep_num) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static uint8_t usb_class_sof(USBD_HandleTypeDef *dev) {
|
|
|
|
|
wait_random();
|
|
|
|
|
for (int i = 0; i < USBD_MAX_NUM_INTERFACES; i++) {
|
|
|
|
|
switch (usb_ifaces[i].type) {
|
|
|
|
|
case USB_IFACE_TYPE_VCP:
|
|
|
|
|
wait_random();
|
|
|
|
|
usb_vcp_class_sof(dev, &usb_ifaces[i].vcp);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|