ae3e5c78ac
Checks bootloader.path for "caterina"
147 lines
2.8 KiB
Perl
Executable file
147 lines
2.8 KiB
Perl
Executable file
#!/usr/bin/env perl
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
use Device::SerialPort;
|
|
use Getopt::Long;
|
|
use Pod::Usage;
|
|
|
|
my %Opt =
|
|
(
|
|
period => 0.1,
|
|
);
|
|
|
|
GetOptions(\%Opt,
|
|
"period=f", # width of reset pulse in seconds
|
|
"verbose!",
|
|
"help!",
|
|
"info!",
|
|
"caterina!",
|
|
);
|
|
|
|
if ($Opt{help} || $Opt{info})
|
|
{
|
|
usage();
|
|
}
|
|
|
|
die "No Arduinos found!\n"
|
|
unless @ARGV;
|
|
|
|
foreach my $dev (@ARGV)
|
|
{
|
|
my $p = Device::SerialPort->new($dev)
|
|
or die "Unable to open $dev: $!\n";
|
|
|
|
if ($Opt{caterina})
|
|
{
|
|
$p->baudrate(1200);
|
|
$p->write_settings;
|
|
$p->close;
|
|
|
|
print STDERR "Forcing reset using 1200bps open/close on port $dev\n"
|
|
if $Opt{verbose};
|
|
|
|
# wait for it to come back
|
|
sleep 1;
|
|
while( ! -e $dev ) {
|
|
print STDERR "Waiting for $dev to come back\n"
|
|
if $Opt{verbose};
|
|
sleep 1;
|
|
}
|
|
|
|
print STDERR "$dev has come back after reset\n"
|
|
if $Opt{verbose};
|
|
}
|
|
else
|
|
{
|
|
my $dt = $Opt{period};
|
|
|
|
print STDERR "Setting DTR high for ${dt}s on $dev\n"
|
|
if $Opt{verbose};
|
|
|
|
die "Invalid pulse width ($dt), "
|
|
unless $dt > 0.0;
|
|
|
|
$p->pulse_dtr_on($dt * 1000.0);
|
|
}
|
|
}
|
|
|
|
## here endeth the main
|
|
|
|
sub usage
|
|
{
|
|
pod2usage(-verbose => 2);
|
|
}
|
|
|
|
__END__
|
|
|
|
=head1 NAME
|
|
|
|
ard-reset-arduino - Reset an Arduino
|
|
|
|
=head1 USAGE
|
|
|
|
$ ard-reset-arduino /dev/cu.usb*
|
|
|
|
$ ard-reset-arduino --verbose --period=0.1 /dev/cu.usb*
|
|
|
|
$ ard-reset-arduino --verbose --caterina /dev/ttyUSB0
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
To reset (most) Arduinos, it's enough to just pulse the DTR line.
|
|
|
|
You can do that from the shell with stty, but there's an interesting
|
|
diversity of command flags. This little program gives a uniform interface
|
|
at the cost of requiring C<Device::SerialPort>.
|
|
|
|
=head1 OPTIONS
|
|
|
|
=over
|
|
|
|
=item --verbose
|
|
|
|
Watch what's going on on STDERR.
|
|
|
|
=item --period=0.25
|
|
|
|
Specify the DTR pulse width in seconds.
|
|
|
|
=item --caterina
|
|
|
|
Reset a Leonardo, Micro, Robot or LilyPadUSB.
|
|
|
|
=back
|
|
|
|
=head1 BUGS AND LIMITATIONS
|
|
|
|
There are no known bugs in this application.
|
|
|
|
Please report problems to the author.
|
|
|
|
Patches are welcome.
|
|
|
|
=head1 AUTHOR
|
|
|
|
Martin Oldfield, ex-atelier@mjo.tc
|
|
|
|
Support for Leonardo/Micro added by sej7278, https://github.com/sej7278
|
|
|
|
Thanks to Daniele Vergini who suggested this to me, and supplied
|
|
a command line version.
|
|
|
|
=head1 LICENCE AND COPYRIGHT
|
|
|
|
Copyright (c) 2012, Martin Oldfield. All rights reserved.
|
|
|
|
This file is free software; you can redistribute it and/or modify it
|
|
under the terms of the GNU Lesser General Public License as published
|
|
by the Free Software Foundation; either version 2.1 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.
|
|
|
|
|