Skip to content

Commit a05ef25

Browse files
jfischer-nonashif
authored andcommitted
usb: dfu: set bwPollTimeout dynamically
Set bwPollTimeout for DFU_GETSTATUS request dynamically. For now, adjust bwPollTimeout only during DNLOAD stage. Fixes: #8734 Signed-off-by: Johann Fischer <[email protected]>
1 parent 5307858 commit a05ef25

File tree

2 files changed

+33
-3
lines changed

2 files changed

+33
-3
lines changed

subsys/usb/class/Kconfig

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,3 +152,21 @@ config USB_DFU_DETACH_TIMEOUT
152152
int
153153
depends on USB_DFU_CLASS
154154
default 1000
155+
156+
config USB_DFU_DEFAULT_POLLTIMEOUT
157+
prompt "Default value for bwPollTimeout"
158+
int
159+
depends on USB_DFU_CLASS
160+
default 256
161+
range 0 1000
162+
help
163+
Default value for bwPollTimeout (in ms)
164+
165+
config USB_DFU_DNLOAD_POLLTIMEOUT
166+
prompt "Value of bwPollTimeout during DNLOAD stage"
167+
int
168+
depends on USB_DFU_CLASS
169+
default 10000
170+
range 0 65535
171+
help
172+
Value of bwPollTimeout (in ms) during DNLOAD stage

subsys/usb/class/usb_dfu.c

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -300,13 +300,15 @@ struct dfu_data_t {
300300
enum dfu_state state; /* State of the DFU device */
301301
enum dfu_status status; /* Status of the DFU device */
302302
u16_t block_nr; /* DFU block number */
303+
u16_t bwPollTimeout;
303304
};
304305

305306
static struct dfu_data_t dfu_data = {
306307
.state = appIDLE,
307308
.status = statusOK,
308309
.flash_area_id = DT_FLASH_AREA_IMAGE_1_ID,
309310
.alt_setting = 0,
311+
.bwPollTimeout = CONFIG_USB_DFU_DEFAULT_POLLTIMEOUT,
310312
};
311313

312314
/**
@@ -392,13 +394,19 @@ static int dfu_class_handle_req(struct usb_setup_packet *pSetup,
392394
dfu_data.state = dfuIDLE;
393395
}
394396

397+
/* bStatus */
395398
(*data)[0] = dfu_data.status;
396-
(*data)[1] = 0U;
397-
(*data)[2] = 1U;
399+
/* bwPollTimeout */
400+
sys_put_le16(dfu_data.bwPollTimeout, &(*data)[1]);
398401
(*data)[3] = 0U;
402+
/* bState */
399403
(*data)[4] = dfu_data.state;
404+
/* iString */
400405
(*data)[5] = 0U;
401406
*data_len = 6;
407+
if (dfu_data.state == dfuDNBUSY) {
408+
k_work_submit(&dfu_work);
409+
}
402410
break;
403411

404412
case DFU_GETSTATE:
@@ -441,6 +449,8 @@ static int dfu_class_handle_req(struct usb_setup_packet *pSetup,
441449
switch (dfu_data.state) {
442450
case dfuIDLE:
443451
LOG_DBG("DFU_DNLOAD start");
452+
dfu_data.bwPollTimeout =
453+
CONFIG_USB_DFU_DNLOAD_POLLTIMEOUT;
444454
dfu_reset_counters();
445455
k_poll_signal_reset(&dfu_signal);
446456

@@ -456,13 +466,15 @@ static int dfu_class_handle_req(struct usb_setup_packet *pSetup,
456466
dfu_data_worker.worker_state = dfuIDLE;
457467
dfu_data_worker.worker_len = pSetup->wLength;
458468
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 */
460470
break;
461471
case dfuDNLOAD_IDLE:
462472
dfu_data.state = dfuDNBUSY;
463473
dfu_data_worker.worker_state = dfuDNLOAD_IDLE;
464474
dfu_data_worker.worker_len = pSetup->wLength;
465475
if (dfu_data_worker.worker_len == 0U) {
476+
dfu_data.bwPollTimeout =
477+
CONFIG_USB_DFU_DEFAULT_POLLTIMEOUT;
466478
dfu_data.state = dfuMANIFEST_SYNC;
467479
k_poll_signal_raise(&dfu_signal, 0);
468480
}

0 commit comments

Comments
 (0)