mips32, mips32_pracc_finish() queued only
[fw/openocd] / src / target / startup.tcl
index d480f335dd0fbc09f7c6d1eff17bcd88378015e0..9bbc6e32c92358fc054750e3f9158403aa456661 100644 (file)
@@ -1,21 +1,9 @@
-#########
+# Defines basic Tcl procs for OpenOCD target module
 
-# 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
+proc new_target_name { } {
+       return [target number [expr [target count] - 1 ]]
 }
 
-
 global in_process_reset
 set in_process_reset 0
 
@@ -53,7 +41,7 @@ proc ocd_process_reset_inner { MODE } {
                set halt 0;
        }
        if { $halt < 0 } {
-               return -error "Invalid mode: $MODE, must be one of: halt, init, or run";
+               return -code error "Invalid mode: $MODE, must be one of: halt, init, or run";
        }
 
        # Target event handlers *might* change which TAPs are enabled
@@ -75,8 +63,12 @@ proc ocd_process_reset_inner { MODE } {
 
        # Examine all targets on enabled taps.
        foreach t $targets {
-               if {[jtag tapisenabled [$t cget -chain-position]]} {
-                       $t arp_examine
+               if {![using_jtag] || [jtag tapisenabled [$t cget -chain-position]]} {
+                       $t invoke-event examine-start
+                       set err [catch "$t arp_examine allow-defer"]
+                       if { $err == 0 } {
+                               $t invoke-event examine-end
+                       }
                }
        }
 
@@ -87,7 +79,7 @@ proc ocd_process_reset_inner { MODE } {
        }
        foreach t $targets {
                # C code needs to know if we expect to 'halt'
-               if {[jtag tapisenabled [$t cget -chain-position]]} {
+               if {![using_jtag] || [jtag tapisenabled [$t cget -chain-position]]} {
                        $t arp_reset assert $halt
                }
        }
@@ -102,7 +94,7 @@ proc ocd_process_reset_inner { MODE } {
        }
        foreach t $targets {
                # Again, de-assert code needs to know if we 'halt'
-               if {[jtag tapisenabled [$t cget -chain-position]]} {
+               if {![using_jtag] || [jtag tapisenabled [$t cget -chain-position]]} {
                        $t arp_reset deassert $halt
                }
        }
@@ -115,7 +107,13 @@ proc ocd_process_reset_inner { MODE } {
        # first executing any instructions.
        if { $halt } {
                foreach t $targets {
-                       if {[jtag tapisenabled [$t cget -chain-position]] == 0} {
+                       if {[using_jtag] && ![jtag tapisenabled [$t cget -chain-position]]} {
+                               continue
+                       }
+
+                       # don't wait for targets where examination is deferred
+                       # they can not be halted anyway at this point
+                       if { ![$t was_examined] && [$t examine_deferred] } {
                                continue
                        }
 
@@ -131,7 +129,7 @@ proc ocd_process_reset_inner { MODE } {
                        set s [$t curstate]
 
                        if { 0 != [string compare $s "halted" ] } {
-                               return -error [format "TARGET: %s - Not halted" $t]
+                               return -code error [format "TARGET: %s - Not halted" $t]
                        }
                }
        }
@@ -139,7 +137,13 @@ proc ocd_process_reset_inner { MODE } {
        #Pass 2 - if needed "init"
        if { 0 == [string compare init $MODE] } {
                foreach t $targets {
-                       if {[jtag tapisenabled [$t cget -chain-position]] == 0} {
+                       if {[using_jtag] && ![jtag tapisenabled [$t cget -chain-position]]} {
+                               continue
+                       }
+
+                       # don't wait for targets where examination is deferred
+                       # they can not be halted anyway at this point
+                       if { ![$t was_examined] && [$t examine_deferred] } {
                                continue
                        }
 
@@ -156,6 +160,21 @@ proc ocd_process_reset_inner { MODE } {
        }
 }
 
+proc using_jtag {} {
+       set _TRANSPORT [ transport select ]
+       expr { [ string first "jtag" $_TRANSPORT ] != -1 }
+}
+
+proc using_swd {} {
+       set _TRANSPORT [ transport select ]
+       expr { [ string first "swd" $_TRANSPORT ] != -1 }
+}
+
+proc using_hla {} {
+       set _TRANSPORT [ transport select ]
+       expr { [ string first "hla" $_TRANSPORT ] != -1 }
+}
+
 #########
 
 # Temporary migration aid.  May be removed starting in January 2011.
@@ -163,3 +182,41 @@ proc armv4_5 params {
        echo "DEPRECATED! use 'arm $params' not 'armv4_5 $params'"
        arm $params
 }
+
+# Target/chain configuration scripts can either execute commands directly
+# or define a procedure which is executed once all configuration
+# scripts have completed.
+#
+# By default(classic) the config scripts will set up the target configuration
+proc init_targets {} {
+}
+
+proc set_default_target_event {t e s} {
+       if {[$t cget -event $e] == ""} {
+               $t configure -event $e $s
+       }
+}
+
+proc init_target_events {} {
+       set targets [target names]
+
+       foreach t $targets {
+               set_default_target_event $t gdb-flash-erase-start "reset init"
+               set_default_target_event $t gdb-flash-write-end "reset halt"
+       }
+}
+
+# Additionally board config scripts can define a procedure init_board that will be executed after init and init_targets
+proc init_board {} {
+}
+
+# deprecated target name cmds
+proc cortex_m3 args {
+       echo "DEPRECATED! use 'cortex_m' not 'cortex_m3'"
+       eval cortex_m $args
+}
+
+proc cortex_a8 args {
+       echo "DEPRECATED! use 'cortex_a' not 'cortex_a8'"
+       eval cortex_a $args
+}