mirror of
https://github.com/u-boot/u-boot.git
synced 2025-05-01 08:55:34 +00:00
dfu: make data buffer size configurable
Dfu transfer uses a buffer before writing data to the raw storage device. Make the size (in bytes) of this buffer configurable through environment variable "dfu_bufsiz". Defaut value is configurable through CONFIG_SYS_DFU_DATA_BUF_SIZE Signed-off-by: Heiko Schocher <hs@denx.de> Cc: Pantelis Antoniou <panto@antoniou-consulting.com> Cc: Tom Rini <trini@ti.com> Cc: Lukasz Majewski <l.majewski@samsung.com> Cc: Kyungmin Park <kyungmin.park@samsung.com> Cc: Marek Vasut <marex@denx.de> Cc: Wolfgang Denk <wd@denx.de> Acked-by: Tom Rini <trini@ti.com>
This commit is contained in:
parent
e6bf18dba2
commit
e7e75c70c5
3 changed files with 50 additions and 9 deletions
6
README
6
README
|
@ -1392,6 +1392,12 @@ The following options need to be configured:
|
||||||
CONFIG_DFU_NAND
|
CONFIG_DFU_NAND
|
||||||
This enables support for exposing NAND devices via DFU.
|
This enables support for exposing NAND devices via DFU.
|
||||||
|
|
||||||
|
CONFIG_SYS_DFU_DATA_BUF_SIZE
|
||||||
|
Dfu transfer uses a buffer before writing data to the
|
||||||
|
raw storage device. Make the size (in bytes) of this buffer
|
||||||
|
configurable. The size of this buffer is also configurable
|
||||||
|
through the "dfu_bufsiz" environment variable.
|
||||||
|
|
||||||
CONFIG_SYS_DFU_MAX_FILE_SIZE
|
CONFIG_SYS_DFU_MAX_FILE_SIZE
|
||||||
When updating files rather than the raw storage device,
|
When updating files rather than the raw storage device,
|
||||||
we use a static buffer to copy the file into and then write
|
we use a static buffer to copy the file into and then write
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
|
#include <errno.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <mmc.h>
|
#include <mmc.h>
|
||||||
#include <fat.h>
|
#include <fat.h>
|
||||||
|
@ -41,8 +42,34 @@ static int dfu_find_alt_num(const char *s)
|
||||||
return ++i;
|
return ++i;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned char __aligned(CONFIG_SYS_CACHELINE_SIZE)
|
static unsigned char *dfu_buf;
|
||||||
dfu_buf[DFU_DATA_BUF_SIZE];
|
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)
|
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->offset = 0;
|
||||||
dfu->bad_skip = 0;
|
dfu->bad_skip = 0;
|
||||||
dfu->i_blk_seq_num = 0;
|
dfu->i_blk_seq_num = 0;
|
||||||
dfu->i_buf_start = dfu_buf;
|
dfu->i_buf_start = dfu_get_buf();
|
||||||
dfu->i_buf_end = dfu_buf + sizeof(dfu_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->i_buf = dfu->i_buf_start;
|
||||||
|
|
||||||
dfu->inited = 1;
|
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);
|
printf("\nDFU complete CRC32: 0x%08x\n", dfu->crc);
|
||||||
|
|
||||||
/* clear everything */
|
/* clear everything */
|
||||||
|
dfu_free_buf();
|
||||||
dfu->crc = 0;
|
dfu->crc = 0;
|
||||||
dfu->offset = 0;
|
dfu->offset = 0;
|
||||||
dfu->i_blk_seq_num = 0;
|
dfu->i_blk_seq_num = 0;
|
||||||
dfu->i_buf_start = dfu_buf;
|
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->i_buf = dfu->i_buf_start;
|
||||||
|
|
||||||
dfu->inited = 0;
|
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->i_blk_seq_num = 0;
|
||||||
dfu->crc = 0;
|
dfu->crc = 0;
|
||||||
dfu->offset = 0;
|
dfu->offset = 0;
|
||||||
dfu->i_buf_start = dfu_buf;
|
dfu->i_buf_start = dfu_get_buf();
|
||||||
dfu->i_buf_end = dfu_buf + sizeof(dfu_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->i_buf = dfu->i_buf_start;
|
||||||
dfu->b_left = 0;
|
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);
|
debug("%s: %s CRC32: 0x%x\n", __func__, dfu->name, dfu->crc);
|
||||||
puts("\nUPLOAD ... done\nCtrl+C to exit ...\n");
|
puts("\nUPLOAD ... done\nCtrl+C to exit ...\n");
|
||||||
|
|
||||||
|
dfu_free_buf();
|
||||||
dfu->i_blk_seq_num = 0;
|
dfu->i_blk_seq_num = 0;
|
||||||
dfu->crc = 0;
|
dfu->crc = 0;
|
||||||
dfu->offset = 0;
|
dfu->offset = 0;
|
||||||
dfu->i_buf_start = dfu_buf;
|
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->i_buf = dfu->i_buf_start;
|
||||||
dfu->b_left = 0;
|
dfu->b_left = 0;
|
||||||
|
|
||||||
|
|
|
@ -68,7 +68,9 @@ static inline unsigned int get_mmc_blk_size(int dev)
|
||||||
|
|
||||||
#define DFU_NAME_SIZE 32
|
#define DFU_NAME_SIZE 32
|
||||||
#define DFU_CMD_BUF_SIZE 128
|
#define DFU_CMD_BUF_SIZE 128
|
||||||
#define DFU_DATA_BUF_SIZE (1024*1024*8) /* 8 MiB */
|
#ifndef CONFIG_SYS_DFU_DATA_BUF_SIZE
|
||||||
|
#define CONFIG_SYS_DFU_DATA_BUF_SIZE (1024*1024*8) /* 8 MiB */
|
||||||
|
#endif
|
||||||
#ifndef CONFIG_SYS_DFU_MAX_FILE_SIZE
|
#ifndef CONFIG_SYS_DFU_MAX_FILE_SIZE
|
||||||
#define CONFIG_SYS_DFU_MAX_FILE_SIZE (4 << 20) /* 4 MiB */
|
#define CONFIG_SYS_DFU_MAX_FILE_SIZE (4 << 20) /* 4 MiB */
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue