summaryrefslogtreecommitdiff
path: root/src/flash/stm32x.c
diff options
context:
space:
mode:
authormlu <mlu@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2009-04-29 21:08:39 +0000
committermlu <mlu@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2009-04-29 21:08:39 +0000
commit7d61acebd81166af9f5c8c39bee84d79c221b013 (patch)
tree52985f471c59d4771a2091c5ff85ea6fee4e6476 /src/flash/stm32x.c
parent851f9b2d6c462c8c0699e6ee178e7a95169dcf7b (diff)
downloadopenocd+libswd-7d61acebd81166af9f5c8c39bee84d79c221b013.tar.gz
openocd+libswd-7d61acebd81166af9f5c8c39bee84d79c221b013.tar.bz2
openocd+libswd-7d61acebd81166af9f5c8c39bee84d79c221b013.tar.xz
openocd+libswd-7d61acebd81166af9f5c8c39bee84d79c221b013.zip
Clear FLASH_SR error flags after flash errors to avoid reset befor further flash operations.
git-svn-id: svn://svn.berlios.de/openocd/trunk@1571 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src/flash/stm32x.c')
-rw-r--r--src/flash/stm32x.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/flash/stm32x.c b/src/flash/stm32x.c
index 2fa49c89..8b872391 100644
--- a/src/flash/stm32x.c
+++ b/src/flash/stm32x.c
@@ -120,6 +120,7 @@ static u32 stm32x_get_flash_status(flash_bank_t *bank)
static u32 stm32x_wait_status_busy(flash_bank_t *bank, int timeout)
{
+ target_t *target = bank->target;
u32 status;
/* wait for busy to clear */
@@ -128,7 +129,11 @@ static u32 stm32x_wait_status_busy(flash_bank_t *bank, int timeout)
LOG_DEBUG("status: 0x%x", status);
alive_sleep(1);
}
-
+ /* Clear but report errors */
+ if (status & (FLASH_WRPRTERR|FLASH_PGERR))
+ {
+ target_write_u32(target, STM32_FLASH_SR, FLASH_WRPRTERR|FLASH_PGERR);
+ }
return status;
}
@@ -568,6 +573,8 @@ static int stm32x_write_block(struct flash_bank_s *bank, u8 *buffer, u32 offset,
if (buf_get_u32(reg_params[3].value, 0, 32) & FLASH_PGERR)
{
LOG_ERROR("flash memory not erased before writing");
+ /* Clear but report errors */
+ target_write_u32(target, STM32_FLASH_SR, FLASH_PGERR);
retval = ERROR_FLASH_OPERATION_FAILED;
break;
}
@@ -575,6 +582,8 @@ static int stm32x_write_block(struct flash_bank_s *bank, u8 *buffer, u32 offset,
if (buf_get_u32(reg_params[3].value, 0, 32) & FLASH_WRPRTERR)
{
LOG_ERROR("flash memory write protected");
+ /* Clear but report errors */
+ target_write_u32(target, STM32_FLASH_SR, FLASH_WRPRTERR);
retval = ERROR_FLASH_OPERATION_FAILED;
break;
}