#include "project.h" extern uint32_t dfu_flag; const struct usb_dfu_descriptor dfu_function = { .bLength = sizeof (struct usb_dfu_descriptor), .bDescriptorType = DFU_FUNCTIONAL, .bmAttributes = USB_DFU_CAN_DOWNLOAD, .wDetachTimeout = 255, .wTransferSize = 1024, .bcdDFUVersion = 0x011A, }; const struct usb_interface_descriptor dfu_iface = { .bLength = USB_DT_INTERFACE_SIZE, .bDescriptorType = USB_DT_INTERFACE, .bInterfaceNumber = 2, .bAlternateSetting = 0, .bNumEndpoints = 0, .bInterfaceClass = 0xFE, .bInterfaceSubClass = 1, .bInterfaceProtocol = 1, .iInterface = 8, .extra = &dfu_function, .extralen = sizeof (dfu_function), }; static int dfu_detach_complete (usbd_device * usbd_dev, struct usb_setup_data *req) { (void) req; (void) usbd_dev; dfu_flag = 0xfee1dead; scb_reset_core (); return 0; } int dfu_control_request (usbd_device * usbd_dev, struct usb_setup_data *req, uint8_t ** buf, uint16_t * len, int (**complete) (usbd_device * usbd_dev, struct usb_setup_data * req)) { (void) buf; (void) len; (void) usbd_dev; if ((req->bmRequestType & 0x7F) != 0x21) return 0; /* Only accept class request. */ switch (req->bRequest) { case DFU_GETSTATUS: { (*buf)[0] = DFU_STATUS_OK; (*buf)[1] = 0; (*buf)[2] = 0; (*buf)[3] = 0; (*buf)[4] = STATE_APP_IDLE; (*buf)[5] = 0; /* iString not used here */ *len = 6; return 1; } case DFU_GETSTATE: /* Return state with no state transision. */ *buf[0] = STATE_APP_IDLE; *len = 1; return 1; case DFU_DETACH: *complete = dfu_detach_complete; return 1; } return 0; }