flash: nor: mdr: fix verification problem with 1986VE1T or 1986VE3T
authorAndrey Skvortsov <andrej.skvortzov@gmail.com>
Wed, 25 May 2016 10:11:18 +0000 (13:11 +0300)
committerPaul Fertser <fercerpav@gmail.com>
Tue, 2 Aug 2016 16:49:18 +0000 (17:49 +0100)
1986VE1T and 1986VE3T have issue with flash acceleration engine described
in their errata (issue 0007).
After programming flash acceleration engine's buffer contains old data,
and therefore first read data are wrong. Because of this verification after
programming fails always. Recommended workaround for the issue is to flush
flash accelerator's buffer. To do so it's necessary to read at least 64
bytes of flash through accelerator.

Reading bytes through JTAG using default_flash_read doesn't help.
It seems that reading should be done by uC itself.

Change-Id: I18ef464a68ad5c5b16d3933f31ca61f8e2e7cca3
Signed-off-by: Andrey Skvortsov <andrej.skvortzov@gmail.com>
Reviewed-on: http://openocd.zylin.com/3509
Tested-by: jenkins
Reviewed-by: Paul Fertser <fercerpav@gmail.com>
src/flash/nor/mdr.c

index 68eaf13760043b4497bce59bc0339210b106e871..374cb6f2972c78ff51312e0ead27d7284e9bbc6a 100644 (file)
@@ -469,6 +469,13 @@ free_buffer:
        if (new_buffer)
                free(new_buffer);
 
+       /* read some bytes bytes to flush buffer in flash accelerator.
+        * See errata for 1986VE1T and 1986VE3. Error 0007 */
+       if ((retval == ERROR_OK) && (!mdr_info->mem_type)) {
+               uint32_t tmp;
+               target_checksum_memory(bank->target, bank->base, 64, &tmp);
+       }
+
        return retval;
 }