#!/usr/bin/expect -f # # This Expect script was generated by autoexpect on Thu Jul 29 15:27:58 2004 # Expect and autoexpect were both written by Don Libes, NIST. # # Note that autoexpect does not guarantee a working script. It # necessarily has to guess about certain things. Two reasons a script # might fail are: # # 1) timing - A surprising number of programs (rn, ksh, zsh, telnet, # etc.) and devices discard or ignore keystrokes that arrive "too # quickly" after prompts. If you find your new script hanging up at # one spot, try adding a short sleep just before the previous send. # Setting "force_conservative" to 1 (see below) makes Expect do this # automatically - pausing briefly before sending each character. This # pacifies every program I know of. The -c flag makes the script do # this in the first place. The -C flag allows you to define a # character to toggle this mode off and on. set force_conservative 0 ;# set to 1 to force conservative mode even if ;# script wasn't run conservatively originally if {$force_conservative} { set send_slow {1 .1} proc send {ignore arg} { sleep .1 exp_send -s -- $arg } } # # 2) differing output - Some programs produce different output each time # they run. The "date" command is an obvious example. Another is # ftp, if it produces throughput statistics at the end of a file # transfer. If this causes a problem, delete these patterns or replace # them with wildcards. An alternative is to use the -p flag (for # "prompt") which makes Expect only look for the last line of output # (i.e., the prompt). The -P flag allows you to define a character to # toggle this mode off and on. # # Read the man page for more info. # # -Don # Comment this out or change the argument to 1 to see the dialog. log_user 0 set device m48 set signature "1e 92 05" set hfuse dc set lfuse ee set sck_period_min 4.0 set programmer stk500 set port /dev/ttyS1 set program avrdude set options "-c $programmer -P $port -p $device -t" set prompt "$program> " puts "Using $device device." set timeout 10 eval spawn $program $options match_max 100000 expect_after { "programmer is not responding" {puts "Programmer is not responding."; exit 1} timeout {puts "Timeout while communicating with programmer." ; exit 1} eof {puts "$program died." ; exit 1} } expect -exact $prompt send -- "parms\r" expect -re "SCK period : (\[0-9.]*) us" set sck_period $expect_out(1,string) if {$sck_period < $sck_period_min} { puts "Increasing SCK period to $sck_period_min us for reliable SPI communication." expect -exact $prompt send -- "sck $sck_period_min\r" } expect -exact $prompt send -- "read signature\r" expect -re "0000 (\[0-9a-f]\[0-9a-f] \[0-9a-f]\[0-9a-f] \[0-9a-f]\[0-9a-f]) " set actual $expect_out(1,string) if {[string compare $actual $signature] != 0} { puts "Device signature mismatch. expected \"$signature\", actual \"$actual\"" exit 1 } expect -exact $prompt send -- "read hfuse\r" expect -re "0000 (\[0-9a-f]*) " set actual $expect_out(1,string) if {[string compare $actual $hfuse] == 0} { puts "hfuse = 0x$hfuse" } else { puts "Changing hfuse from 0x$actual to 0x$hfuse" expect -exact $prompt send -- "write hfuse 0 0x$hfuse\r" } expect -exact $prompt send -- "read lfuse\r" expect -re "0000 (\[0-9a-f]*) " set actual $expect_out(1,string) if {[string compare $actual $lfuse] == 0} { puts "lfuse = 0x$lfuse" } else { puts "Changing lfuse from 0x$actual to 0x$lfuse" expect -exact $prompt send -- "write lfuse 0 0x$lfuse\r" } if {$sck_period < $sck_period_min} { puts "Restoring SCK period to $sck_period us." expect -exact $prompt send -- "sck $sck_period\r" } expect -exact $prompt send -- "quit\r" expect eof exit 0