From e35590634596acb288ad3e89cb1c4dc4a3f9fc93 Mon Sep 17 00:00:00 2001 From: Gareth McMullin Date: Sat, 6 Nov 2010 18:53:10 +1300 Subject: Fixed DFU example to work with new control mechanism. --- examples/other/usb_dfu/usbdfu.c | 62 +++++++++++++---------------------------- 1 file changed, 19 insertions(+), 43 deletions(-) diff --git a/examples/other/usb_dfu/usbdfu.c b/examples/other/usb_dfu/usbdfu.c index 9e72318..a6d8ce7 100644 --- a/examples/other/usb_dfu/usbdfu.c +++ b/examples/other/usb_dfu/usbdfu.c @@ -175,18 +175,26 @@ static void usbdfu_getstatus_complete(struct usb_setup_data *req) } } -static int usbdfu_control_command(struct usb_setup_data *req, - void (**complete)(struct usb_setup_data *req)) +static int usbdfu_control_request(struct usb_setup_data *req, u8 **buf, + u16 *len, void (**complete)(struct usb_setup_data *req)) { - (void)complete; - if(req->bmRequestType != 0x21) + if((req->bmRequestType & 0x7F) != 0x21) return 0; /* Only accept class request */ - + switch(req->bRequest) { case DFU_DNLOAD: - usbdfu_state = STATE_DFU_MANIFEST_SYNC; - return 1; + if((len == NULL) || (*len == 0)) { + usbdfu_state = STATE_DFU_MANIFEST_SYNC; + return 1; + } else { + /* Copy download data for use on GET_STATUS */ + prog.blocknum = req->wValue; + prog.len = *len; + memcpy(prog.buf, *buf, *len); + usbdfu_state = STATE_DFU_DNLOAD_SYNC; + return 1; + } case DFU_CLRSTATUS: /* Clear error and return to dfuIDLE */ if(usbdfu_state == STATE_DFU_ERROR) @@ -196,19 +204,6 @@ static int usbdfu_control_command(struct usb_setup_data *req, /* Abort returns to dfuIDLE state */ usbdfu_state = STATE_DFU_IDLE; return 1; - } - - return 0; -} - -static int usbdfu_control_read(struct usb_setup_data *req, u8 **buf, u16 *len, - void (**complete)(struct usb_setup_data *req)) -{ - - if(req->bmRequestType != 0xA1) - return 0; /* Only accept class request */ - - switch(req->bRequest) { case DFU_UPLOAD: /* Upload not supported for now */ return 0; @@ -237,26 +232,6 @@ static int usbdfu_control_read(struct usb_setup_data *req, u8 **buf, u16 *len, return 0; } -static int usbdfu_control_write(struct usb_setup_data *req, u8 *buf, u16 len, - void (**complete)(struct usb_setup_data *req)) -{ - (void)complete; - - if(req->bmRequestType != 0x21) - return 0; /* Only accept class request */ - - if(req->bRequest != DFU_DNLOAD) - return 0; - - /* Copy download data for use on GET_STATUS */ - prog.blocknum = req->wValue; - prog.len = len; - memcpy(prog.buf, buf, len); - usbdfu_state = STATE_DFU_DNLOAD_SYNC; - - return 1; -} - int main(void) { rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPAEN); @@ -284,9 +259,10 @@ int main(void) usbd_init(&dev, &config, usb_strings); usbd_set_control_buffer_size(sizeof(usbd_control_buffer)); - usbd_register_control_command_callback(usbdfu_control_command); - usbd_register_control_write_callback(usbdfu_control_write); - usbd_register_control_read_callback(usbdfu_control_read); + usbd_register_control_callback( + USB_REQ_TYPE_CLASS | USB_REQ_TYPE_INTERFACE, + USB_REQ_TYPE_TYPE | USB_REQ_TYPE_RECIPIENT, + usbdfu_control_request); gpio_set(GPIOA, GPIO15); gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ, -- cgit v1.2.3