aboutsummaryrefslogtreecommitdiff
path: root/config/base68k.exp
diff options
context:
space:
mode:
Diffstat (limited to 'config/base68k.exp')
-rw-r--r--config/base68k.exp323
1 files changed, 323 insertions, 0 deletions
diff --git a/config/base68k.exp b/config/base68k.exp
new file mode 100644
index 0000000..d105ce8
--- /dev/null
+++ b/config/base68k.exp
@@ -0,0 +1,323 @@
+# Copyright (C) 1994, 1996, 1997 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, 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
+
+# This file was written by Bob Manson (manson@cygnus.com)
+# based on earlier work by JT Conklin (jtc@cygnus.com)
+
+#
+# base68k_load -- load the program and execute it
+#
+
+proc base68k_ld { dest prog } {
+ global tmpdir
+
+ set shell_prompt [board_info $dest shell_prompt]
+
+ if ![file exists $prog] then {
+ verbose -log "$prog does not exist."
+ return "untested"
+ }
+ if [is_remote host] {
+ set prog [remote_download host $prog];
+ if { $prog == "" } {
+ verbose -log "Unable to download $prog to host.";
+ return "untested";
+ }
+ }
+
+ if [board_info $dest exists objcopy] {
+ set OBJCOPY [board_info $dest objcopy];
+ set exec_file "${prog}.srec"
+ set objcopy_args ""
+ if [board_info $dest exists use_vma_offset] {
+ set objcopy_args "--adjust-vma=[board_info $dest hex_startaddr]";
+ }
+ set status [remote_exec host "$OBJCOPY $objcopy_args -O srec $prog ${prog}.srec"]
+ set result [lindex $status 1];
+ regsub -all -- "\[\r\n\]*" $result "" result
+ if { $result != "" || [lindex $status 0] != 0 } {
+ warning "Got \"$result\" from $OBJCOPY"
+ verbose -log "Couldn't convert to srecord for downloading"
+ remote_close $dest;
+ return "untested"
+ } else {
+ verbose "Converted $prog to an srecord." 2
+ }
+ } else {
+ set exec_file $prog
+ }
+
+ set value 0;
+ if ![board_info $dest exists fileid] {
+ while { $value < 2 } {
+ set rom68k_shell_id [remote_open $dest]
+ if { $rom68k_shell_id < 0 } {
+ if { $value > 0 || ![remote_reboot $dest] } {
+ verbose -log "$prog not executed, couldn't connect to target."
+ return "untested"
+ }
+ incr value;
+ } else {
+ break;
+ }
+ }
+ # dbug has problems if we go into binary mode, so this allows us to
+ # disable entry into binary mode.
+ if ![board_info $dest exists no_binary_mode] {
+ remote_binary $dest;
+ }
+ }
+
+ # if we built the srecord on a remote host, copy it back here so we
+ # can load it
+ if [is_remote host] {
+ global objdir
+ set exec_file [remote_upload host ${exec_file} "${objdir}/a.out"];
+ }
+
+ set got_p 0;
+ for { set tries 0; } { (! $got_p) && $tries < 5 } { incr tries } {
+ remote_send $dest "\r\n\r\n"
+ remote_expect $dest 5 {
+ -re "${shell_prompt}$" {
+ verbose "Got prompt."
+ set result 0
+ set got_p 1;
+ }
+ timeout {
+ warning "Never got prompt."
+ }
+ }
+ if { ! $got_p } {
+ if $tries<=4 then {
+ if { $tries == 3 } then {
+ remote_reboot $dest;
+ } else {
+ remote_send $dest "\r\n"
+ }
+ }
+ }
+ }
+
+ # We need to do this in case the connection to the remote side is
+ # scrogged -- the remote_expect above will fail in a lot of
+ # non-clean ways.
+ if { ! $got_p } {
+ remote_close $dest;
+ remote_reboot $dest;
+ return "unresolved";
+ } else {
+ # Flush out any remaining cruft.
+ remote_expect $dest 2 {
+ timeout { }
+ -re ".+" { exp_continue }
+ default { }
+ }
+ }
+
+ if [board_info $dest exists download_command] {
+ # Load the program.
+ remote_send $dest "\r\n";
+ # dbug has problems sending download command immediately after a
+ # newline, so we wait for the prompt to come back first.
+ remote_expect $dest 5 {
+ -re "${shell_prompt}$" {
+ verbose -log "Got prompt."
+ }
+ timeout {
+ warning "Never got prompt."
+ }
+ }
+ remote_send $dest [board_info $dest download_command]
+ if [board_info $dest exists download_response] {
+ remote_expect $dest 5 {
+ [board_info $dest download_response] { }
+ timeout {
+ perror "Download command never responded."
+ return "unresolved";
+ }
+ }
+ }
+ }
+
+ verbose "Writing records to target..."
+ set status [remote_transmit $dest $exec_file];
+ if { $exec_file != $prog } {
+ remote_file build delete $exec_file
+ }
+ if { $status != 0 } {
+ remote_close $dest;
+ verbose -log "Transmission of $exec_file to the target failed." 3
+ return "unresolved"
+ }
+ verbose "Wrote records to target...waiting for prompt."
+ remote_send $dest "\n"
+ set got_p 0;
+ remote_expect $dest 50 {
+ -re "$shell_prompt$" {
+ verbose "Got prompt."
+ set got_p 1;
+ }
+ timeout { }
+ }
+ if { $got_p } {
+ # Flush any remaining cruft. 2 seconds may be too long, dunno.
+ remote_expect $dest 2 {
+ timeout { }
+ -re ".+" { exp_continue }
+ default { }
+ }
+ return "pass";
+ } else {
+ remote_close $dest;
+ remote_reboot $dest;
+ return "unresolved";
+ }
+
+}
+
+
+proc base68k_spawn { dest prog args } {
+ set shell_prompt [board_info $dest shell_prompt];
+
+ set result [remote_ld $dest $prog];
+ if { $result != "pass" } {
+ return [list $result ""];
+ }
+
+ if [board_info $dest exists startaddr] {
+ set go_command "[board_info $dest go_command] [board_info $dest startaddr]";
+ } else {
+ set go_command "[board_info $dest go_command]";
+ }
+
+ verbose "Sending $go_command, waiting for results.";
+ remote_send $dest "${go_command}\n";
+ return { "pass" "" };
+}
+
+proc base68k_wait { dest timeout } {
+ set shell_prompt [board_info $dest shell_prompt];
+ set noappend 0;
+ set result -1;
+
+ set output "";
+
+ remote_expect $dest $timeout {
+ -re [board_info $dest go_response] {
+ append output $expect_out(buffer);
+ set noappend 1;
+ set result 0;
+ exp_continue -continue_timer;
+ }
+ -re "$shell_prompt$" {
+ verbose "Got prompt.";
+ set result 0;
+ }
+ -re "\[\r\n\]+" {
+ if { ! $noappend } {
+ append output $expect_out(buffer);
+ if { [string length $output] < 512000 } {
+ exp_continue -continue_timer;
+ } else {
+ set result -1;
+ }
+ }
+ }
+ timeout {
+ warning "Nothing ever came back.";
+ set result -1;
+ }
+ }
+
+ if [board_info $dest exists output_end] {
+ regsub "[board_info $dest output_end]" "$output" "\n" output;
+ }
+
+ # There has got to be a better way. (We need to do this in order to remove
+ # the echoed "go command".
+ if [board_info $dest exists startaddr] {
+ set go_command "[board_info $dest go_command] [board_info $dest startaddr]";
+ } else {
+ set go_command "[board_info $dest go_command]";
+ }
+
+ regsub "^.*$go_command\[\r\n\]*" "$output" "" output;
+ regsub "^.*$go_command\[\r\n\]*" "$output" "" output;
+
+ # We always want to check for a status, even if there was a funky weird
+ # failure above.
+ set status [check_for_board_status output];
+ if { $result == 0 } {
+ set result $status;
+ verbose -log "exit status was $status";
+ }
+ # A negative value indicates that we should reboot. Otherwise, return
+ # the exit status from the program if we got one (and we should have).
+ return [list $result "$output"];
+}
+
+proc base68k_load { dest prog args } {
+ global base68k_retry
+
+ set shell_prompt [board_info $dest shell_prompt];
+
+ if { [llength $args] > 0 } {
+ for { set x 0; } { $x < [llength $args] } { incr x ; } {
+ if { [lindex $args $x] != "" } {
+ verbose -log "Cannot pass parameters or input file to this target";
+ return [list "unsupported" ""];
+ }
+ }
+ }
+
+ set result [remote_spawn $dest $prog];
+ if { [lindex $result 0] != "pass" } {
+ return $result;
+ }
+
+ # FIXME: The value 360 below should be a parameter.
+
+ set result [remote_wait $dest 360];
+ set output [lindex $result 1];
+ set status [lindex $result 0];
+
+ verbose "output from board is $output"
+
+ # Make sure there's a newline before the PASS/FAIL/whatever for the log.
+ send_log "\n"
+
+ if { $status > 0 } {
+ return [list "fail" $output];
+ } elseif { $status == 0 } {
+ return [list "pass" $output];
+ } else {
+ if [info exists base68k_retry] {
+ return [list "fail" $output];
+ }
+ set base68k_retry 1;
+ remote_reboot $dest;
+ set status [eval base68k_load \{$dest\} \{$prog\} $args];
+ unset base68k_retry;
+ return $status;
+ }
+}
+
+set_board_info protocol "base68k";
+set_board_info send_initial_cr 1