# Commands can be more than one word and they are stored
# as "flash banks" "help text x x x"
-global ocd_helptext
-set ocd_helptext {}
-
proc add_help_text {cmd cmd_help} {
global ocd_helptext
lappend ocd_helptext [list $cmd $cmd_help]
# Show flash in human readable form
# This is an example of a human readable form of a low level fn
-proc flash_banks_pretty {} {
+proc flash_banks {} {
set i 0
set result ""
- foreach {a} [flash_banks] {
+ foreach {a} [openocd_flash_banks] {
if {$i > 0} {
set result "$result\n"
}
- set result [format "$result#%d: %s at 0x%08x, size 0x%08x, buswidth %d, chipwidth %d" $i [lindex $a 0] [lindex $a 1] [lindex $a 2] [lindex $a 3] [lindex $a 4]]
+ set result [format "$result#%d: %s at 0x%08x, size 0x%08x, buswidth %d, chipwidth %d" $i $a(name) $a(base) $a(size) $a(bus_width) $a(chip_width)]
set i [expr $i+1]
}
return $result
openocd_throw exit
}
-# We have currently converted only "flash banks" to tcl.
-proc flash args {
- if {[string compare [lindex $args 0] banks]==0} {
- return [flash_banks_pretty]
- }
- openocd_throw "flash $args"
-}
-
#Print help text for a command. Word wrap
#help text that is too wide inside column.
proc help {args} {
add_help_text help "Tcl implementation of help command"
+#a bit of backwards compatibility
+proc openocd_throw {cmd} {
+ return [eval $cmd]
+}
+
+#a bit of backwards compatibility
+proc openocd {cmd} {
+ return [eval $cmd]
+}
+
# If a fn is unknown to Tcl, we try to execute it as an OpenOCD command
+#
+# We also support two level commands. "flash banks" is translated to
+# flash_banks
proc unknown {args} {
- if {[string length $args]>0} {
- set cmd ""
- # We need to add back quotes for arguments w/space
- # for args without space, we can add quotes anyway
- foreach {a} $args {
- set cmd "$cmd \"$a\""
- }
- openocd_throw $cmd
+ # do the name mangling from "flash banks" to "flash_banks"
+ if {[llength $args]>=2} {
+ set cmd_name "[lindex $args 0]_[lindex $args 1]"
+ # Fix?? add a check here if this is a command?
+ # we'll strip away args until we fail anyway...
+ return [eval "$cmd_name [lrange $args 2 end]"]
+ }
+ # This really is an unknown command.
+ puts "Unknown command: $args"
+}
+
+
+proc target_script {target_num eventname scriptname} {
+ if {[string compare $eventname reset]==0} {
+ set eventname post_reset
}
- # openocd_throw outputs while running and also sets the
- # primary return value to the output of the command
- #
- # The primary return value have been set by "openocd" above,
- # so we need to clear it, lest we print out the output from
- # the command twice.
- return ""
+
+ # This is the script we invoke
+ proc "target_[set eventname]_[set target_num]" {} "script $scriptname"
+
+}
+
+# Try flipping / and \ to find file if the filename does not
+# match the precise spelling
+proc find {filename} {
+ if {[catch {openocd_find $filename} t]==0} {
+ return $t
+ }
+ if {[catch {openocd_find [string map {\ /} $filename} t]==0} {
+ return $t
+ }
+ if {[catch {openocd_find [string map {/ \\} $filename} t]==0} {
+ return $t
+ }
+ # make sure error message matches original input string
+ return [openocd_find $filename]
}
+add_help_text find "<file> - print full path to file according to OpenOCD search rules"
+
+# Run script
+proc script {filename} {
+ source [find $filename]
+}
+
+add_help_text script "<filename> - filename of OpenOCD script (tcl) to run"
+
+add_help_text target_script "<target#> <event=reset/pre_reset/post_halt/pre_resume/gdb_program_config> <script_file>"
+