|
@@ -18,6 +18,7 @@
|
|
|
|
|
|
static unsigned char *dfu_file_buf;
|
|
|
static long dfu_file_buf_len;
|
|
|
+static long dfu_file_buf_filled;
|
|
|
|
|
|
static int mmc_access_part(struct dfu_entity *dfu, struct mmc *mmc, int part)
|
|
|
{
|
|
@@ -230,9 +231,12 @@ long dfu_get_medium_size_mmc(struct dfu_entity *dfu)
|
|
|
return dfu->data.mmc.lba_size * dfu->data.mmc.lba_blk_size;
|
|
|
case DFU_FS_FAT:
|
|
|
case DFU_FS_EXT4:
|
|
|
+ dfu_file_buf_filled = -1;
|
|
|
ret = mmc_file_op(DFU_OP_SIZE, dfu, NULL, &len);
|
|
|
if (ret < 0)
|
|
|
return ret;
|
|
|
+ if (len > CONFIG_SYS_DFU_MAX_FILE_SIZE)
|
|
|
+ return -1;
|
|
|
return len;
|
|
|
default:
|
|
|
printf("%s: Layout (%s) not (yet) supported!\n", __func__,
|
|
@@ -241,6 +245,27 @@ long dfu_get_medium_size_mmc(struct dfu_entity *dfu)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static int mmc_file_unbuffer(struct dfu_entity *dfu, u64 offset, void *buf,
|
|
|
+ long *len)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+ long file_len;
|
|
|
+
|
|
|
+ if (dfu_file_buf_filled == -1) {
|
|
|
+ ret = mmc_file_op(DFU_OP_READ, dfu, dfu_file_buf, &file_len);
|
|
|
+ if (ret < 0)
|
|
|
+ return ret;
|
|
|
+ dfu_file_buf_filled = file_len;
|
|
|
+ }
|
|
|
+ if (offset + *len > dfu_file_buf_filled)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ /* Add to the current buffer. */
|
|
|
+ memcpy(buf, dfu_file_buf + offset, *len);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
int dfu_read_medium_mmc(struct dfu_entity *dfu, u64 offset, void *buf,
|
|
|
long *len)
|
|
|
{
|
|
@@ -252,7 +277,7 @@ int dfu_read_medium_mmc(struct dfu_entity *dfu, u64 offset, void *buf,
|
|
|
break;
|
|
|
case DFU_FS_FAT:
|
|
|
case DFU_FS_EXT4:
|
|
|
- ret = mmc_file_op(DFU_OP_READ, dfu, buf, len);
|
|
|
+ ret = mmc_file_unbuffer(dfu, offset, buf, len);
|
|
|
break;
|
|
|
default:
|
|
|
printf("%s: Layout (%s) not (yet) supported!\n", __func__,
|