summaryrefslogtreecommitdiff
path: root/include/dfu.h
diff options
context:
space:
mode:
authorPantelis Antoniou <panto@antoniou-consulting.com>2013-03-14 05:32:48 +0000
committerMarek Vasut <marex@denx.de>2013-04-10 13:42:05 +0200
commitea2453d56b8860dbd18a3c517531ffc8dcb5c839 (patch)
tree86b1dfe3a0e0a9f70f2edec54c66628229234948 /include/dfu.h
parentb3ba6e94b8298422aa98961fdd30890f3dd83cc5 (diff)
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>
Diffstat (limited to 'include/dfu.h')
-rw-r--r--include/dfu.h24
1 files changed, 22 insertions, 2 deletions
diff --git a/include/dfu.h b/include/dfu.h
index 784d8a442c..527e69f90b 100644
--- a/include/dfu.h
+++ b/include/dfu.h
@@ -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);