nrf51: fix UICR erase
nrf51_erase_page() checks for (sector->offset == NRF51_UICR_BASE) to determine if the UICR should be erased. However, sector->offset for the UICR bank is set to 0 in nrf51_probe, so this code is never hit. Attempting to erase UICR ends up erasing the first flash sector. Use bank->base instead to determine if UICR is being erased. Change-Id: Ie5df0f9732f23662085ae2b713d64968cd801472 Signed-off-by: Jim Paris <jim@jtan.com> Reviewed-on: http://openocd.zylin.com/2362 Tested-by: jenkins Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
This commit is contained in:
parent
6412b0656b
commit
f30bb58644
|
@ -562,14 +562,16 @@ static int nrf51_erase_all(struct nrf51_info *chip)
|
|||
0x00000001);
|
||||
}
|
||||
|
||||
static int nrf51_erase_page(struct nrf51_info *chip, struct flash_sector *sector)
|
||||
static int nrf51_erase_page(struct flash_bank *bank,
|
||||
struct nrf51_info *chip,
|
||||
struct flash_sector *sector)
|
||||
{
|
||||
int res;
|
||||
|
||||
if (sector->is_protected)
|
||||
return ERROR_FAIL;
|
||||
|
||||
if (sector->offset == NRF51_UICR_BASE) {
|
||||
if (bank->base == NRF51_UICR_BASE) {
|
||||
uint32_t ppfc;
|
||||
res = target_read_u32(chip->target, NRF51_FICR_PPFC,
|
||||
&ppfc);
|
||||
|
@ -635,7 +637,7 @@ static int nrf51_write_page(struct flash_bank *bank, uint32_t offset, const uint
|
|||
goto error;
|
||||
|
||||
if (!sector->is_erased) {
|
||||
res = nrf51_erase_page(chip, sector);
|
||||
res = nrf51_erase_page(bank, chip, sector);
|
||||
if (res != ERROR_OK) {
|
||||
LOG_ERROR("Failed to erase sector @ 0x%08"PRIx32, sector->offset);
|
||||
goto error;
|
||||
|
@ -672,7 +674,7 @@ static int nrf51_erase(struct flash_bank *bank, int first, int last)
|
|||
|
||||
/* For each sector to be erased */
|
||||
for (int s = first; s <= last && res == ERROR_OK; s++)
|
||||
res = nrf51_erase_page(chip, &bank->sectors[s]);
|
||||
res = nrf51_erase_page(bank, chip, &bank->sectors[s]);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
@ -777,7 +779,7 @@ static int nrf51_uicr_flash_write(struct flash_bank *bank,
|
|||
return res;
|
||||
|
||||
if (!sector->is_erased) {
|
||||
res = nrf51_erase_page(chip, sector);
|
||||
res = nrf51_erase_page(bank, chip, sector);
|
||||
if (res != ERROR_OK)
|
||||
return res;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue