diff options
author | Tzafrir Cohen <tzafrir.cohen@xorcom.com> | 2009-04-02 20:56:42 +0000 |
---|---|---|
committer | Tzafrir Cohen <tzafrir.cohen@xorcom.com> | 2009-04-02 20:56:42 +0000 |
commit | cb01267f42eba7bc5a572235e5d2571cc9b60303 (patch) | |
tree | 421d7509698c604a76499fdc95432642f323d9ad /xpp/twinstar | |
parent | 8c29f87f0fe6465a171644f1d916481d0d2def4f (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-x | xpp/twinstar | 149 |
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__ |