X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fhelper%2Fstartup.tcl;h=ff30d57de57b2a18c724b85f1292fc75de41415e;hb=0ae7f962f8145e194f13267359f022ebdc8179dc;hp=6e5f577d7d83e4203b48b2e20914cfc106536b18;hpb=2cac9c333fae5a5c944e2cd05544d17ba3db1251;p=openocd.git diff --git a/src/helper/startup.tcl b/src/helper/startup.tcl index 6e5f577d7d..ff30d57de5 100644 --- a/src/helper/startup.tcl +++ b/src/helper/startup.tcl @@ -40,7 +40,7 @@ proc board_test {} { proc flash_banks {} { set i 0 set result "" - foreach {a} [openocd_flash_banks] { + foreach {a} [ocd_flash_banks] { if {$i > 0} { set result "$result\n" } @@ -53,7 +53,7 @@ proc flash_banks {} { # We need to explicitly redirect this to the OpenOCD command # as Tcl defines the exit proc proc exit {} { - openocd_throw exit + ocd_throw exit } #Print help text for a command. Word wrap @@ -93,20 +93,6 @@ proc help {args} { add_help_text help "Tcl implementation of help command" -#a bit of backwards compatibility -proc openocd_throw {cmd} { - set openocd_output "" - eval $cmd - return $openocd_output -} - -#a bit of backwards compatibility -proc openocd {cmd} { - set openocd_output "" - eval $cmd - return $openocd_output -} - # 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 @@ -120,34 +106,59 @@ proc unknown {args} { return [eval "$cmd_name [lrange $args 2 end]"] } # This really is an unknown command. - puts "Unknown command: $args" + return -code error "Unknown command: $args" +} + +proc new_target_name { } { + return [target number [expr [target count] - 1 ]] } proc target_script {target_num eventname scriptname} { - if {[string compare $eventname reset]==0} { - set eventname post_reset - } - # This is the script we invoke - proc "target_[set eventname]_[set target_num]" {} "script $scriptname" - + set tname [target number $target_num] + + if { 0 == [string compare $eventname "reset"] } { + $tname configure -event old-post_reset "script $scriptname" + return + } + + if { 0 == [string compare $eventname "post_reset"] } { + $tname configure -event old-post_reset "script $scriptname" + return + } + + if { 0 == [string compare $eventname "pre_reset"] } { + $tname configure -event old-pre_reset "script $scriptname" + return + } + + if { 0 == [string compare $eventname "gdb_program_config"] } { + $tname configure -event old-gdb_program_config "script $scriptname" + return + } + + return -code error "Unknown target (old) event: $eventname (try $tname configure -event NAME)" + } +add_help_text target_script "DEPRECATED please see the new TARGETNAME configure -event interface" + + # 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} { + if {[catch {ocd_find $filename} t]==0} { return $t } - if {[catch {openocd_find [string map {\ /} $filename} t]==0} { + if {[catch {ocd_find [string map {\ /} $filename} t]==0} { return $t } - if {[catch {openocd_find [string map {/ \\} $filename} t]==0} { + if {[catch {ocd_find [string map {/ \\} $filename} t]==0} { return $t } # make sure error message matches original input string - return [openocd_find $filename] + return -code error "Can't find $filename" } add_help_text find " - print full path to file according to OpenOCD search rules" @@ -162,5 +173,110 @@ proc script {filename} { add_help_text script " - filename of OpenOCD script (tcl) to run" -add_help_text target_script " " + +# Handle GDB 'R' packet. Can be overriden by configuration script, +# but it's not something one would expect target scripts to do +# normally +proc ocd_gdb_restart {target_num} { + # Fix!!! we're resetting all targets here! Really we should reset only + # one target + reset halt +} + + +# If RCLK is not supported, use fallback_speed_khz +proc jtag_rclk {fallback_speed_khz} { + if {[catch {jtag_khz 0}]!=0} { + jtag_khz $fallback_speed_khz + } +} + +add_help_text jtag_rclk "fallback_speed_khz - set JTAG speed to RCLK or use fallback speed" + +proc ocd_process_reset { MODE } { + + # 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 -error "Invalid mode: $MODE, must be one of: halt, init, or run"; + } + + foreach t [ target names ] { + # For compatiblity with 'old scripts' + $t invoke-event old-pre_reset + + # New event script. + $t invoke-event reset-start + } + + # Init the tap controller. + jtag arp_init-reset + + # Examine all targets. + foreach t [ target names ] { + $t arp_examine + } + + # Let the C code know we are asserting reset. + foreach t [ target names ] { + $t invoke-event reset-assert-pre + # C code needs to know if we expect to 'halt' + $t arp_reset assert $halt + $t invoke-event reset-assert-post + } + + # Now de-assert reset. + foreach t [ target names ] { + $t invoke-event reset-deassert-pre + # Again, de-assert code needs to know.. + $t arp_reset deassert $halt + $t invoke-event reset-deassert-post + } + + + # Pass 1 - Now try to halt. + if { $halt } { + foreach t [target names] { + + # Wait upto 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 + + # Catch, but ignore any errors. + catch { $t arp_waitstate halted 1000 } + + # Did we succeed? + set s [$t curstate] + + if { 0 != [string compare $s "halted" ] } { + return -error [format "TARGET: %s - Not halted" $t] + } + } + } + + #Pass 2 - if needed "init" + if { 0 == [string compare init $MODE] } { + foreach t [target names] { + set err [catch "$t arp_waitstate halted 5000"] + # Did it halt? + if { $err == 0 } { + $t invoke-event old-post_reset + } + } + } + + foreach t [ target names ] { + $t invoke-event reset-end + } +}