Fixed DFU example to work with new control mechanism.

This commit is contained in:
Gareth McMullin 2010-11-06 18:53:10 +13:00
parent 7f002110dc
commit e355906345

View File

@ -175,18 +175,26 @@ static void usbdfu_getstatus_complete(struct usb_setup_data *req)
} }
} }
static int usbdfu_control_command(struct usb_setup_data *req, static int usbdfu_control_request(struct usb_setup_data *req, u8 **buf,
void (**complete)(struct usb_setup_data *req)) 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 */ return 0; /* Only accept class request */
switch(req->bRequest) { switch(req->bRequest) {
case DFU_DNLOAD: case DFU_DNLOAD:
usbdfu_state = STATE_DFU_MANIFEST_SYNC; if((len == NULL) || (*len == 0)) {
return 1; 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: case DFU_CLRSTATUS:
/* Clear error and return to dfuIDLE */ /* Clear error and return to dfuIDLE */
if(usbdfu_state == STATE_DFU_ERROR) 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 */ /* Abort returns to dfuIDLE state */
usbdfu_state = STATE_DFU_IDLE; usbdfu_state = STATE_DFU_IDLE;
return 1; 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: case DFU_UPLOAD:
/* Upload not supported for now */ /* Upload not supported for now */
return 0; return 0;
@ -237,26 +232,6 @@ static int usbdfu_control_read(struct usb_setup_data *req, u8 **buf, u16 *len,
return 0; 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) int main(void)
{ {
rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPAEN); rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPAEN);
@ -284,9 +259,10 @@ int main(void)
usbd_init(&dev, &config, usb_strings); usbd_init(&dev, &config, usb_strings);
usbd_set_control_buffer_size(sizeof(usbd_control_buffer)); usbd_set_control_buffer_size(sizeof(usbd_control_buffer));
usbd_register_control_command_callback(usbdfu_control_command); usbd_register_control_callback(
usbd_register_control_write_callback(usbdfu_control_write); USB_REQ_TYPE_CLASS | USB_REQ_TYPE_INTERFACE,
usbd_register_control_read_callback(usbdfu_control_read); USB_REQ_TYPE_TYPE | USB_REQ_TYPE_RECIPIENT,
usbdfu_control_request);
gpio_set(GPIOA, GPIO15); gpio_set(GPIOA, GPIO15);
gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ, gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ,