kinetis : Fix broken check for mass erase.
authorPer Ekman <pekenator@gmail.com>
Thu, 24 Oct 2013 09:54:32 +0000 (11:54 +0200)
committerSpencer Oliver <spen@spen-soft.co.uk>
Fri, 8 Nov 2013 15:09:00 +0000 (15:09 +0000)
If the flash is not ready (MDM_STAT_FREADY is 0) then
dap_syssec_kinetis_mdmap() would act as if the MDM_STAT_SYSSEC bit was
set and erase the flash. Wait until MDM_STAT_FREADY is set before
checking the MDM_STAT_SYSSEC bit.

Change-Id: I5c3352f625599016625ed9be8787033f49bfacea
Signed-off-by: Per Ekman <pekenator@gmail.com>
Reviewed-on: http://openocd.zylin.com/1762
Tested-by: jenkins
Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
src/target/arm_adi_v5.c

index ba8e380158da1f70d3157534502e43e5b8f5eecb..0ca0ecc64f1798ff6e497c5caf202758aee04fb5 100644 (file)
@@ -671,14 +671,16 @@ int dap_syssec_kinetis_mdmap(struct adiv5_dap *dap)
         * it's important that the device is out of
         * reset here
         */
-       retval = dap_queue_ap_read(dap, MDM_REG_STAT, &val);
-       if (retval != ERROR_OK)
-               return retval;
-       dap_run(dap);
+       do {
+               retval = dap_queue_ap_read(dap, MDM_REG_STAT, &val);
+               if (retval != ERROR_OK)
+                       return retval;
+               dap_run(dap);
 
-       LOG_DEBUG("MDM_REG_STAT %08" PRIX32, val);
+               LOG_DEBUG("MDM_REG_STAT %08" PRIX32, val);
+       } while (!(val & MDM_STAT_FREADY));
 
-       if ((val & (MDM_STAT_SYSSEC|MDM_STAT_FREADY)) != (MDM_STAT_FREADY)) {
+       if ((val & MDM_STAT_SYSSEC)) {
                LOG_DEBUG("MDMAP: system is secured, masserase needed");
 
                if (!(val & MDM_STAT_FMEEN))