#include <libopencm3/usb/usbd.h>
#include <libopencm3/usb/dfu.h>
#include <libopencm3/cm3/scb.h>
#include "general.h"
#include "usb_dfu_stub.h"
#include "usb_types.h"
static void dfu_detach_complete(usbd_device *const dev, usb_setup_data_s *const req)
{
(void)dev;
(void)req;
platform_request_boot();
#if defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__)
scb_reset_core();
#endif
}
static usbd_request_return_codes_e dfu_control_request(usbd_device *const dev, usb_setup_data_s *req, uint8_t **buf,
uint16_t *len, void (**complete)(usbd_device *dev, usb_setup_data_s *req))
{
(void)dev;
if (req->wIndex != DFU_IF_NO)
return USBD_REQ_NEXT_CALLBACK;
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;
*len = 6;
return USBD_REQ_HANDLED;
case DFU_DETACH:
*complete = dfu_detach_complete;
return USBD_REQ_HANDLED;
}
return USBD_REQ_NOTSUPP;
}
void dfu_set_config(usbd_device *const dev, const uint16_t value)
{
(void)value;
usbd_register_control_callback(dev, USB_REQ_TYPE_CLASS | USB_REQ_TYPE_INTERFACE,
USB_REQ_TYPE_TYPE | USB_REQ_TYPE_RECIPIENT, dfu_control_request);
}