X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fflash%2Fnor%2Fkinetis.c;h=a392a17ba30df713abedd9d5cca5a03d9e510066;hp=42677a385c6482bf45d71f4c6c3443cdfab75acd;hb=08da1b4258a971a068401849c65b9d40f08ee44c;hpb=46101959a6e8325549ff7e0165d27a32f6baec34 diff --git a/src/flash/nor/kinetis.c b/src/flash/nor/kinetis.c index 42677a385c..a392a17ba3 100644 --- a/src/flash/nor/kinetis.c +++ b/src/flash/nor/kinetis.c @@ -31,6 +31,7 @@ #include "config.h" #endif +#include "jtag/interface.h" #include "imp.h" #include #include @@ -298,6 +299,11 @@ COMMAND_HANDLER(kinetis_mdm_mass_erase) struct cortex_m_common *cortex_m = target_to_cm(target); struct adiv5_dap *dap = cortex_m->armv7m.arm.dap; + if (!dap) { + LOG_ERROR("Cannot perform mass erase with a high-level adapter"); + return ERROR_FAIL; + } + int retval; const uint8_t original_ap = dap->ap_current; @@ -308,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); @@ -359,12 +373,16 @@ 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; } static const uint32_t kinetis_known_mdm_ids[] = { - 0x001C0020, /* KL26Z */ + 0x001C0000, /* Kinetis-K Series */ + 0x001C0020, /* Kinetis-L/M/V/E Series */ }; /* @@ -379,6 +397,11 @@ COMMAND_HANDLER(kinetis_check_flash_security_status) struct cortex_m_common *cortex_m = target_to_cm(target); struct adiv5_dap *dap = cortex_m->armv7m.arm.dap; + if (!dap) { + LOG_WARNING("Cannot check flash security status with a high-level adapter"); + return ERROR_OK; + } + uint32_t val; int retval; const uint8_t origninal_ap = dap->ap_current; @@ -437,10 +460,10 @@ COMMAND_HANDLER(kinetis_check_flash_security_status) LOG_WARNING("*********** ATTENTION! ATTENTION! ATTENTION! ATTENTION! **********"); LOG_WARNING("**** ****"); LOG_WARNING("**** Your Kinetis MCU is in secured state, which means that, ****"); - LOG_WARNING("**** with exeption for very basic communication, JTAG/SWD ****"); + LOG_WARNING("**** with exception for very basic communication, JTAG/SWD ****"); LOG_WARNING("**** interface will NOT work. In order to restore its ****"); LOG_WARNING("**** functionality please issue 'kinetis mdm mass_erase' ****"); - LOG_WARNING("**** command, power cycle the MCU and restart openocd. ****"); + LOG_WARNING("**** command, power cycle the MCU and restart OpenOCD. ****"); LOG_WARNING("**** ****"); LOG_WARNING("*********** ATTENTION! ATTENTION! ATTENTION! ATTENTION! **********"); } else {