diff options
author | fishsoupisgood <github@madingley.org> | 2019-04-29 07:30:28 +0100 |
---|---|---|
committer | fishsoupisgood <github@madingley.org> | 2019-04-29 07:30:28 +0100 |
commit | 259ee0e7022ce15f4f2c8294a4fc3de7005d7fab (patch) | |
tree | d284293075d882911c2c6a3e982570a7c8aec7e4 /app/dfu.c | |
download | adapter-259ee0e7022ce15f4f2c8294a4fc3de7005d7fab.tar.gz adapter-259ee0e7022ce15f4f2c8294a4fc3de7005d7fab.tar.bz2 adapter-259ee0e7022ce15f4f2c8294a4fc3de7005d7fab.zip |
working with one set of stripes
Diffstat (limited to 'app/dfu.c')
-rw-r--r-- | app/dfu.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/app/dfu.c b/app/dfu.c new file mode 100644 index 0000000..d79b474 --- /dev/null +++ b/app/dfu.c @@ -0,0 +1,80 @@ +#include "project.h" + +#ifdef INCLUDE_DFU_INTERFACE + +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 = 4, + + .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 1; +} + +int +dfu_control_request (usbd_device *usbd_dev, struct usb_setup_data *req, + uint8_t **buf, uint16_t *len, + usbd_control_complete_callback *complete) +{ + (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; +} +#endif |