X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Ftarget%2Fstartup.tcl;h=4d4426f98cff971d32bce73f9826f41a4324addc;hb=5db10c0559c6ae346e93621db5cd6db98bde422d;hp=d480f335dd0fbc09f7c6d1eff17bcd88378015e0;hpb=cb7dbc1af41068f826246beb53870c01d8973bb8;p=fw%2Fopenocd diff --git a/src/target/startup.tcl b/src/target/startup.tcl index d480f335d..4d4426f98 100644 --- a/src/target/startup.tcl +++ b/src/target/startup.tcl @@ -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,48 @@ 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" + set_default_target_event $t gdb-attach "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 +} + +# deprecated ftdi cmds +proc ftdi_location args { + echo "DEPRECATED! use 'adapter usb location' not 'ftdi_location'" + eval adapter usb location $args +}