flash/nor/stm32h7x: check OPTCHANGEERR
authorChristopher Head <chead@zaber.com>
Mon, 27 Jan 2020 22:48:15 +0000 (14:48 -0800)
committerTomas Vanek <vanekt@fbl.cz>
Sun, 23 Feb 2020 12:27:35 +0000 (12:27 +0000)
Without this, a failed attempt to change option bytes will silently
appear to succeed but without actually changing the option bytes
(confusingly, the option bytes will still read back as if they had been
changed until a reboot as well!).

Change-Id: Id529c6c384a8a16be75f5702310670d99d8fac79
Signed-off-by: Christopher Head <chead@zaber.com>
Reviewed-on: http://openocd.zylin.com/5418
Tested-by: jenkins
Reviewed-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
src/flash/nor/stm32h7x.c

index 7ce369be3a8604957cde75e1a77a357be2f9876b..152a154bd08c5c70fb0342164df1b2d1bd3bf0a2 100644 (file)
@@ -83,6 +83,7 @@
 #define OPT_BSY        (1 << 0)
 #define OPT_RDP_POS    8
 #define OPT_RDP_MASK   (0xff << OPT_RDP_POS)
+#define OPT_OPTCHANGEERR (1 << 30)
 
 /* FLASH_OPTCCR register bits */
 #define OPT_CLR_OPTCHANGEERR (1 << 30)
@@ -343,8 +344,8 @@ static int stm32x_write_option(struct flash_bank *bank, uint32_t reg_offset, uin
 
        /* wait for completion */
        int timeout = FLASH_ERASE_TIMEOUT;
+       uint32_t status;
        for (;;) {
-               uint32_t status;
                retval = stm32x_read_flash_reg(bank, FLASH_OPTSR_CUR, &status);
                if (retval != ERROR_OK) {
                        LOG_ERROR("stm32x_options_program: failed to read FLASH_OPTSR_CUR");
@@ -361,6 +362,12 @@ static int stm32x_write_option(struct flash_bank *bank, uint32_t reg_offset, uin
                alive_sleep(1);
        }
 
+       /* check for failure */
+       if (status & OPT_OPTCHANGEERR) {
+               LOG_ERROR("error changing option bytes (OPTCHANGEERR=1)");
+               retval = ERROR_FLASH_OPERATION_FAILED;
+       }
+
 flash_options_lock:
        retval2 = stm32x_lock_option_reg(bank);
        if (retval2 != ERROR_OK)