aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGareth McMullin2010-11-06 18:53:10 +1300
committerGareth McMullin2010-11-06 18:53:10 +1300
commite35590634596acb288ad3e89cb1c4dc4a3f9fc93 (patch)
tree73bff91c58439e95bd3c6e6ea70eb5a87ac35f8f
parent7f002110dcccf7efb8c260bdc2106c2192257c96 (diff)
Fixed DFU example to work with new control mechanism.
-rw-r--r--examples/other/usb_dfu/usbdfu.c62
1 files 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,