It is a common requirement to automatically execute some command after "init". This can be achieved, either in scripts or through OpenOCD command line, by explicitly calling "init" followed by the commands. But this approach fails if the request for post-init commands is spread across configuration files; only one of the files can split pre-init and post-init status by calling "init". The common workaround is to "rename" the command "init" and replace it with a TCL proc that calls the original "init" and the post-init commands. E.g. in Zephyr script [1]. To simplify and formalize the post-init execution, use a TCL list that contains the list of commands to be executed. Every script can contribute adding new commands, e.g. using "lappend". In the same way, formalize the pre-shutdown execution with a TCL list of user commands to be executed before OpenOCD exit. Document them and add trivial examples. Drop from documentation the suggestion to rename "shutdown". Change-Id: I9464fb40ccede3e7760d425873adca363b49a64f Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com> Link: [1] https://github.com/zephyrproject-rtos/zephyr/blob/zephyr-v2.7.1/boards/arm/nucleo_h743zi/support/openocd.cfg#L15 Reviewed-on: https://review.openocd.org/c/openocd/+/6851 Reviewed-by: Tomas Vanek <vanekt@fbl.cz> Tested-by: jenkins
54 lines
1.4 KiB
Tcl
54 lines
1.4 KiB
Tcl
# Defines basic Tcl procs that must exist for OpenOCD scripts to work.
|
|
#
|
|
# Embedded into OpenOCD executable
|
|
#
|
|
|
|
# Try flipping / and \ to find file if the filename does not
|
|
# match the precise spelling
|
|
proc find {filename} {
|
|
if {[catch {ocd_find $filename} t]==0} {
|
|
return $t
|
|
}
|
|
if {[catch {ocd_find [string map {\ /} $filename} t]==0} {
|
|
return $t
|
|
}
|
|
if {[catch {ocd_find [string map {/ \\} $filename} t]==0} {
|
|
return $t
|
|
}
|
|
# make sure error message matches original input string
|
|
return -code error "Can't find $filename"
|
|
}
|
|
add_usage_text find "<file>"
|
|
add_help_text find "print full path to file according to OpenOCD search rules"
|
|
|
|
# Find and run a script
|
|
proc script {filename} {
|
|
uplevel #0 [list source [find $filename]]
|
|
}
|
|
add_help_text script "filename of OpenOCD script (tcl) to run"
|
|
add_usage_text script "<file>"
|
|
|
|
# Run a list of post-init commands
|
|
# Each command should be added with 'lappend post_init_commands command'
|
|
lappend _telnet_autocomplete_skip _run_post_init_commands
|
|
proc _run_post_init_commands {} {
|
|
if {[info exists ::post_init_commands]} {
|
|
foreach cmd $::post_init_commands {
|
|
eval $cmd
|
|
}
|
|
}
|
|
}
|
|
|
|
# Run a list of pre-shutdown commands
|
|
# Each command should be added with 'lappend pre_shutdown_commands command'
|
|
lappend _telnet_autocomplete_skip _run_pre_shutdown_commands
|
|
proc _run_pre_shutdown_commands {} {
|
|
if {[info exists ::pre_shutdown_commands]} {
|
|
foreach cmd $::pre_shutdown_commands {
|
|
eval $cmd
|
|
}
|
|
}
|
|
}
|
|
|
|
#########
|