OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [dejagnu/] [config/] [i960.exp] - Rev 1765

Compare with Previous | Blame | View Log

#   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;

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.