Fixed DFU example to work with new control mechanism.
This commit is contained in:
parent
7f002110dc
commit
e355906345
@ -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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user