1
0
mirror of https://xff.cz/git/u-boot/ synced 2025-09-01 08:42:12 +02:00

dfu: Support larger than memory transfers.

Previously we didn't support upload/download larger than available
memory.  This is pretty bad when you have to update your root filesystem
for example.

This patch removes that limitation (and the crashes when you transfered
any file larger than 4MB) by making raw image writes be done in chunks
and making file maximum size be configurable.

The sequence number is a 16 bit counter; make sure we handle rollover
correctly. This fixes the wrong transfers for large (> 256MB) images.

Also utilize a variable to handle initialization, so that we don't rely
on just the counter sent by the host.

Signed-off-by: Pantelis Antoniou <panto@antoniou-consulting.com>
Signed-off-by: Tom Rini <trini@ti.com>
This commit is contained in:
Pantelis Antoniou
2013-03-14 05:32:48 +00:00
committed by Marek Vasut
parent b3ba6e94b8
commit ea2453d56b
4 changed files with 299 additions and 99 deletions

View File

@@ -60,6 +60,9 @@ static inline unsigned int get_mmc_blk_size(int dev)
#define DFU_NAME_SIZE 32
#define DFU_CMD_BUF_SIZE 128
#define DFU_DATA_BUF_SIZE (1024*1024*8) /* 8 MiB */
#ifndef CONFIG_SYS_DFU_MAX_FILE_SIZE
#define CONFIG_SYS_DFU_MAX_FILE_SIZE (4 << 20) /* 4 MiB */
#endif
struct dfu_entity {
char name[DFU_NAME_SIZE];
@@ -73,10 +76,27 @@ struct dfu_entity {
struct mmc_internal_data mmc;
} data;
int (*read_medium)(struct dfu_entity *dfu, void *buf, long *len);
int (*write_medium)(struct dfu_entity *dfu, void *buf, long *len);
int (*read_medium)(struct dfu_entity *dfu,
u64 offset, void *buf, long *len);
int (*write_medium)(struct dfu_entity *dfu,
u64 offset, void *buf, long *len);
int (*flush_medium)(struct dfu_entity *dfu);
struct list_head list;
/* on the fly state */
u32 crc;
u64 offset;
int i_blk_seq_num;
u8 *i_buf;
u8 *i_buf_start;
u8 *i_buf_end;
long r_left;
long b_left;
unsigned int inited:1;
};
int dfu_config_entities(char *s, char *interface, int num);