add overridable Tcl "init_reset"

This abstracts the "jtag arp_init-reset" call into a method
called from OpenOCD startup and reset processing.

Platforms which have different requirements for how such hard
resets must be performed can now override "init_reset" instead
of needing to rebuild custom hacked versions of the server.

Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
This commit is contained in:
David Brownell 2009-10-08 23:51:50 -07:00
parent 5b352c9e79
commit 6160a946ec
2 changed files with 23 additions and 8 deletions

1
NEWS
View File

@ -8,6 +8,7 @@ JTAG Layer:
New reset_config options for SRST gating the JTAG clock (or not) New reset_config options for SRST gating the JTAG clock (or not)
TAP declaration no longer requires ircapture and mask attributes TAP declaration no longer requires ircapture and mask attributes
New "post-reset" event handler for TAP-invariant setup code New "post-reset" event handler for TAP-invariant setup code
Overridable Tcl "init_reset" and "jtag_init" procedures
Target Layer: Target Layer:
New commands for use with Cortex-M3 processors: New commands for use with Cortex-M3 processors:

View File

@ -134,6 +134,23 @@ proc ocd_gdb_restart {target_id} {
reset halt reset halt
} }
# This reset logic may be overridden by board/target/... scripts as needed
# to provide a reset that, if possible, is close to a power-up reset.
#
# Exit requirements include: (a) JTAG must be working, (b) the scan
# chain was validated with "jtag arp_init" (or equivalent), (c) nothing
# stays in reset. No TAP-specific scans were performed. It's OK if
# some targets haven't been reset yet; they may need TAP-specific scans.
#
# The "mode" values include: halt, init, run (from "reset" command);
# startup (at OpenOCD server startup, when JTAG may not yet work); and
# potentially more (for reset types like cold, warm, etc)
proc init_reset { mode } {
jtag arp_init-reset
}
global in_process_reset global in_process_reset
set in_process_reset 0 set in_process_reset 0
@ -189,10 +206,7 @@ proc ocd_process_reset_inner { MODE } {
# Use TRST or TMS/TCK operations to reset all the tap controllers. # Use TRST or TMS/TCK operations to reset all the tap controllers.
# TAP reset events get reported; they might enable some taps. # TAP reset events get reported; they might enable some taps.
# init_reset $MODE
# REVISIT arp_init-reset pulses SRST (if it can) with TRST active;
# but SRST events aren't reported (unlike "jtag arp_reset", below)
jtag arp_init-reset
# Examine all targets on enabled taps. # Examine all targets on enabled taps.
foreach t $targets { foreach t $targets {
@ -361,11 +375,11 @@ proc capture_catch {a} {
} }
# Executed during "init". Can be implemented by target script # Executed during "init". Can be overridden
# tar # by board/target/... scripts
proc jtag_init {} { proc jtag_init {} {
if {[catch {jtag arp_init} err]!=0} { if {[catch {jtag arp_init} err]!=0} {
# try resetting additionally # try resetting additionally
jtag arp_init-reset init_reset startup
} }
} }