flash/nor/kinetis: pull SRST low during mass erase
authorPaul Fertser <fercerpav@gmail.com>
Fri, 5 Dec 2014 10:18:36 +0000 (13:18 +0300)
committerPaul Fertser <fercerpav@gmail.com>
Fri, 30 Jan 2015 08:54:25 +0000 (08:54 +0000)
Mass erase operation might be impacted by different factors,
apparently the most reliable way is to do it while asserting the chip
reset line.

Change-Id: Id6ab57eaec86e402ffdf4f5c8843e7735640f03e
Signed-off-by: Paul Fertser <fercerpav@gmail.com>
Reviewed-on: http://openocd.zylin.com/2424
Tested-by: jenkins
Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
src/flash/nor/kinetis.c

index dce098ecfea726117cedcca7f382e20a25748c0a..a392a17ba30df713abedd9d5cca5a03d9e510066 100644 (file)
@@ -31,6 +31,7 @@
 #include "config.h"
 #endif
 
+#include "jtag/interface.h"
 #include "imp.h"
 #include <helper/binarybuffer.h>
 #include <target/algorithm.h>
@@ -313,6 +314,14 @@ COMMAND_HANDLER(kinetis_mdm_mass_erase)
         * Reset Request bit in the MDM-AP control register after
         * establishing communication...
         */
+
+       /* assert SRST */
+       if (jtag_get_reset_config() & RESET_HAS_SRST)
+               adapter_assert_reset();
+       else
+               LOG_WARNING("Attempting mass erase without hardware reset. This is not reliable; "
+                           "it's recommended you connect SRST and use ``reset_config srst_only''.");
+
        dap_ap_select(dap, 1);
 
        retval = kinetis_mdm_write_register(dap, MDM_REG_CTRL, MEM_CTRL_SYS_RES_REQ);
@@ -364,6 +373,9 @@ COMMAND_HANDLER(kinetis_mdm_mass_erase)
        if (retval != ERROR_OK)
                return retval;
 
+       if (jtag_get_reset_config() & RESET_HAS_SRST)
+               adapter_deassert_reset();
+
        dap_ap_select(dap, original_ap);
        return ERROR_OK;
 }