This is an automated email from Gerrit.

Tomas Vanek ([email protected]) just uploaded a new patch set to Gerrit, which you 
can find at http://openocd.zylin.com/4794

-- gerrit

commit 0205f3e588bbfe50ad7d74268a2bc15ff1d54b27
Author: Tomas Vanek <[email protected]>
Date:   Fri Dec 7 17:00:12 2018 +0100

    target/cortex_m: do not use VECTRESET on Cortex-M0, M0+ and M1
    
    Cortex-M0, M0+ and M1 do not support VECTRESET bit in AIRCR.
    Without this change the 'reset' command silently fails if VECTRESET
    is requested.
    
    Detect these cores, show warning if VECTRESET is about to use
    and use SYSRESETREQ instead.
    
    Change-Id: Ief174373e3ef0e6b287c57911c0aca4dfa8209f2
    Signed-off-by: Tomas Vanek <[email protected]>

diff --git a/doc/openocd.texi b/doc/openocd.texi
index 776160a..a190a31 100644
--- a/doc/openocd.texi
+++ b/doc/openocd.texi
@@ -9001,11 +9001,15 @@ otherwise fallback to @option{vectreset}.
 @item @option{sysresetreq} use NVIC SYSRESETREQ to reset system.
 @item @option{vectreset} use NVIC VECTRESET to reset system.
 @end itemize
-Using @option{vectreset} is a safe option for all current Cortex-M cores.
+
+Using @option{vectreset} is a safe option for Cortex-M3, M4 and M7 cores.
 This however has the disadvantage of only resetting the core, all peripherals
-are unaffected. A solution would be to use a @code{reset-init} event handler 
to manually reset
-the peripherals.
+are unaffected. A solution would be to use a @code{reset-init} event handler
+to manually reset the peripherals.
 @xref{targetevents,,Target Events}.
+
+Cortex-M0, M0+ and M1 do not support @option{vectreset}, use 
@option{sysresetreq}
+instead.
 @end deffn
 
 @subsection ARMv8-A specific commands
diff --git a/src/target/cortex_m.c b/src/target/cortex_m.c
index 07fea51..9893403 100644
--- a/src/target/cortex_m.c
+++ b/src/target/cortex_m.c
@@ -1041,10 +1041,17 @@ static int cortex_m_assert_reset(struct target *target)
                retval = ERROR_OK;
        } else {
                /* Use a standard Cortex-M3 software reset mechanism.
-                * We default to using VECRESET as it is supported on all 
current cores.
+                * We default to using VECRESET as it is supported on all 
current cores
+                * (except Cortex-M0, M0+ and M1 which support SYSRESETREQ 
only!)
                 * This has the disadvantage of not resetting the peripherals, 
so a
                 * reset-init event handler is needed to perform any peripheral 
resets.
                 */
+               if (!cortex_m->vectreset_supported
+                               && reset_config == CORTEX_M_RESET_VECTRESET) {
+                       reset_config = CORTEX_M_RESET_SYSRESETREQ;
+                       LOG_WARNING("VECTRESET is not supported on your 
Cortex-M core, using SYSRESETREQ instead");
+               }
+
                LOG_DEBUG("Using Cortex-M %s", (reset_config == 
CORTEX_M_RESET_SYSRESETREQ)
                        ? "SYSRESETREQ" : "VECTRESET");
 
@@ -2027,6 +2034,9 @@ int cortex_m_examine(struct target *target)
                }
                LOG_DEBUG("cpuid: 0x%8.8" PRIx32 "", cpuid);
 
+               /* VECTRESET is not supported on Cortex-M0, M0+ and M1 */
+               cortex_m->vectreset_supported = i > 1;
+
                if (i == 4) {
                        target_read_u32(target, MVFR0, &mvfr0);
                        target_read_u32(target, MVFR1, &mvfr1);
@@ -2418,8 +2428,14 @@ COMMAND_HANDLER(handle_cortex_m_reset_config_command)
        if (CMD_ARGC > 0) {
                if (strcmp(*CMD_ARGV, "sysresetreq") == 0)
                        cortex_m->soft_reset_config = 
CORTEX_M_RESET_SYSRESETREQ;
-               else if (strcmp(*CMD_ARGV, "vectreset") == 0)
-                       cortex_m->soft_reset_config = CORTEX_M_RESET_VECTRESET;
+
+               else if (strcmp(*CMD_ARGV, "vectreset") == 0) {
+                       if (target_was_examined(target)
+                                       && !cortex_m->vectreset_supported)
+                               LOG_WARNING("VECTRESET is not supported on your 
Cortex-M core!");
+                       else
+                               cortex_m->soft_reset_config = 
CORTEX_M_RESET_VECTRESET;
+               }
        }
 
        switch (cortex_m->soft_reset_config) {
diff --git a/src/target/cortex_m.h b/src/target/cortex_m.h
index 2daf4cb..22d9735 100644
--- a/src/target/cortex_m.h
+++ b/src/target/cortex_m.h
@@ -184,6 +184,7 @@ struct cortex_m_common {
        struct reg_cache *dwt_cache;
 
        enum cortex_m_soft_reset_config soft_reset_config;
+       bool vectreset_supported;
 
        enum cortex_m_isrmasking_mode isrmasking_mode;
 

-- 


_______________________________________________
OpenOCD-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to