at91samd: Bail early if trying to write to protected sector
Bail early if trying to write to protected sector also mark the sector we are writing to as dirty. Change-Id: I892f83461792e1cc2dcccade7aa65717831a6805 Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com> Reviewed-on: http://openocd.zylin.com/2025 Tested-by: jenkins Reviewed-by: Paul Fertser <fercerpav@gmail.com>
This commit is contained in:
parent
e0f0ce965d
commit
34db6b9c0a
|
@ -375,6 +375,18 @@ static int samd_erase(struct flash_bank *bank, int first, int last)
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct flash_sector *samd_find_sector_by_address(struct flash_bank *bank, uint32_t address)
|
||||||
|
{
|
||||||
|
struct samd_info *chip = (struct samd_info *)bank->driver_priv;
|
||||||
|
|
||||||
|
for (int i = 0; i < bank->num_sectors; i++) {
|
||||||
|
if (bank->sectors[i].offset <= address &&
|
||||||
|
address < bank->sectors[i].offset + chip->sector_size)
|
||||||
|
return &bank->sectors[i];
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* Write an entire row (four pages) from host buffer 'buf' to row-aligned
|
/* Write an entire row (four pages) from host buffer 'buf' to row-aligned
|
||||||
* 'address' in the Flash. */
|
* 'address' in the Flash. */
|
||||||
static int samd_write_row(struct flash_bank *bank, uint32_t address,
|
static int samd_write_row(struct flash_bank *bank, uint32_t address,
|
||||||
|
@ -383,6 +395,18 @@ static int samd_write_row(struct flash_bank *bank, uint32_t address,
|
||||||
int res;
|
int res;
|
||||||
struct samd_info *chip = (struct samd_info *)bank->driver_priv;
|
struct samd_info *chip = (struct samd_info *)bank->driver_priv;
|
||||||
|
|
||||||
|
struct flash_sector *sector = samd_find_sector_by_address(bank, address);
|
||||||
|
|
||||||
|
if (!sector) {
|
||||||
|
LOG_ERROR("Can't find sector corresponding to address 0x%08" PRIx32, address);
|
||||||
|
return ERROR_FLASH_OPERATION_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sector->is_protected) {
|
||||||
|
LOG_ERROR("Trying to write to a protected sector at 0x%08" PRIx32, address);
|
||||||
|
return ERROR_FLASH_OPERATION_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
/* Erase the row that we'll be writing to */
|
/* Erase the row that we'll be writing to */
|
||||||
res = samd_erase_row(bank, address);
|
res = samd_erase_row(bank, address);
|
||||||
if (res != ERROR_OK)
|
if (res != ERROR_OK)
|
||||||
|
@ -411,6 +435,8 @@ static int samd_write_row(struct flash_bank *bank, uint32_t address,
|
||||||
buf += chip->page_size;
|
buf += chip->page_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sector->is_erased = 0;
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue