target: ensure aligned erases
This commit is contained in:
parent
89a5c2a8a2
commit
3d3dd21d48
|
@ -270,14 +270,17 @@ int target_flash_erase(target *t, target_addr_t addr, size_t len)
|
||||||
while (len) {
|
while (len) {
|
||||||
target_flash_s *f = target_flash_for_addr(t, addr);
|
target_flash_s *f = target_flash_for_addr(t, addr);
|
||||||
if (!f) {
|
if (!f) {
|
||||||
DEBUG_WARN("Erase stopped at 0x%06" PRIx32 "\n", addr);
|
DEBUG_WARN("Requested address is outside the valid range 0x%06" PRIx32 "\n", addr);
|
||||||
return ret;
|
return 1;
|
||||||
}
|
}
|
||||||
size_t tmptarget = MIN(addr + len, f->start + f->length);
|
|
||||||
size_t tmplen = tmptarget - addr;
|
const target_addr_t local_start_addr = addr & ~(f->blocksize - 1U);
|
||||||
ret |= f->erase(f, addr, tmplen);
|
const target_addr_t local_end_addr = local_start_addr + f->blocksize;
|
||||||
addr += tmplen;
|
|
||||||
len -= tmplen;
|
ret |= f->erase(f, local_start_addr, f->blocksize);
|
||||||
|
|
||||||
|
len -= MIN(local_end_addr - addr, len);
|
||||||
|
addr = local_end_addr;
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -553,16 +556,8 @@ static bool target_cmd_range_erase(target *const t, const int argc, const char *
|
||||||
}
|
}
|
||||||
const uint32_t addr = strtoul(argv[1], NULL, 0);
|
const uint32_t addr = strtoul(argv[1], NULL, 0);
|
||||||
const uint32_t length = strtoul(argv[2], NULL, 0);
|
const uint32_t length = strtoul(argv[2], NULL, 0);
|
||||||
target_flash_s *flash = target_flash_for_addr(t, addr);
|
|
||||||
|
|
||||||
if (flash == NULL) {
|
return target_flash_erase(t, addr, length) == 0;
|
||||||
gdb_out("Requested address is outside the valid range for this target");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const target_addr_t aligned_addr = addr & ~(flash->blocksize - 1U);
|
|
||||||
const uint32_t aligned_length = length + (addr - aligned_addr);
|
|
||||||
return target_flash_erase(t, aligned_addr, aligned_length) == 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Accessor functions */
|
/* Accessor functions */
|
||||||
|
|
Loading…
Reference in New Issue