|
@@ -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)
|
|
|
|
- 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)
|
|
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_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->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_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->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;
|
|
|
|
|