diff options
| -rw-r--r-- | README | 10 | ||||
| -rw-r--r-- | drivers/dfu/dfu.c | 4 | ||||
| -rw-r--r-- | drivers/usb/gadget/f_dfu.c | 48 | ||||
| -rw-r--r-- | include/dfu.h | 3 | 
4 files changed, 55 insertions, 10 deletions
| @@ -1525,6 +1525,16 @@ The following options need to be configured:  		this to the maximum filesize (in bytes) for the buffer.  		Default is 4 MiB if undefined. +		DFU_DEFAULT_POLL_TIMEOUT +		Poll timeout [ms], is the timeout a device can send to the +		host. The host must wait for this timeout before sending +		a subsequent DFU_GET_STATUS request to the device. + +		DFU_MANIFEST_POLL_TIMEOUT +		Poll timeout [ms], which the device sends to the host when +		entering dfuMANIFEST state. Host waits this timeout, before +		sending again an USB request to the device. +  - Journaling Flash filesystem support:  		CONFIG_JFFS2_NAND, CONFIG_JFFS2_NAND_OFF, CONFIG_JFFS2_NAND_SIZE,  		CONFIG_JFFS2_NAND_DEV diff --git a/drivers/dfu/dfu.c b/drivers/dfu/dfu.c index 1aced26c4..f94c412aa 100644 --- a/drivers/dfu/dfu.c +++ b/drivers/dfu/dfu.c @@ -218,10 +218,6 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)  			ret = tret;  	} -	/* end? */ -	if (size == 0) -		ret = dfu_flush(dfu, buf, size, blk_seq_num); -  	return ret = 0 ? size : ret;  } diff --git a/drivers/usb/gadget/f_dfu.c b/drivers/usb/gadget/f_dfu.c index a045864d7..de75ff133 100644 --- a/drivers/usb/gadget/f_dfu.c +++ b/drivers/usb/gadget/f_dfu.c @@ -164,9 +164,14 @@ static void dnload_request_complete(struct usb_ep *ep, struct usb_request *req)  	dfu_write(dfu_get_entity(f_dfu->altsetting), req->buf,  		  req->length, f_dfu->blk_seq_num); +} -	if (req->length == 0) -		puts("DOWNLOAD ... OK\nCtrl+C to exit ...\n"); +static void dnload_request_flush(struct usb_ep *ep, struct usb_request *req) +{ +	struct f_dfu *f_dfu = req->context; + +	dfu_flush(dfu_get_entity(f_dfu->altsetting), req->buf, +		  req->length, f_dfu->blk_seq_num);  }  static void handle_getstatus(struct usb_request *req) @@ -174,19 +179,22 @@ static void handle_getstatus(struct usb_request *req)  	struct dfu_status *dstat = (struct dfu_status *)req->buf;  	struct f_dfu *f_dfu = req->context; +	dfu_set_poll_timeout(dstat, 0); +  	switch (f_dfu->dfu_state) {  	case DFU_STATE_dfuDNLOAD_SYNC:  	case DFU_STATE_dfuDNBUSY:  		f_dfu->dfu_state = DFU_STATE_dfuDNLOAD_IDLE;  		break;  	case DFU_STATE_dfuMANIFEST_SYNC: +		f_dfu->dfu_state = DFU_STATE_dfuMANIFEST;  		break; +	case DFU_STATE_dfuMANIFEST: +		dfu_set_poll_timeout(dstat, DFU_MANIFEST_POLL_TIMEOUT);  	default:  		break;  	} -	dfu_set_poll_timeout(dstat, 0); -  	if (f_dfu->poll_timeout)  		if (!(f_dfu->blk_seq_num %  		      (dfu_get_buf_size() / DFU_USB_BUFSIZ))) @@ -446,10 +454,11 @@ static int state_dfu_manifest_sync(struct f_dfu *f_dfu,  	switch (ctrl->bRequest) {  	case USB_REQ_DFU_GETSTATUS:  		/* We're MainfestationTolerant */ -		f_dfu->dfu_state = DFU_STATE_dfuIDLE; +		f_dfu->dfu_state = DFU_STATE_dfuMANIFEST;  		handle_getstatus(req);  		f_dfu->blk_seq_num = 0;  		value = RET_STAT_LEN; +		req->complete = dnload_request_flush;  		break;  	case USB_REQ_DFU_GETSTATE:  		handle_getstate(req); @@ -463,6 +472,33 @@ static int state_dfu_manifest_sync(struct f_dfu *f_dfu,  	return value;  } +static int state_dfu_manifest(struct f_dfu *f_dfu, +			      const struct usb_ctrlrequest *ctrl, +			      struct usb_gadget *gadget, +			      struct usb_request *req) +{ +	int value = 0; + +	switch (ctrl->bRequest) { +	case USB_REQ_DFU_GETSTATUS: +		/* We're MainfestationTolerant */ +		f_dfu->dfu_state = DFU_STATE_dfuIDLE; +		handle_getstatus(req); +		f_dfu->blk_seq_num = 0; +		value = RET_STAT_LEN; +		puts("DOWNLOAD ... OK\nCtrl+C to exit ...\n"); +		break; +	case USB_REQ_DFU_GETSTATE: +		handle_getstate(req); +		break; +	default: +		f_dfu->dfu_state = DFU_STATE_dfuERROR; +		value = RET_STALL; +		break; +	} +	return value; +} +  static int state_dfu_upload_idle(struct f_dfu *f_dfu,  				 const struct usb_ctrlrequest *ctrl,  				 struct usb_gadget *gadget, @@ -539,7 +575,7 @@ static dfu_state_fn dfu_state[] = {  	state_dfu_dnbusy,        /* DFU_STATE_dfuDNBUSY */  	state_dfu_dnload_idle,   /* DFU_STATE_dfuDNLOAD_IDLE */  	state_dfu_manifest_sync, /* DFU_STATE_dfuMANIFEST_SYNC */ -	NULL,                    /* DFU_STATE_dfuMANIFEST */ +	state_dfu_manifest,	 /* DFU_STATE_dfuMANIFEST */  	NULL,                    /* DFU_STATE_dfuMANIFEST_WAIT_RST */  	state_dfu_upload_idle,   /* DFU_STATE_dfuUPLOAD_IDLE */  	state_dfu_error          /* DFU_STATE_dfuERROR */ diff --git a/include/dfu.h b/include/dfu.h index 272a24576..6c71ecbe3 100644 --- a/include/dfu.h +++ b/include/dfu.h @@ -80,6 +80,9 @@ static inline unsigned int get_mmc_blk_size(int dev)  #ifndef DFU_DEFAULT_POLL_TIMEOUT  #define DFU_DEFAULT_POLL_TIMEOUT 0  #endif +#ifndef DFU_MANIFEST_POLL_TIMEOUT +#define DFU_MANIFEST_POLL_TIMEOUT	DFU_DEFAULT_POLL_TIMEOUT +#endif  struct dfu_entity {  	char			name[DFU_NAME_SIZE]; |