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 <j.fischer@phytec.de>
This commit is contained in:
Johann Fischer
2019-04-10 14:33:51 +02:00
parent a942fcc23e
commit ea177e785c
2 changed files with 33 additions and 3 deletions

View File

@@ -152,3 +152,21 @@ config USB_DFU_DETACH_TIMEOUT
int
depends on USB_DFU_CLASS
default 1000
config USB_DFU_DEFAULT_POLLTIMEOUT
prompt "Default value for bwPollTimeout"
int
depends on USB_DFU_CLASS
default 256
range 0 1000
help
Default value for bwPollTimeout (in ms)
config USB_DFU_DNLOAD_POLLTIMEOUT
prompt "Value of bwPollTimeout during DNLOAD stage"
int
depends on USB_DFU_CLASS
default 10000
range 0 65535
help
Value of bwPollTimeout (in ms) during DNLOAD stage

View File

@@ -300,6 +300,7 @@ struct dfu_data_t {
enum dfu_state state; /* State of the DFU device */
enum dfu_status status; /* Status of the DFU device */
u16_t block_nr; /* DFU block number */
u16_t bwPollTimeout;
};
static struct dfu_data_t dfu_data = {
@@ -307,6 +308,7 @@ static struct dfu_data_t dfu_data = {
.status = statusOK,
.flash_area_id = DT_FLASH_AREA_IMAGE_1_ID,
.alt_setting = 0,
.bwPollTimeout = CONFIG_USB_DFU_DEFAULT_POLLTIMEOUT,
};
/**
@@ -392,13 +394,19 @@ static int dfu_class_handle_req(struct usb_setup_packet *pSetup,
dfu_data.state = dfuIDLE;
}
/* bStatus */
(*data)[0] = dfu_data.status;
(*data)[1] = 0U;
(*data)[2] = 1U;
/* bwPollTimeout */
sys_put_le16(dfu_data.bwPollTimeout, &(*data)[1]);
(*data)[3] = 0U;
/* bState */
(*data)[4] = dfu_data.state;
/* iString */
(*data)[5] = 0U;
*data_len = 6;
if (dfu_data.state == dfuDNBUSY) {
k_work_submit(&dfu_work);
}
break;
case DFU_GETSTATE:
@@ -441,6 +449,8 @@ static int dfu_class_handle_req(struct usb_setup_packet *pSetup,
switch (dfu_data.state) {
case dfuIDLE:
LOG_DBG("DFU_DNLOAD start");
dfu_data.bwPollTimeout =
CONFIG_USB_DFU_DNLOAD_POLLTIMEOUT;
dfu_reset_counters();
k_poll_signal_reset(&dfu_signal);
@@ -456,13 +466,15 @@ static int dfu_class_handle_req(struct usb_setup_packet *pSetup,
dfu_data_worker.worker_state = dfuIDLE;
dfu_data_worker.worker_len = pSetup->wLength;
memcpy(dfu_data_worker.buf, *data, pSetup->wLength);
k_work_submit(&dfu_work);
/* do not submit dfu_work now, wait for DFU_GETSTATUS */
break;
case dfuDNLOAD_IDLE:
dfu_data.state = dfuDNBUSY;
dfu_data_worker.worker_state = dfuDNLOAD_IDLE;
dfu_data_worker.worker_len = pSetup->wLength;
if (dfu_data_worker.worker_len == 0U) {
dfu_data.bwPollTimeout =
CONFIG_USB_DFU_DEFAULT_POLLTIMEOUT;
dfu_data.state = dfuMANIFEST_SYNC;
k_poll_signal_raise(&dfu_signal, 0);
}