summaryrefslogtreecommitdiff
path: root/xpp/twinstar
diff options
context:
space:
mode:
authorTzafrir Cohen <tzafrir.cohen@xorcom.com>2009-04-02 20:56:42 +0000
committerTzafrir Cohen <tzafrir.cohen@xorcom.com>2009-04-02 20:56:42 +0000
commitcb01267f42eba7bc5a572235e5d2571cc9b60303 (patch)
tree421d7509698c604a76499fdc95432642f323d9ad /xpp/twinstar
parent8c29f87f0fe6465a171644f1d916481d0d2def4f (diff)
Support for Astribanks 116x: tools part
* New USB firmware loading mechanism. - Incompatible with previous one: upgrade using fxload or hard reset - astribank_hexload is the new low-level loading tool - fpga_load remains for backward compatibility. - xpp/astribank_upgrade: automate upgrading using fxload * Much enhanced control protocol ("MPP") - astribank_tool is the low-level tool for that. * Support for the TwinStar (dual USB port) - Managed through astribank_tool - Wrapper perl modules and scripts provided * Allow explicit ordering of Astribanks - /etc/dahdi/xpp_order - explicit order of Astribanks on the system - The default sorter is now to use those and fall back to connectors (previous default). - An option to dahdi_registration to change sorting. git-svn-id: http://svn.asterisk.org/svn/dahdi/tools/trunk@6313 a0bf4364-ded3-4de4-8d8a-66a801d63aff
Diffstat (limited to 'xpp/twinstar')
-rwxr-xr-xxpp/twinstar149
1 files changed, 149 insertions, 0 deletions
diff --git a/xpp/twinstar b/xpp/twinstar
new file mode 100755
index 0000000..cbcd97f
--- /dev/null
+++ b/xpp/twinstar
@@ -0,0 +1,149 @@
+#! /usr/bin/perl -w
+#
+# Written by Oron Peled <oron@actcom.co.il>
+# Copyright (C) 2007, Xorcom
+# This program is free software; you can redistribute and/or
+# modify it under the same terms as Perl itself.
+#
+# $Id$
+#
+use strict;
+use File::Basename;
+use Getopt::Std;
+BEGIN { my $dir = dirname($0); unshift(@INC, "$dir", "$dir/perl_modules"); }
+
+use Dahdi;
+use Dahdi::Hardware;
+use Dahdi::Span;
+use Dahdi::Xpp;
+use Dahdi::Xpp::Xbus;
+
+my $astribank_tool = '/usr/sbin/astribank_tool';
+
+sub usage {
+ die "Usage: $0 {status|jump|enable-wd|disable-wd|ports}\n";
+}
+
+our ($opt_v, $opt_x);
+getopts('vx') || usage;
+@ARGV == 1 or usage;
+
+
+# Find USB bus toplevel
+my $usb_top;
+$usb_top = '/dev/bus/usb';
+$usb_top = '/proc/bus/usb' unless -d $usb_top;
+die "No USB toplevel found\n" unless -d $usb_top;
+
+sub tws_devs() {
+ my @devs;
+ foreach my $dev (Dahdi::Hardware->device_list) {
+ next unless $dev->is_astribank;
+ next unless $dev->product =~ /116./;
+ push(@devs, $dev->hardware_name);
+ }
+ return @devs;
+}
+
+sub tws_usb_devfile($) {
+ my $name = shift || die;
+ # Remove prefix
+ if($name !~ s/usb://) {
+ die "$name is not a USB name\n";
+ }
+ return "$usb_top/$name";
+}
+
+sub tws_show() {
+ my @usb_devs = grep { /usb:/ } tws_devs();
+
+ foreach my $dev (@usb_devs) {
+ my $path = tws_usb_devfile($dev);
+ print "$path:\n";
+ open(F, "$astribank_tool -D '$path' 2>&1 |") or
+ die "Failed running '$astribank_tool': $!";
+ while(<F>) {
+ chomp;
+ next unless /twinstar/i;
+ printf "\t%s\n", $_;
+ }
+ close F || die "Failed running '$astribank_tool': $!";
+ }
+}
+
+sub tws_portnum($) {
+ my $dev = shift || die "Missing dev";
+ my $path = tws_usb_devfile($dev);
+ my $port;
+ open(F, "$astribank_tool -D '$path' 2>&1 |") or
+ die "Failed running '$astribank_tool': $!";
+ while(<F>) {
+ chomp;
+ next unless /twinstar/i;
+ next unless /connected\s+to/i;
+ if(/USB-(\d+)/i) {
+ $port = $1;
+ }
+ }
+ close F || die "Failed running '$astribank_tool': $!";
+ return $port;
+}
+
+sub tws_jumpdev($$) {
+ my $dev = shift || die;
+ my $port = shift;
+ my $path = tws_usb_devfile($dev);
+ print "$path -> $port\n";
+ system($astribank_tool, "-D", $path, "-p", $port);
+}
+
+sub tws_jump() {
+ my @usb_devs = grep { /usb:/ } tws_devs();
+ my %ports;
+
+ foreach my $dev (@usb_devs) {
+ my $path = tws_usb_devfile($dev);
+ my $port = tws_portnum($dev);
+ # The "other" port
+ $port = ($port == 1) ? 0 : 1;
+ $ports{$dev} = $port;
+ }
+ foreach my $usbdev (sort keys %ports) {
+ tws_jumpdev($usbdev, $ports{$usbdev});
+ }
+}
+
+sub tws_showports() {
+ my @usb_devs = grep { /usb:/ } tws_devs();
+ foreach my $dev (@usb_devs) {
+ my $port = tws_portnum($dev);
+ print "$port\n";
+ }
+}
+
+sub tws_watchdog($) {
+ my $on = shift;
+ die "tws_watchdog() on/off?" unless defined $on;
+ my @usb_devs = grep { /usb:/ } tws_devs();
+
+ foreach my $dev (@usb_devs) {
+ my $path = tws_usb_devfile($dev);
+ print "$path:\n";
+ system($astribank_tool, "-D", $path, "-w", $on);
+ die "Running $astribank_tool failed: $?" if $?;
+ }
+}
+
+if($ARGV[0] eq 'status') {
+ tws_show();
+} elsif($ARGV[0] eq 'jump') {
+ tws_jump();
+} elsif($ARGV[0] eq 'disable-wd') {
+ tws_watchdog(0);
+} elsif($ARGV[0] eq 'enable-wd') {
+ tws_watchdog(1);
+} elsif($ARGV[0] eq 'ports') {
+ tws_showports();
+}
+
+__END__