@@ -242,11 +242,12 @@ static char *dfu_get_hash_algo(void)
static int dfu_write_buffer_drain(struct dfu_entity *dfu)
{
- long w_size;
+ long w_size, w_size_req;
int ret;
/* flush size? */
w_size = dfu->i_buf - dfu->i_buf_start;
+ w_size_req = w_size;
if (w_size == 0)
return 0;
@@ -264,6 +265,9 @@ static int dfu_write_buffer_drain(struct dfu_entity *dfu)
/* update offset */
dfu->offset += w_size;
+ /* store remaining bytes */
+ dfu->b_left = w_size_req - w_size;
+
puts("#");
return ret;
@@ -402,6 +406,9 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int *size, int blk_seq_num)
}
}
+ /* if not all bytes have been written, adjust size */
+ *size -= dfu->b_left;
+
return 0;
}
@@ -38,13 +38,25 @@ static int dfu_write_medium_sf(struct dfu_entity *dfu,
u64 offset, void *buf, long *len)
{
u64 start = dfu->data.sf.start + offset;
+ u32 sector_offset;
+ u64 tmp = start;
int ret;
+ /* Calculate the offset into the sector for unaligned writes */
+ sector_offset = do_div(tmp, dfu->data.sf.dev->sector_size);
+
ret = spi_flash_erase(dfu->data.sf.dev, find_sector(dfu, start),
dfu->data.sf.dev->sector_size);
if (ret)
return ret;
+ /*
+ * In case of an unaligned start address, only write until the
+ * next sector boundary
+ */
+ if (sector_offset)
+ *len = dfu->data.sf.dev->sector_size - sector_offset;
+
ret = spi_flash_write(dfu->data.sf.dev, start, *len, buf);
if (ret)
return ret;