X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Ftarget%2Fstartup.tcl;h=0e46992b748d7f8324cf04ff50b784d06371353a;hb=78c87f5e81f8b3ee2a72aa546f87985596cb2b9f;hp=56fcbaa7516083ddbf4313636ccd7e8d911dd982;hpb=d9ba56c295f057e716519a798bf9cdb4898c24f4;p=openocd.git diff --git a/src/target/startup.tcl b/src/target/startup.tcl index 56fcbaa751..0e46992b74 100644 --- a/src/target/startup.tcl +++ b/src/target/startup.tcl @@ -1,7 +1,7 @@ # Defines basic Tcl procs for OpenOCD target module proc new_target_name { } { - return [target number [expr [target count] - 1 ]] + return [target number [expr {[target count] - 1}]] } global in_process_reset @@ -16,7 +16,7 @@ proc ocd_process_reset { MODE } { } set in_process_reset 1 - set success [expr [catch {ocd_process_reset_inner $MODE} result]==0] + set success [expr {[catch {ocd_process_reset_inner $MODE} result] == 0}] set in_process_reset 0 if {$success} { @@ -30,18 +30,17 @@ proc ocd_process_reset_inner { MODE } { set targets [target names] # If this target must be halted... - set halt -1 - if { 0 == [string compare $MODE halt] } { - set halt 1 - } - if { 0 == [string compare $MODE init] } { - set halt 1; - } - if { 0 == [string compare $MODE run ] } { - set halt 0; - } - if { $halt < 0 } { - return -code error "Invalid mode: $MODE, must be one of: halt, init, or run"; + switch $MODE { + halt - + init { + set halt 1 + } + run { + set halt 0 + } + default { + return -code error "Invalid mode: $MODE, must be one of: halt, init, or run"; + } } # Target event handlers *might* change which TAPs are enabled @@ -63,10 +62,12 @@ proc ocd_process_reset_inner { MODE } { # Examine all targets on enabled taps. foreach t $targets { - if {[jtag tapisenabled [$t cget -chain-position]]} { + if {![using_jtag] || [jtag tapisenabled [$t cget -chain-position]]} { $t invoke-event examine-start - set err [catch "$t arp_examine"] - if { $err == 0 } { + set err [catch "$t arp_examine allow-defer"] + if { $err } { + $t invoke-event examine-fail + } else { $t invoke-event examine-end } } @@ -79,7 +80,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 } } @@ -94,7 +95,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 } } @@ -107,11 +108,17 @@ 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 } - # Wait upto 1 second for target to halt. Why 1sec? Cause + # Wait up to 1 second for target to halt. Why 1sec? Cause # the JTAG tap reset signal might be hooked to a slow # resistor/capacitor circuit - and it might take a while # to charge @@ -122,16 +129,22 @@ proc ocd_process_reset_inner { MODE } { # Did we succeed? set s [$t curstate] - if { 0 != [string compare $s "halted" ] } { + if { $s != "halted" } { return -code error [format "TARGET: %s - Not halted" $t] } } } #Pass 2 - if needed "init" - if { 0 == [string compare init $MODE] } { + if { $MODE == "init" } { 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 } @@ -148,14 +161,23 @@ proc ocd_process_reset_inner { MODE } { } } -######### +proc using_jtag {} { + set _TRANSPORT [ transport select ] + expr { [ string first "jtag" $_TRANSPORT ] != -1 } +} -# Temporary migration aid. May be removed starting in January 2011. -proc armv4_5 params { - echo "DEPRECATED! use 'arm $params' not 'armv4_5 $params'" - arm $params +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 } +} + +######### + # Target/chain configuration scripts can either execute commands directly # or define a procedure which is executed once all configuration # scripts have completed. @@ -164,17 +186,85 @@ proc armv4_5 params { 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 1000" + } +} + # 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 mem2array {arrayname bitwidth address count {phys ""}} { + echo "DEPRECATED! use 'read_memory' not 'mem2array'" + + upvar $arrayname $arrayname + set $arrayname "" + set i 0 + + foreach elem [read_memory $address $bitwidth $count {*}$phys] { + set ${arrayname}($i) $elem + incr i + } +} + +proc array2mem {arrayname bitwidth address count {phys ""}} { + echo "DEPRECATED! use 'write_memory' not 'array2mem'" + + upvar $arrayname $arrayname + set data "" + + for {set i 0} {$i < $count} {incr i} { + lappend data [expr $${arrayname}($i)] + } + + write_memory $address $bitwidth $data {*}$phys +} + +# smp_on/smp_off were already DEPRECATED in v0.11.0 through http://openocd.zylin.com/4615 +lappend _telnet_autocomplete_skip "aarch64 smp_on" +proc "aarch64 smp_on" {args} { + echo "DEPRECATED! use 'aarch64 smp on' not 'aarch64 smp_on'" + eval aarch64 smp on $args +} + +lappend _telnet_autocomplete_skip "aarch64 smp_off" +proc "aarch64 smp_off" {args} { + echo "DEPRECATED! use 'aarch64 smp off' not 'aarch64 smp_off'" + eval aarch64 smp off $args +} + +lappend _telnet_autocomplete_skip "cortex_a smp_on" +proc "cortex_a smp_on" {args} { + echo "DEPRECATED! use 'cortex_a smp on' not 'cortex_a smp_on'" + eval cortex_a smp on $args +} + +lappend _telnet_autocomplete_skip "cortex_a smp_off" +proc "cortex_a smp_off" {args} { + echo "DEPRECATED! use 'cortex_a smp off' not 'cortex_a smp_off'" + eval cortex_a smp off $args +} + +lappend _telnet_autocomplete_skip "mips_m4k smp_on" +proc "mips_m4k smp_on" {args} { + echo "DEPRECATED! use 'mips_m4k smp on' not 'mips_m4k smp_on'" + eval mips_m4k smp on $args } -proc cortex_a8 args { - echo "DEPRECATED! use 'cortex_a' not 'cortex_a8'" - eval cortex_a $args +lappend _telnet_autocomplete_skip "mips_m4k smp_off" +proc "mips_m4k smp_off" {args} { + echo "DEPRECATED! use 'mips_m4k smp off' not 'mips_m4k smp_off'" + eval mips_m4k smp off $args }