diff options
| -rw-r--r-- | common/cmd_dfu.c | 14 | ||||
| -rw-r--r-- | drivers/dfu/dfu.c | 11 | ||||
| -rw-r--r-- | drivers/usb/gadget/f_dfu.c | 2 | ||||
| -rw-r--r-- | include/dfu.h | 2 | 
4 files changed, 28 insertions, 1 deletions
| diff --git a/common/cmd_dfu.c b/common/cmd_dfu.c index db066acc3..793c42212 100644 --- a/common/cmd_dfu.c +++ b/common/cmd_dfu.c @@ -19,8 +19,8 @@ static int do_dfu(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  {  	const char *str_env;  	char *s = "dfu"; +	int ret, i = 0;  	char *env_bkp; -	int ret;  	if (argc < 3)  		return CMD_RET_USAGE; @@ -49,6 +49,15 @@ static int do_dfu(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  	g_dnl_register(s);  	while (1) { +		if (dfu_reset()) +			/* +			 * This extra number of usb_gadget_handle_interrupts() +			 * calls is necessary to assure correct transmission +			 * completion with dfu-util +			 */ +			if (++i == 10) +				goto exit; +  		if (ctrlc())  			goto exit; @@ -60,6 +69,9 @@ done:  	dfu_free_entities();  	free(env_bkp); +	if (dfu_reset()) +		run_command("reset", 0); +  	return CMD_RET_SUCCESS;  } diff --git a/drivers/dfu/dfu.c b/drivers/dfu/dfu.c index b8870ecf7..d73d51039 100644 --- a/drivers/dfu/dfu.c +++ b/drivers/dfu/dfu.c @@ -16,9 +16,20 @@  #include <linux/list.h>  #include <linux/compiler.h> +static bool dfu_reset_request;  static LIST_HEAD(dfu_list);  static int dfu_alt_num; +bool dfu_reset(void) +{ +	return dfu_reset_request; +} + +void dfu_trigger_reset() +{ +	dfu_reset_request = true; +} +  static int dfu_find_alt_num(const char *s)  {  	int i = 0; diff --git a/drivers/usb/gadget/f_dfu.c b/drivers/usb/gadget/f_dfu.c index 5321a689d..37d04a192 100644 --- a/drivers/usb/gadget/f_dfu.c +++ b/drivers/usb/gadget/f_dfu.c @@ -312,6 +312,8 @@ static int state_dfu_idle(struct f_dfu *f_dfu,  			DFU_STATE_dfuMANIFEST_WAIT_RST;  		to_runtime_mode(f_dfu);  		f_dfu->dfu_state = DFU_STATE_appIDLE; + +		dfu_trigger_reset();  		break;  	default:  		f_dfu->dfu_state = DFU_STATE_dfuERROR; diff --git a/include/dfu.h b/include/dfu.h index 6c7d22713..1d4006de8 100644 --- a/include/dfu.h +++ b/include/dfu.h @@ -109,6 +109,8 @@ const char *dfu_get_dev_type(enum dfu_device_type t);  const char *dfu_get_layout(enum dfu_layout l);  struct dfu_entity *dfu_get_entity(int alt);  char *dfu_extract_token(char** e, int *n); +void dfu_trigger_reset(void); +bool dfu_reset(void);  int dfu_read(struct dfu_entity *de, void *buf, int size, int blk_seq_num);  int dfu_write(struct dfu_entity *de, void *buf, int size, int blk_seq_num); |