diff options
Diffstat (limited to 'config/i960.exp')
-rw-r--r-- | config/i960.exp | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/config/i960.exp b/config/i960.exp new file mode 100644 index 0000000..dcca835 --- /dev/null +++ b/config/i960.exp @@ -0,0 +1,221 @@ +# Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# DejaGnu@cygnus.com + +# +# Initialize the board on initial connection or after rebooting. +# Since the board autobauds, we have to be a bit aggressive about +# getting a valid prompt. +# +proc ${board}_init { dest } { + global i960_try_count; + + set prompt [board_info $dest shell_prompt]; + set done 0; + + if ![info exists i960_try_count] { + set i960_try_count 1; + } + + remote_close $dest; + if { [remote_open $dest] != "" } { + for { set tries 0; } { $tries < 7 && ! $done } { incr tries } { + remote_send $dest "\n"; + remote_expect $dest 1 { + -re "${prompt}" { + set done 1; + } + -re ".+" { exp_continue } + timeout { } + } + } + } + + remote_close $dest; + if { ! $done } { + if { $i960_try_count == 3 } { + perror "Couldn't connect to board."; + } else { + incr i960_try_count; + remote_close $dest; + remote_reboot $dest; + } + } + if [info exists i960_try_count] { + unset i960_try_count; + } +} + +proc i960_ld { dest prog } { + if ![file exists $prog] { + perror "$prog does not exist." + return "untested" + } + set shell_prompt [board_info $dest shell_prompt]; + set strip [board_info $dest strip]; + set rprog [remote_download host $prog a.out]; + if { $strip != "" } { + remote_exec host $strip $rprog; + } + remote_upload host $rprog a.out; + + set id [remote_open $dest]; + if { $id < 0 } { + return -1; + } + remote_binary $dest; + remote_send $dest "\n"; + remote_expect $dest 5 { + -re $shell_prompt { } + } + remote_send $dest "do\n"; + remote_expect $dest 5 { + -re "Downloading" { } + } + # Nasty. + if { [board_info $dest connect] == "telnet" } { + global board_info; + + remote_close $dest; + set hp [split [board_info $dest netport] ":"]; + set host [lindex $hp 0]; + set port [lindex $hp 1]; + set status -1; + while { $status != 0 } { + set status [catch "socket $host $port" id2]; + if { $status != 0 } { + sleep 5; + } + } + } else { + set id2 [exp_open -leaveopen -i $id]; + } + if [catch "exec sx -bX a.out <@$id2 >@$id2 2>/dev/null" error] { + perror "exec sx failed: $error" + } + if { [board_info $dest connect] == "telnet" } { + close $id2; + sleep 2; + remote_open $dest; + remote_binary $dest; + } + set result 1; + remote_send $dest "\n"; + remote_expect $dest 1 { + -re "$shell_prompt" { + set result 0; + exp_continue; + } + timeout { } + } + return $result; +} + +proc i960_spawn { dest prog args } { + set shell_prompt [board_info $dest shell_prompt]; + + for { set tries 0 ; } { $tries < 3 } { incr tries } { + set result [remote_ld $dest $prog]; + if { $result == 0 } { + set comm "go [board_info $dest start_addr]"; + remote_send $dest "$comm\n"; + remote_expect $dest 10 { + -re "$comm\[\r\n\]\[\r\n\]?" { } + default { } + } + return [board_info $dest fileid]; + } else { + remote_reboot $dest; + } + } + return -1; +} + +proc i960_wait { dest timeout } { + set output ""; + set shell_prompt [board_info $dest shell_prompt]; + + remote_expect $dest $timeout { + -re " fault at \[0-9a-h\]+, subtype \[0-9a-h\]+" { + set status -1; + exp_continue; + } + -re "(.*)(\[\r\n\]|^)Program Exit: (\[0-9\]+)\[\r\n\]" { + append output $expect_out(1,string); + set status $expect_out(3,string); + exp_continue; + } + -re "(.*)$shell_prompt" { + append output $expect_out(1,string); + set bstatus [check_for_board_status output]; + if { $bstatus >= 0 } { + set status $bstatus; + } + } + -re "\[\r\n\]+" { + # Sometimes the board goes wacky in the head, and we have + # to shoot it. + append output $expect_out(buffer); + if { [string length $output] < 512000 } { + exp_continue; + } else { + set status -1; + } + } + default { + set status -1; + } + } + return [list $status $output]; +} + +proc i960_load { dest prog args } { + for { set x 0; } { $x < 3 } { incr x; } { + set id [eval remote_spawn \{$dest\} \{$prog\} $args]; + if { $id < 0 } { + return [list "fail" ""]; + } + set result [remote_wait $dest 120]; + set status [lindex $result 0]; + set output [lindex $result 1]; + + if { $status == 0 } { + return [list "pass" $output]; + } else { + global i960_retry; + + if { [board_info $dest exists unreliable] && ![info exists i960_retry] } { + set i960_retry 1; + remote_reboot $dest; + set result [eval i960_load \{$dest\} \{$prog\} $args]; + unset i960_retry; + return $result; + } else { + if { $status < 0 } { + remote_reboot $dest; + } + return [list "fail" $output]; + } + } + } +} + +set_board_info shell_prompt "=>"; +set_board_info send_initial_cr 1; +# We take care of getting a prompt in ${board}_init. +set_board_info dont_wait_for_prompt 1; |