diff options
author | Andrey Smirnov <andrew.smirnov@gmail.com> | 2014-02-08 12:23:45 -0800 |
---|---|---|
committer | Paul Fertser <fercerpav@gmail.com> | 2014-03-29 08:43:52 +0000 |
commit | 34db6b9c0aaf048fe5ef81cccf2c645b9b4ac456 (patch) | |
tree | 9a949536688c667bb3f2dd9ab9fedadd9fb49fde /src/flash | |
parent | e0f0ce965dbcaadb703a16706d70fd4ba0da90df (diff) | |
download | riscv-openocd-34db6b9c0aaf048fe5ef81cccf2c645b9b4ac456.zip riscv-openocd-34db6b9c0aaf048fe5ef81cccf2c645b9b4ac456.tar.gz riscv-openocd-34db6b9c0aaf048fe5ef81cccf2c645b9b4ac456.tar.bz2 |
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>
Diffstat (limited to 'src/flash')
-rw-r--r-- | src/flash/nor/at91samd.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/flash/nor/at91samd.c b/src/flash/nor/at91samd.c index acda3bb..c0be3f7 100644 --- a/src/flash/nor/at91samd.c +++ b/src/flash/nor/at91samd.c @@ -375,6 +375,18 @@ static int samd_erase(struct flash_bank *bank, int first, int last) 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 * 'address' in the Flash. */ 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; 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 */ res = samd_erase_row(bank, address); if (res != ERROR_OK) @@ -411,6 +435,8 @@ static int samd_write_row(struct flash_bank *bank, uint32_t address, buf += chip->page_size; } + sector->is_erased = 0; + return res; } |