From 9e001244da2a2c472038ce1af0df32cfb2329569 Mon Sep 17 00:00:00 2001 From: Andreas Fritiofson Date: Sat, 6 Oct 2012 00:13:24 +0200 Subject: [PATCH] stm32f1x: Increase options erase timeout The erase time for the option byte page is not directly specified but is assumed to be the same as the other pages (or mass erase) which is 20 to 40 ms. The current timeout value is 10 which means 10 ms plus the time to poll the status flag that many times. With faster interfaces or drivers (such as when using the ftdi driver instead of the ft2232 driver) the adapter delay is not enough in some cases, unless the jtag freq is reduced as a workaround. The result is a "timed out waiting for flash" error when trying to write the options. Increase the timeout to a minimum of 100 ms, which is in line with the other erase timeouts. Also make defines of both the erase and the program timeouts. Change-Id: Ia86e71505033c52b60ef30092000689fbb547a18 Signed-off-by: Andreas Fritiofson Reviewed-on: http://openocd.zylin.com/902 Tested-by: jenkins Reviewed-by: Spencer Oliver --- src/flash/nor/stm32f1x.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/flash/nor/stm32f1x.c b/src/flash/nor/stm32f1x.c index 9d093607fd..d021bbfb38 100644 --- a/src/flash/nor/stm32f1x.c +++ b/src/flash/nor/stm32f1x.c @@ -102,6 +102,11 @@ #define KEY1 0x45670123 #define KEY2 0xCDEF89AB +/* timeout values */ + +#define FLASH_WRITE_TIMEOUT 10 +#define FLASH_ERASE_TIMEOUT 100 + struct stm32x_options { uint16_t RDP; uint16_t user_options; @@ -283,7 +288,7 @@ static int stm32x_erase_options(struct flash_bank *bank) if (retval != ERROR_OK) return retval; - retval = stm32x_wait_status_busy(bank, 10); + retval = stm32x_wait_status_busy(bank, FLASH_ERASE_TIMEOUT); if (retval != ERROR_OK) return retval; @@ -327,7 +332,7 @@ static int stm32x_write_options(struct flash_bank *bank) if (retval != ERROR_OK) return retval; - retval = stm32x_wait_status_busy(bank, 10); + retval = stm32x_wait_status_busy(bank, FLASH_WRITE_TIMEOUT); if (retval != ERROR_OK) return retval; @@ -336,7 +341,7 @@ static int stm32x_write_options(struct flash_bank *bank) if (retval != ERROR_OK) return retval; - retval = stm32x_wait_status_busy(bank, 10); + retval = stm32x_wait_status_busy(bank, FLASH_WRITE_TIMEOUT); if (retval != ERROR_OK) return retval; @@ -345,7 +350,7 @@ static int stm32x_write_options(struct flash_bank *bank) if (retval != ERROR_OK) return retval; - retval = stm32x_wait_status_busy(bank, 10); + retval = stm32x_wait_status_busy(bank, FLASH_WRITE_TIMEOUT); if (retval != ERROR_OK) return retval; @@ -354,7 +359,7 @@ static int stm32x_write_options(struct flash_bank *bank) if (retval != ERROR_OK) return retval; - retval = stm32x_wait_status_busy(bank, 10); + retval = stm32x_wait_status_busy(bank, FLASH_WRITE_TIMEOUT); if (retval != ERROR_OK) return retval; @@ -363,7 +368,7 @@ static int stm32x_write_options(struct flash_bank *bank) if (retval != ERROR_OK) return retval; - retval = stm32x_wait_status_busy(bank, 10); + retval = stm32x_wait_status_busy(bank, FLASH_WRITE_TIMEOUT); if (retval != ERROR_OK) return retval; @@ -372,7 +377,7 @@ static int stm32x_write_options(struct flash_bank *bank) if (retval != ERROR_OK) return retval; - retval = stm32x_wait_status_busy(bank, 10); + retval = stm32x_wait_status_busy(bank, FLASH_WRITE_TIMEOUT); if (retval != ERROR_OK) return retval; @@ -487,7 +492,7 @@ static int stm32x_erase(struct flash_bank *bank, int first, int last) if (retval != ERROR_OK) return retval; - retval = stm32x_wait_status_busy(bank, 100); + retval = stm32x_wait_status_busy(bank, FLASH_ERASE_TIMEOUT); if (retval != ERROR_OK) return retval; @@ -1475,7 +1480,7 @@ static int stm32x_mass_erase(struct flash_bank *bank) if (retval != ERROR_OK) return retval; - retval = stm32x_wait_status_busy(bank, 100); + retval = stm32x_wait_status_busy(bank, FLASH_ERASE_TIMEOUT); if (retval != ERROR_OK) return retval; -- 2.30.2