diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/dfu/dfu.c | 49 | 
1 files changed, 41 insertions, 8 deletions
| diff --git a/drivers/dfu/dfu.c b/drivers/dfu/dfu.c index 6af6890d0..e429d7479 100644 --- a/drivers/dfu/dfu.c +++ b/drivers/dfu/dfu.c @@ -20,6 +20,7 @@   */  #include <common.h> +#include <errno.h>  #include <malloc.h>  #include <mmc.h>  #include <fat.h> @@ -41,8 +42,34 @@ static int dfu_find_alt_num(const char *s)  	return ++i;  } -static unsigned char __aligned(CONFIG_SYS_CACHELINE_SIZE) -				     dfu_buf[DFU_DATA_BUF_SIZE]; +static unsigned char *dfu_buf; +static unsigned long dfu_buf_size = CONFIG_SYS_DFU_DATA_BUF_SIZE; + +static unsigned char *dfu_free_buf(void) +{ +	free(dfu_buf); +	dfu_buf = NULL; +	return dfu_buf; +} + +static unsigned char *dfu_get_buf(void) +{ +	char *s; + +	if (dfu_buf != NULL) +		return dfu_buf; + +	s = getenv("dfu_bufsiz"); +	dfu_buf_size = s ? (unsigned long)simple_strtol(s, NULL, 16) : +			CONFIG_SYS_DFU_DATA_BUF_SIZE; + +	dfu_buf = memalign(CONFIG_SYS_CACHELINE_SIZE, dfu_buf_size); +	if (dfu_buf == NULL) +		printf("%s: Could not memalign 0x%lx bytes\n", +		       __func__, dfu_buf_size); + +	return dfu_buf; +}  static int dfu_write_buffer_drain(struct dfu_entity *dfu)  { @@ -87,8 +114,10 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)  		dfu->offset = 0;  		dfu->bad_skip = 0;  		dfu->i_blk_seq_num = 0; -		dfu->i_buf_start = dfu_buf; -		dfu->i_buf_end = dfu_buf + sizeof(dfu_buf); +		dfu->i_buf_start = dfu_get_buf(); +		if (dfu->i_buf_start == NULL) +			return -ENOMEM; +		dfu->i_buf_end = dfu_get_buf() + dfu_buf_size;  		dfu->i_buf = dfu->i_buf_start;  		dfu->inited = 1; @@ -148,11 +177,12 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)  		printf("\nDFU complete CRC32: 0x%08x\n", dfu->crc);  		/* clear everything */ +		dfu_free_buf();  		dfu->crc = 0;  		dfu->offset = 0;  		dfu->i_blk_seq_num = 0;  		dfu->i_buf_start = dfu_buf; -		dfu->i_buf_end = dfu_buf + sizeof(dfu_buf); +		dfu->i_buf_end = dfu_buf;  		dfu->i_buf = dfu->i_buf_start;  		dfu->inited = 0; @@ -229,8 +259,10 @@ int dfu_read(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)  		dfu->i_blk_seq_num = 0;  		dfu->crc = 0;  		dfu->offset = 0; -		dfu->i_buf_start = dfu_buf; -		dfu->i_buf_end = dfu_buf + sizeof(dfu_buf); +		dfu->i_buf_start = dfu_get_buf(); +		if (dfu->i_buf_start == NULL) +			return -ENOMEM; +		dfu->i_buf_end = dfu_get_buf() + dfu_buf_size;  		dfu->i_buf = dfu->i_buf_start;  		dfu->b_left = 0; @@ -257,11 +289,12 @@ int dfu_read(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)  		debug("%s: %s CRC32: 0x%x\n", __func__, dfu->name, dfu->crc);  		puts("\nUPLOAD ... done\nCtrl+C to exit ...\n"); +		dfu_free_buf();  		dfu->i_blk_seq_num = 0;  		dfu->crc = 0;  		dfu->offset = 0;  		dfu->i_buf_start = dfu_buf; -		dfu->i_buf_end = dfu_buf + sizeof(dfu_buf); +		dfu->i_buf_end = dfu_buf;  		dfu->i_buf = dfu->i_buf_start;  		dfu->b_left = 0; |