osd-contiki/mc1322x-load.pl

113 lines
2.2 KiB
Perl
Raw Normal View History

#!/usr/bin/perl -w
2009-05-08 21:10:21 +02:00
use Device::SerialPort;
use Term::ReadKey;
use Getopt::Long;
2009-05-08 21:10:21 +02:00
use Time::HiRes qw(usleep);
use strict;
my $filename = '';
2009-05-08 18:32:14 +02:00
my $second = '';
my $term = '/dev/ttyUSB0';
my $baud = '115200';
my $verbose;
2009-05-08 18:32:14 +02:00
GetOptions ('file=s' => \$filename,
'secondfile=s' => \$second,
2009-04-14 00:11:48 +02:00
'terminal=s' => \$term,
'verbose' => \$verbose,
'baud=s' => \$baud);
$| = 1;
if($filename eq '') {
print "Example usage: mc1322x-load.pl -f foo.bin -t /dev/ttyS0 -b 9600\n";
2009-05-08 18:32:14 +02:00
print " or : mc1322x-load.pl -f flasher.bin -s flashme.bin\n";
print " -f required: binary file to load\n";
2009-05-08 18:32:14 +02:00
print " -s optional: secondary binary file to send\n";
print " -t default: /dev/ttyUSB0\n";
print " -b default: 115200\n";
exit;
}
my $ob = Device::SerialPort->new ($term) or die "Can't start $term\n";
# next test will die at runtime unless $ob
2009-05-08 21:28:34 +02:00
if ($filename eq '') { die "you must specify a file with -f\n"; }
$ob->baudrate($baud);
$ob->parity('none');
$ob->databits(8);
$ob->stopbits(1);
$ob->handshake("rts");
2009-05-08 21:10:21 +02:00
$ob->read_const_time(1000); # 1 second per unfulfilled "read" call
2009-05-08 18:32:14 +02:00
my $s = 0;
2009-05-08 18:32:14 +02:00
SEND:
do {
my $c;
2009-05-08 21:10:21 +02:00
my $count;
my $ret = '';
2009-05-08 18:32:14 +02:00
if($s == 1) { print "performing secondary send\n"; }
$ob->write(pack('C','0'));
my $ret = '';
my $test;
2009-05-08 21:10:21 +02:00
2009-05-08 18:32:14 +02:00
if($s == 1) {
$test = 'ready';
} else {
$test = 'CONNECT';
}
until($ret eq $test) {
2009-05-08 21:10:21 +02:00
($count,$c) = $ob->read(1);
if ($count == 0) {
print '.';
$ob->write(pack('C','0'));
next;
}
2009-05-08 18:32:14 +02:00
$ret .= $c;
}
2009-05-08 21:10:21 +02:00
print $ret . "\n";
2009-05-08 18:32:14 +02:00
2009-05-08 21:28:34 +02:00
if (-e $filename) {
2009-05-08 18:32:14 +02:00
my $size = -s $filename;
print ("Size: $size bytes\n");
$ob->write(pack('V',$size));
open(FILE, $filename) or die($!);
print "Sending $filename\n";
my $i = 1;
while(read(FILE, $c, 1)) {
print unpack('H',$c) . unpack('h',$c) if $verbose;
$i++;
2009-05-08 21:10:21 +02:00
usleep(50); # this is as fast is it can go...
2009-05-08 18:32:14 +02:00
$ob->write($c);
}
}
2009-05-08 21:28:34 +02:00
if(-e $second) {$s=1; $filename = $second; next SEND; }
2009-05-08 18:32:14 +02:00
2009-05-08 21:28:34 +02:00
};
print "done.\n";
2009-05-08 21:10:21 +02:00
while(1) {
print $ob->input;
}
$ob -> close or die "Close failed: $!\n";
ReadMode 0;
undef $ob; # closes port AND frees memory in perl
exit;