aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGareth McMullin2015-03-26 22:18:18 -0700
committerGareth McMullin2015-04-03 21:21:30 -0700
commit36f749fed92597e0469909e5399146359e5fdfdf (patch)
tree76064ee3871e7d262f4c55dc4b4b0b5f69cce306
parent7202db586038843d1d4f01403ce6e1285ac3520c (diff)
Fix flash buffer alignment in target layer.
-rw-r--r--src/include/target.h2
-rw-r--r--src/target.c10
2 files changed, 11 insertions, 1 deletions
diff --git a/src/include/target.h b/src/include/target.h
index bcabc23..f49bc58 100644
--- a/src/include/target.h
+++ b/src/include/target.h
@@ -131,6 +131,8 @@ struct target_flash {
flash_done_func done;
target *t;
struct target_flash *next;
+ int align;
+ uint8_t erased;
};
struct target_s {
diff --git a/src/target.c b/src/target.c
index 6b05deb..3ab59bc 100644
--- a/src/target.c
+++ b/src/target.c
@@ -189,7 +189,15 @@ int target_flash_write(target *t,
while (len) {
struct target_flash *f = flash_for_addr(t, dest);
size_t tmplen = MIN(len, f->length - (dest % f->length));
- ret |= f->write(f, dest, src, tmplen);
+ if (f->align > 1) {
+ uint32_t offset = dest % f->align;
+ uint8_t data[ALIGN(offset + len, f->align)];
+ memset(data, f->erased, sizeof(data));
+ memcpy((uint8_t *)data + offset, src, len);
+ ret |= f->write(f, dest - offset, data, sizeof(data));
+ } else {
+ ret |= f->write(f, dest, src, tmplen);
+ }
src += tmplen;
len -= tmplen;
}