toolchain/gcc-linaro-6.3.1-2017.02-x8.../share/dejagnu/kermit.exp

177 lines
4.5 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
# 2002, 2003, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
#
# This file is part of DejaGnu.
#
# DejaGnu 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 3 of the License, or
# (at your option) any later version.
#
# DejaGnu 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 DejaGnu; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
# Connect to DEST using Kermit. Note that we're just using Kermit as a
# simple serial or network connect program; we don't actually use Kermit
# protocol to do downloads.
#
# Returns -1 if it failed, otherwise it returns the spawn_id.
#
proc kermit_open {dest args} {
global spawn_id
global board_info
if {[board_info $dest exists name]} {
set dest [board_info $dest name]
}
if {[board_info ${dest} exists serial]} {
set port [board_info ${dest} serial]
set device "-l [board_info ${dest} serial]"
if {[board_info ${dest} exists baud]} {
append device " -b [board_info ${dest} baud]"
}
} else {
set port [board_info ${dest} netport]
set device "-j [board_info ${dest} netport]"
}
set tries 0
set result -1
verbose "kermit $device"
eval spawn kermit $device
if {$spawn_id < 0} {
perror "invalid spawn id from Kermit"
return -1
}
expect {
-re ".*ermit.*>.*$" {
send "c\n"
expect {
-re "Connecting to.*$port.*Type the escape character followed by C to.*options.*\[\r\n\]$" {
verbose "Got prompt\n"
set result 0
incr tries
}
timeout {
warning "Never got prompt from Kermit."
set result -1
incr tries
if {$tries <= 2} {
exp_continue
}
}
}
}
-re "Connection Closed.*$" {
perror "Never connected."
set result -1
incr tries
if {$tries <= 2} {
exp_continue
}
}
timeout {
warning "Timed out trying to connect."
set result -1
incr tries
if {$tries <= 2} {
exp_continue
}
}
}
if {$result < 0} {
perror "Couldn't connect after $tries tries."
if {[info exists board_info($dest,fileid)]} {
unset board_info($dest,fileid)
}
return -1
} else {
verbose "Kermit connection established with spawn_id $spawn_id."
set board_info($dest,fileid) $spawn_id
kermit_command $dest "set file type binary" "set transfer display none"
if {[board_info $dest exists transmit_pause]} {
kermit_command $dest "set transmit pause [board_info $dest transmit_pause]"
}
return $spawn_id
}
}
# Send a list of commands to the Kermit session connected to DEST.
#
proc kermit_command {dest args} {
if {[board_info $dest exists name]} {
set dest [board_info $dest name]
}
set shell_id [board_info $dest fileid]
# Sometimes we have to send multiple ^\c sequences. Don't know
# why.
set timeout 2
for {set i 1} {$i <= 5} {incr i} {
send -i $shell_id "c"
expect {
-i $shell_id -re ".*Back at.*ermit.*>.*$" {set i 10}
-i $shell_id timeout {
if {$i > 2} {
warning "Unable to get prompt from kermit."
}
}
}
}
foreach command $args {
set timeout 120
send -i $shell_id "${command}\r"
expect {
-i $shell_id -re ".*ermit.*>.*$" { }
-i $shell_id timeout {
perror "Response failed from Kermit."
return -1
}
}
}
send -i $shell_id "c\r"
expect {
-i $shell_id -re ".*other options.\[\r\n\]+" { }
-i $shell_id timeout {
perror "Unable to resume Kermit connection."
return -1
}
}
return 0
}
# Send STRING to DEST.
#
proc kermit_send {dest string args} {
if {[board_info $dest exists transmit_pause]} {
set f [open "/tmp/fff" "w"]
puts -nonewline $f "$string"
close $f
set result [remote_transmit $dest /tmp/fff]
remote_file build delete "/tmp/fff"
return "$result"
} else {
return [standard_send $dest $string]
}
}
# Transmit FILE directly to DEST as raw data.
# No translation is performed.
#
proc kermit_transmit {dest file args} {
if {[board_info $dest exists transmit_pause]} {
kermit_command $dest "transmit $file"
return ""
} else {
return [standard_transmit $dest $file]
}
}