diff options
| -rw-r--r-- | drivers/dfu/dfu_nand.c | 38 | ||||
| -rw-r--r-- | include/dfu.h | 2 | 
2 files changed, 38 insertions, 2 deletions
| diff --git a/drivers/dfu/dfu_nand.c b/drivers/dfu/dfu_nand.c index 2a01cc11b..0ec12cff2 100644 --- a/drivers/dfu/dfu_nand.c +++ b/drivers/dfu/dfu_nand.c @@ -136,11 +136,43 @@ static int dfu_read_medium_nand(struct dfu_entity *dfu, u64 offset, void *buf,  	return ret;  } +static int dfu_flush_medium_nand(struct dfu_entity *dfu) +{ +	int ret = 0; + +	/* in case of ubi partition, erase rest of the partition */ +	if (dfu->data.nand.ubi) { +		nand_info_t *nand; +		nand_erase_options_t opts; + +		if (nand_curr_device < 0 || +		    nand_curr_device >= CONFIG_SYS_MAX_NAND_DEVICE || +		    !nand_info[nand_curr_device].name) { +			printf("%s: invalid nand device\n", __func__); +			return -1; +		} + +		nand = &nand_info[nand_curr_device]; + +		memset(&opts, 0, sizeof(opts)); +		opts.offset = dfu->data.nand.start + dfu->offset + +				dfu->bad_skip; +		opts.length = dfu->data.nand.start + +				dfu->data.nand.size - opts.offset; +		ret = nand_erase_opts(nand, &opts); +		if (ret != 0) +			printf("Failure erase: %d\n", ret); +	} + +	return ret; +} +  int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s)  {  	char *st;  	int ret, dev, part; +	dfu->data.nand.ubi = 0;  	dfu->dev_type = DFU_DEV_NAND;  	st = strsep(&s, " ");  	if (!strcmp(st, "raw")) { @@ -148,7 +180,7 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s)  		dfu->data.nand.start = simple_strtoul(s, &s, 16);  		s++;  		dfu->data.nand.size = simple_strtoul(s, &s, 16); -	} else if (!strcmp(st, "part")) { +	} else if ((!strcmp(st, "part")) || (!strcmp(st, "partubi"))) {  		char mtd_id[32];  		struct mtd_device *mtd_dev;  		u8 part_num; @@ -173,7 +205,8 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s)  		dfu->data.nand.start = pi->offset;  		dfu->data.nand.size = pi->size; - +		if (!strcmp(st, "partubi")) +			dfu->data.nand.ubi = 1;  	} else {  		printf("%s: Memory layout (%s) not supported!\n", __func__, st);  		return -1; @@ -181,6 +214,7 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s)  	dfu->read_medium = dfu_read_medium_nand;  	dfu->write_medium = dfu_write_medium_nand; +	dfu->flush_medium = dfu_flush_medium_nand;  	/* initial state */  	dfu->inited = 0; diff --git a/include/dfu.h b/include/dfu.h index 1d4006de8..47b90559d 100644 --- a/include/dfu.h +++ b/include/dfu.h @@ -47,6 +47,8 @@ struct nand_internal_data {  	unsigned int dev;  	unsigned int part; +	/* for nand/ubi use */ +	unsigned int ubi;  };  static inline unsigned int get_mmc_blk_size(int dev) |