@@ -300,13 +300,15 @@ struct dfu_data_t {
300
300
enum dfu_state state ; /* State of the DFU device */
301
301
enum dfu_status status ; /* Status of the DFU device */
302
302
u16_t block_nr ; /* DFU block number */
303
+ u16_t bwPollTimeout ;
303
304
};
304
305
305
306
static struct dfu_data_t dfu_data = {
306
307
.state = appIDLE ,
307
308
.status = statusOK ,
308
309
.flash_area_id = DT_FLASH_AREA_IMAGE_1_ID ,
309
310
.alt_setting = 0 ,
311
+ .bwPollTimeout = CONFIG_USB_DFU_DEFAULT_POLLTIMEOUT ,
310
312
};
311
313
312
314
/**
@@ -392,13 +394,19 @@ static int dfu_class_handle_req(struct usb_setup_packet *pSetup,
392
394
dfu_data .state = dfuIDLE ;
393
395
}
394
396
397
+ /* bStatus */
395
398
(* data )[0 ] = dfu_data .status ;
396
- ( * data )[ 1 ] = 0U ;
397
- ( * data )[2 ] = 1U ;
399
+ /* bwPollTimeout */
400
+ sys_put_le16 ( dfu_data . bwPollTimeout , & ( * data )[1 ]) ;
398
401
(* data )[3 ] = 0U ;
402
+ /* bState */
399
403
(* data )[4 ] = dfu_data .state ;
404
+ /* iString */
400
405
(* data )[5 ] = 0U ;
401
406
* data_len = 6 ;
407
+ if (dfu_data .state == dfuDNBUSY ) {
408
+ k_work_submit (& dfu_work );
409
+ }
402
410
break ;
403
411
404
412
case DFU_GETSTATE :
@@ -441,6 +449,8 @@ static int dfu_class_handle_req(struct usb_setup_packet *pSetup,
441
449
switch (dfu_data .state ) {
442
450
case dfuIDLE :
443
451
LOG_DBG ("DFU_DNLOAD start" );
452
+ dfu_data .bwPollTimeout =
453
+ CONFIG_USB_DFU_DNLOAD_POLLTIMEOUT ;
444
454
dfu_reset_counters ();
445
455
k_poll_signal_reset (& dfu_signal );
446
456
@@ -456,13 +466,15 @@ static int dfu_class_handle_req(struct usb_setup_packet *pSetup,
456
466
dfu_data_worker .worker_state = dfuIDLE ;
457
467
dfu_data_worker .worker_len = pSetup -> wLength ;
458
468
memcpy (dfu_data_worker .buf , * data , pSetup -> wLength );
459
- k_work_submit ( & dfu_work );
469
+ /* do not submit dfu_work now, wait for DFU_GETSTATUS */
460
470
break ;
461
471
case dfuDNLOAD_IDLE :
462
472
dfu_data .state = dfuDNBUSY ;
463
473
dfu_data_worker .worker_state = dfuDNLOAD_IDLE ;
464
474
dfu_data_worker .worker_len = pSetup -> wLength ;
465
475
if (dfu_data_worker .worker_len == 0U ) {
476
+ dfu_data .bwPollTimeout =
477
+ CONFIG_USB_DFU_DEFAULT_POLLTIMEOUT ;
466
478
dfu_data .state = dfuMANIFEST_SYNC ;
467
479
k_poll_signal_raise (& dfu_signal , 0 );
468
480
}
0 commit comments