flash/nor/stm32f1x: unify flash error reporting
stm32x_wait_status_busy() has two side effects in case of flash programming error: - reports error - clears error bit in status register Use stm32x_wait_status_busy() to report also flash error during target algo flash write. While on it use more descriptive error codes in stm32x_wait_status_busy(). Change-Id: I6e1cffc2aa5411b918a23ed62d5194910888a9d1 Signed-off-by: Tomas Vanek <vanekt@fbl.cz> Reviewed-on: https://review.openocd.org/c/openocd/+/6709 Tested-by: jenkins Reviewed-by: Tarek BOCHKATI <tarek.bouchkati@gmail.com>
This commit is contained in:
parent
e3f4ea0b57
commit
b801452d42
|
@ -185,19 +185,19 @@ static int stm32x_wait_status_busy(struct flash_bank *bank, int timeout)
|
|||
break;
|
||||
if (timeout-- <= 0) {
|
||||
LOG_ERROR("timed out waiting for flash");
|
||||
return ERROR_FAIL;
|
||||
return ERROR_FLASH_BUSY;
|
||||
}
|
||||
alive_sleep(1);
|
||||
}
|
||||
|
||||
if (status & FLASH_WRPRTERR) {
|
||||
LOG_ERROR("stm32x device protected");
|
||||
retval = ERROR_FAIL;
|
||||
retval = ERROR_FLASH_PROTECTED;
|
||||
}
|
||||
|
||||
if (status & FLASH_PGERR) {
|
||||
LOG_ERROR("stm32x device programming failed");
|
||||
retval = ERROR_FAIL;
|
||||
LOG_ERROR("stm32x device programming failed / flash not erased");
|
||||
retval = ERROR_FLASH_OPERATION_FAILED;
|
||||
}
|
||||
|
||||
/* Clear but report errors */
|
||||
|
@ -522,20 +522,18 @@ static int stm32x_write_block_async(struct flash_bank *bank, const uint8_t *buff
|
|||
&armv7m_info);
|
||||
|
||||
if (retval == ERROR_FLASH_OPERATION_FAILED) {
|
||||
LOG_ERROR("flash write failed at address 0x%"PRIx32,
|
||||
/* Actually we just need to check for programming errors
|
||||
* stm32x_wait_status_busy also reports error and clears status bits.
|
||||
*
|
||||
* Target algo returns flash status in r0 only if properly finished.
|
||||
* It is safer to re-read status register.
|
||||
*/
|
||||
int retval2 = stm32x_wait_status_busy(bank, 5);
|
||||
if (retval2 != ERROR_OK)
|
||||
retval = retval2;
|
||||
|
||||
LOG_ERROR("flash write failed just before address 0x%"PRIx32,
|
||||
buf_get_u32(reg_params[4].value, 0, 32));
|
||||
|
||||
if (buf_get_u32(reg_params[0].value, 0, 32) & FLASH_PGERR) {
|
||||
LOG_ERROR("flash memory not erased before writing");
|
||||
/* Clear but report errors */
|
||||
target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_SR), FLASH_PGERR);
|
||||
}
|
||||
|
||||
if (buf_get_u32(reg_params[0].value, 0, 32) & FLASH_WRPRTERR) {
|
||||
LOG_ERROR("flash memory write protected");
|
||||
/* Clear but report errors */
|
||||
target_write_u32(target, stm32x_get_flash_reg(bank, STM32_FLASH_SR), FLASH_WRPRTERR);
|
||||
}
|
||||
}
|
||||
|
||||
for (unsigned int i = 0; i < ARRAY_SIZE(reg_params); i++)
|
||||
|
|
Loading…
Reference in New Issue