]> git.sur5r.net Git - openocd/commit
target: improve robustness of reset command
authorTomas Vanek <vanekt@fbl.cz>
Sun, 15 Mar 2015 18:09:15 +0000 (19:09 +0100)
committerFreddie Chopin <freddie.chopin@gmail.com>
Thu, 5 May 2016 06:42:24 +0000 (07:42 +0100)
commit88258042730260a763115d0718bd027a7708200d
tree1764bb802c68b726ba27791cc759f8705ad56b7f
parentbaf08b0a1ad656434583e3c102a350d4cf885bf9
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>
src/target/arm11.c
src/target/arm7_9_common.c
src/target/cortex_a.c
src/target/cortex_m.c
src/target/feroceon.c
src/target/mips_m4k.c
src/target/nds32.c
src/target/target.c
src/target/xscale.c