Also add locking after option write, it was missing at all.
Change-Id: I0227c6a74866f0fe8e40aa58616f0b3115ad5af0
Signed-off-by: Tomas Vanek <vanekt@fbl.cz>
Reviewed-on: http://openocd.zylin.com/5361
Tested-by: jenkins
Reviewed-by: Andreas Bolsch <hyphen0break@gmail.com>
Reviewed-by: Tarek BOCHKATI <tarek.bouchkati@gmail.com>
static int stm32l4_write_option(struct flash_bank *bank, uint32_t reg_offset, uint32_t value, uint32_t mask)
{
uint32_t optiondata;
static int stm32l4_write_option(struct flash_bank *bank, uint32_t reg_offset, uint32_t value, uint32_t mask)
{
uint32_t optiondata;
- int retval = stm32l4_read_flash_reg(bank, reg_offset, &optiondata);
+ retval = stm32l4_read_flash_reg(bank, reg_offset, &optiondata);
if (retval != ERROR_OK)
return retval;
retval = stm32l4_unlock_reg(bank);
if (retval != ERROR_OK)
if (retval != ERROR_OK)
return retval;
retval = stm32l4_unlock_reg(bank);
if (retval != ERROR_OK)
retval = stm32l4_unlock_option_reg(bank);
if (retval != ERROR_OK)
retval = stm32l4_unlock_option_reg(bank);
if (retval != ERROR_OK)
optiondata = (optiondata & ~mask) | (value & mask);
retval = stm32l4_write_flash_reg(bank, reg_offset, optiondata);
if (retval != ERROR_OK)
optiondata = (optiondata & ~mask) | (value & mask);
retval = stm32l4_write_flash_reg(bank, reg_offset, optiondata);
if (retval != ERROR_OK)
retval = stm32l4_write_flash_reg(bank, STM32_FLASH_CR, FLASH_OPTSTRT);
if (retval != ERROR_OK)
retval = stm32l4_write_flash_reg(bank, STM32_FLASH_CR, FLASH_OPTSTRT);
if (retval != ERROR_OK)
retval = stm32l4_wait_status_busy(bank, FLASH_ERASE_TIMEOUT);
retval = stm32l4_wait_status_busy(bank, FLASH_ERASE_TIMEOUT);
+
+err_lock:
+ retval2 = stm32l4_write_flash_reg(bank, STM32_FLASH_CR, FLASH_LOCK | FLASH_OPTLOCK);
+
if (retval != ERROR_OK)
return retval;
if (retval != ERROR_OK)
return retval;
}
static int stm32l4_protect_check(struct flash_bank *bank)
}
static int stm32l4_protect_check(struct flash_bank *bank)
{
struct stm32l4_flash_bank *stm32l4_info = bank->driver_priv;
int i;
{
struct stm32l4_flash_bank *stm32l4_info = bank->driver_priv;
int i;
assert(first < bank->num_sectors);
assert(last < bank->num_sectors);
assert(first < bank->num_sectors);
assert(last < bank->num_sectors);
retval = stm32l4_unlock_reg(bank);
if (retval != ERROR_OK)
retval = stm32l4_unlock_reg(bank);
if (retval != ERROR_OK)
erase_flags |= i << FLASH_PAGE_SHIFT;
retval = stm32l4_write_flash_reg(bank, STM32_FLASH_CR, erase_flags);
if (retval != ERROR_OK)
erase_flags |= i << FLASH_PAGE_SHIFT;
retval = stm32l4_write_flash_reg(bank, STM32_FLASH_CR, erase_flags);
if (retval != ERROR_OK)
retval = stm32l4_wait_status_busy(bank, FLASH_ERASE_TIMEOUT);
if (retval != ERROR_OK)
retval = stm32l4_wait_status_busy(bank, FLASH_ERASE_TIMEOUT);
if (retval != ERROR_OK)
bank->sectors[i].is_erased = 1;
}
bank->sectors[i].is_erased = 1;
}
- retval = stm32l4_write_flash_reg(bank, STM32_FLASH_CR, FLASH_LOCK);
+err_lock:
+ retval2 = stm32l4_write_flash_reg(bank, STM32_FLASH_CR, FLASH_LOCK);
+
if (retval != ERROR_OK)
return retval;
if (retval != ERROR_OK)
return retval;
}
static int stm32l4_protect(struct flash_bank *bank, int set, int first, int last)
}
static int stm32l4_protect(struct flash_bank *bank, int set, int first, int last)
retval = stm32l4_unlock_reg(bank);
if (retval != ERROR_OK)
retval = stm32l4_unlock_reg(bank);
if (retval != ERROR_OK)
retval = stm32l4_write_block(bank, buffer, offset, count / 8);
retval = stm32l4_write_block(bank, buffer, offset, count / 8);
retval2 = stm32l4_write_flash_reg(bank, STM32_FLASH_CR, FLASH_LOCK);
if (retval != ERROR_OK) {
retval2 = stm32l4_write_flash_reg(bank, STM32_FLASH_CR, FLASH_LOCK);
if (retval != ERROR_OK) {
static int stm32l4_mass_erase(struct flash_bank *bank)
{
static int stm32l4_mass_erase(struct flash_bank *bank)
{
struct target *target = bank->target;
struct stm32l4_flash_bank *stm32l4_info = bank->driver_priv;
struct target *target = bank->target;
struct stm32l4_flash_bank *stm32l4_info = bank->driver_priv;
retval = stm32l4_unlock_reg(bank);
if (retval != ERROR_OK)
retval = stm32l4_unlock_reg(bank);
if (retval != ERROR_OK)
/* mass erase flash memory */
retval = stm32l4_wait_status_busy(bank, FLASH_ERASE_TIMEOUT / 10);
if (retval != ERROR_OK)
/* mass erase flash memory */
retval = stm32l4_wait_status_busy(bank, FLASH_ERASE_TIMEOUT / 10);
if (retval != ERROR_OK)
retval = stm32l4_write_flash_reg(bank, STM32_FLASH_CR, action);
if (retval != ERROR_OK)
retval = stm32l4_write_flash_reg(bank, STM32_FLASH_CR, action);
if (retval != ERROR_OK)
retval = stm32l4_write_flash_reg(bank, STM32_FLASH_CR, action | FLASH_STRT);
if (retval != ERROR_OK)
retval = stm32l4_write_flash_reg(bank, STM32_FLASH_CR, action | FLASH_STRT);
if (retval != ERROR_OK)
retval = stm32l4_wait_status_busy(bank, FLASH_ERASE_TIMEOUT);
retval = stm32l4_wait_status_busy(bank, FLASH_ERASE_TIMEOUT);
- if (retval != ERROR_OK)
- return retval;
- retval = stm32l4_write_flash_reg(bank, STM32_FLASH_CR, FLASH_LOCK);
+err_lock:
+ retval2 = stm32l4_write_flash_reg(bank, STM32_FLASH_CR, FLASH_LOCK);
+
if (retval != ERROR_OK)
return retval;
if (retval != ERROR_OK)
return retval;
}
COMMAND_HANDLER(stm32l4_handle_mass_erase_command)
}
COMMAND_HANDLER(stm32l4_handle_mass_erase_command)