|
@@ -541,35 +541,35 @@ sub read_fwfile($$) {
|
|
return ([@espfiles], $fpgadata);
|
|
return ([@espfiles], $fpgadata);
|
|
}
|
|
}
|
|
|
|
|
|
-sub tty_read {
|
|
|
|
|
|
+sub tty_read($$$;$) {
|
|
state %old_timeout;
|
|
state %old_timeout;
|
|
- my($tty,$bufref,$timeout) = @_;
|
|
|
|
- my $d = $$bufref;
|
|
|
|
|
|
+ my($tty,$bufref,$timeout,$count) = @_;
|
|
|
|
|
|
- if ($d eq '') {
|
|
|
|
- my $c;
|
|
|
|
|
|
+ $count = 1 unless (defined($count));
|
|
|
|
+
|
|
|
|
+ if ($$bufref eq '' || !$count) {
|
|
if (!defined($old_timeout{$tty}) || $timeout != $old_timeout{$tty}) {
|
|
if (!defined($old_timeout{$tty}) || $timeout != $old_timeout{$tty}) {
|
|
$tty->read_const_time($timeout);
|
|
$tty->read_const_time($timeout);
|
|
$old_timeout{$tty} = $timeout;
|
|
$old_timeout{$tty} = $timeout;
|
|
}
|
|
}
|
|
- ($c,$d) = $tty->read(256);
|
|
|
|
- return '' if (!$c);
|
|
|
|
|
|
+ my($c,$d) = $tty->read(256);
|
|
|
|
+ $$bufref .= $d;
|
|
}
|
|
}
|
|
|
|
|
|
- my $r = substr($d,0,1);
|
|
|
|
- $$bufref = substr($d,1);
|
|
|
|
|
|
+ my $r = substr($$bufref,0,$count);
|
|
|
|
+ $$bufref = substr($$bufref,$count);
|
|
|
|
|
|
return $r;
|
|
return $r;
|
|
}
|
|
}
|
|
|
|
|
|
-sub tty_write($$) {
|
|
|
|
- my($tty,$data) = @_;
|
|
|
|
|
|
+sub tty_write($$$) {
|
|
|
|
+ my($tty,$bufref,$data) = @_;
|
|
my $bytes = length($data);
|
|
my $bytes = length($data);
|
|
my $offs = 0;
|
|
my $offs = 0;
|
|
|
|
|
|
while ($bytes) {
|
|
while ($bytes) {
|
|
my $cnt = $tty->write(substr($data,$offs,$bytes));
|
|
my $cnt = $tty->write(substr($data,$offs,$bytes));
|
|
- usleep(10000) unless ($cnt);
|
|
|
|
|
|
+ tty_read($tty, $bufref, 100, 0) unless ($cnt);
|
|
$offs += $cnt;
|
|
$offs += $cnt;
|
|
$bytes -= $cnt;
|
|
$bytes -= $cnt;
|
|
}
|
|
}
|
|
@@ -640,11 +640,11 @@ sub upload_fpgadata($$) {
|
|
my $found = 0;
|
|
my $found = 0;
|
|
my $tt = time();
|
|
my $tt = time();
|
|
my $start_enq = $tt;
|
|
my $start_enq = $tt;
|
|
- tty_write($tty, "\005"); # ENQ
|
|
|
|
|
|
+ tty_write($tty, \$ttybuf, "\005"); # ENQ
|
|
while (($tt = time()) - $start_enq < 30) {
|
|
while (($tt = time()) - $start_enq < 30) {
|
|
my $d = tty_read($tty, \$ttybuf, 1000);
|
|
my $d = tty_read($tty, \$ttybuf, 1000);
|
|
if ($d eq '') {
|
|
if ($d eq '') {
|
|
- tty_write($tty, "\005"); # ENQ
|
|
|
|
|
|
+ tty_write($tty, \$ttybuf, "\005"); # ENQ
|
|
} else {
|
|
} else {
|
|
my $ix = index("\026\004\027", $d);
|
|
my $ix = index("\026\004\027", $d);
|
|
if ($ix < 0) {
|
|
if ($ix < 0) {
|
|
@@ -669,7 +669,8 @@ sub upload_fpgadata($$) {
|
|
die "$0: $port: failed to start FPGA firmware upload\n";
|
|
die "$0: $port: failed to start FPGA firmware upload\n";
|
|
}
|
|
}
|
|
if ($tt != $last_req) {
|
|
if ($tt != $last_req) {
|
|
- tty_write($tty, "\034\001: /// MAX80 FW UPLOAD \~\@\~ \$\r\n\035");
|
|
|
|
|
|
+ tty_write($tty, \$ttybuf,
|
|
|
|
+ "\034\001: /// MAX80 FW UPLOAD \~\@\~ \$\r\n\035");
|
|
$last_req = $tt;
|
|
$last_req = $tt;
|
|
}
|
|
}
|
|
my $d;
|
|
my $d;
|
|
@@ -743,7 +744,8 @@ sub upload_fpgadata($$) {
|
|
if (!$chunk) {
|
|
if (!$chunk) {
|
|
if ($bytes > $offset) {
|
|
if ($bytes > $offset) {
|
|
if ($now != $last_enq) {
|
|
if ($now != $last_enq) {
|
|
- tty_write($tty, "\026"); # SYN: request window resync
|
|
|
|
|
|
+ # SYN: request window resync
|
|
|
|
+ tty_write($tty, \$ttybuf, "\026");
|
|
$last_enq = $now;
|
|
$last_enq = $now;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -753,14 +755,14 @@ sub upload_fpgadata($$) {
|
|
my $data = substr($fpgadata, $offset, $chunk);
|
|
my $data = substr($fpgadata, $offset, $chunk);
|
|
my $hdr = pack("CvVV", $chunk-1, 0, $offset, crc32($data));
|
|
my $hdr = pack("CvVV", $chunk-1, 0, $offset, crc32($data));
|
|
|
|
|
|
- tty_write($tty, "\002".mybaseencode($hdr, $data));
|
|
|
|
|
|
+ tty_write($tty, \$ttybuf, "\002".mybaseencode($hdr, $data));
|
|
|
|
|
|
push(@pktends, $offset + $chunk);
|
|
push(@pktends, $offset + $chunk);
|
|
$offset += $chunk;
|
|
$offset += $chunk;
|
|
$winspc -= $chunk;
|
|
$winspc -= $chunk;
|
|
}
|
|
}
|
|
|
|
|
|
- tty_write($tty, "\004"); # EOT
|
|
|
|
|
|
+ tty_write($tty, \$ttybuf, "\004"); # EOT
|
|
|
|
|
|
# Final messages out
|
|
# Final messages out
|
|
while (1) {
|
|
while (1) {
|