aboutsummaryrefslogtreecommitdiff
path: root/src/target/nds32.c
diff options
context:
space:
mode:
authorTomas Vanek <vanekt@fbl.cz>2015-03-15 19:09:15 +0100
committerFreddie Chopin <freddie.chopin@gmail.com>2016-05-05 07:42:24 +0100
commit88258042730260a763115d0718bd027a7708200d (patch)
tree1764bb802c68b726ba27791cc759f8705ad56b7f /src/target/nds32.c
parentbaf08b0a1ad656434583e3c102a350d4cf885bf9 (diff)
downloadriscv-openocd-88258042730260a763115d0718bd027a7708200d.zip
riscv-openocd-88258042730260a763115d0718bd027a7708200d.tar.gz
riscv-openocd-88258042730260a763115d0718bd027a7708200d.tar.bz2
target: improve robustness of reset command
Before this change jim_target_reset() checked examined state of a target and failed without calling .assert_reset in particular target layer (and without comprehensible warning to user). Cortex-M target (which refuses access to DP under active SRST): If connection is lost then reset process fails before asserting SRST and connection with MCU is not restored. This resulted in: 1) A lot of Cortex-M MCUs required use of reset button or cycling power after firmware blocked SWD access somehow (sleep, misconfigured clock etc). If firmware blocks SWD access early during initialization, a MCU could become completely inaccessible by SWD. 2) If OpenOCD is (re)started and a MCU is in a broken state unresponsive to SWD, reset command does not work even if it could help to restore communication. Hopefully this scenario is not possible under full JTAG. jim_target_reset() in target.c now does not check examined state and delegates this task to a particular target. All targets have been checked and xx_assert_reset() (or xx_deassert_reset()) procedures were changed to check examined state if needed. Targets except arm11, cortex_a and cortex_m just fail if target is not examined although it may be possible to use at least hw reset. Left as TODO for developers familiar with these targets. cortex_m_assert_reset(): memory access errors are stored instead of immediate returning them to a higher level. Errors from less important reads/writes are ignored. Requested reset always leads to a configured action. arm11_assert_reset() just asserts hw reset in case of not examined target. cortex_a_assert_reset() works as usual in case of not examined target. Change-Id: I84fa869f4f58e2fa83b6ea75de84440d9dc3d929 Signed-off-by: Tomas Vanek <vanekt@fbl.cz> Reviewed-on: http://openocd.zylin.com/2606 Tested-by: jenkins Reviewed-by: Matthias Welwarsky <matthias@welwarsky.de> Reviewed-by: Paul Fertser <fercerpav@gmail.com>
Diffstat (limited to 'src/target/nds32.c')
-rw-r--r--src/target/nds32.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/target/nds32.c b/src/target/nds32.c
index b6c5f61..afdafef 100644
--- a/src/target/nds32.c
+++ b/src/target/nds32.c
@@ -2199,6 +2199,13 @@ int nds32_assert_reset(struct target *target)
struct aice_port_s *aice = target_to_aice(target);
struct nds32_cpu_version *cpu_version = &(nds32->cpu_version);
+ /* TODO: apply hw reset signal in not examined state */
+ if (!(target_was_examined(target))) {
+ LOG_WARNING("Reset is not asserted because the target is not examined.");
+ LOG_WARNING("Use a reset button or power cycle the target.");
+ return ERROR_TARGET_NOT_EXAMINED;
+ }
+
if (target->reset_halt) {
if ((nds32->soft_reset_halt)
|| (nds32->edm.version < 0x51)