summaryrefslogtreecommitdiff
path: root/xpp/perl_modules
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/perl_modules
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/perl_modules')
-rw-r--r--xpp/perl_modules/Dahdi/Hardware.pm95
-rw-r--r--xpp/perl_modules/Dahdi/Hardware/PCI.pm12
-rw-r--r--xpp/perl_modules/Dahdi/Hardware/USB.pm85
-rw-r--r--xpp/perl_modules/Dahdi/Xpp.pm93
-rw-r--r--xpp/perl_modules/Dahdi/Xpp/Mpp.pm184
-rw-r--r--xpp/perl_modules/Dahdi/Xpp/Xbus.pm29
-rw-r--r--xpp/perl_modules/Dahdi/Xpp/Xpd.pm4
7 files changed, 426 insertions, 76 deletions
diff --git a/xpp/perl_modules/Dahdi/Hardware.pm b/xpp/perl_modules/Dahdi/Hardware.pm
index 6407760..1509615 100644
--- a/xpp/perl_modules/Dahdi/Hardware.pm
+++ b/xpp/perl_modules/Dahdi/Hardware.pm
@@ -8,8 +8,6 @@ package Dahdi::Hardware;
# $Id$
#
use strict;
-use Dahdi::Hardware::USB;
-use Dahdi::Hardware::PCI;
=head1 NAME
@@ -44,6 +42,7 @@ system. It identifies devices by (USB/PCI) bus IDs.
=head1 Device Attributes
+
As usual, object attributes can be used in either upp-case or
lower-case, or lower-case functions.
@@ -92,22 +91,27 @@ attributes).
Astribank.
=cut
+#
+# A global hardware handle
+#
-sub device_detected($$) {
- my $dev = shift || die;
- my $name = shift || die;
- die unless defined $dev->{'BUS_TYPE'};
+my %hardware_list = (
+ 'PCI' => [],
+ 'USB' => [],
+ );
+
+
+sub new($$) {
+ my $pack = shift || die "Wasn't called as a class method\n";
+ my $name = shift || die "$0: Missing device name";
+ my $type = shift || die "$0: Missing device type";
+ my $dev = {};
+ $dev->{'BUS_TYPE'} = $type;
$dev->{IS_ASTRIBANK} = 0 unless defined $dev->{'IS_ASTRIBANK'};
$dev->{'HARDWARE_NAME'} = $name;
+ return $dev;
}
-sub device_removed($) {
- my $dev = shift || die;
- my $name = $dev->hardware_name;
- die "Missing dahdi device hardware name" unless $name;
-}
-
-
=head1 device_list()
Returns a list of the hardware devices on the system.
@@ -117,17 +121,28 @@ You must run scan() first for this function to run meaningful output.
=cut
sub device_list($) {
- my $self = shift || die;
+ my $pack = shift || die;
my @types = @_;
my @list;
@types = qw(USB PCI) unless @types;
foreach my $t (@types) {
- @list = ( @list, @{$self->{$t}} );
+ my $lst = $hardware_list{$t};
+ @list = ( @list, @{$lst} );
}
return @list;
}
+sub device_by_hwname($$) {
+ my $pack = shift || die;
+ my $name = shift || die;
+ my @list = device_list('localcall');
+
+ my @good = grep { $_->hardware_name eq $name } @list;
+ return undef unless @good;
+ @good > 1 && die "$pack: Multiple matches for '$name': @good";
+ return $good[0];
+}
=head1 drivers()
@@ -139,7 +154,7 @@ loaded.
sub drivers($) {
my $self = shift || die;
- my @devs = $self->device_list;
+ my @devs = device_list('localcall');
my @drvs = map { $_->{DRIVER} } @devs;
# Make unique
my %drivers;
@@ -155,14 +170,52 @@ must be run to initialize the module.
=cut
+my $hardware_scanned;
+
sub scan($) {
my $pack = shift || die;
- my $self = {};
- bless $self, $pack;
- $self->{USB} = [ Dahdi::Hardware::USB->devices ];
- $self->{PCI} = [ Dahdi::Hardware::PCI->scan_devices ];
- return $self;
+ return if $hardware_scanned++;
+ foreach my $type (qw(PCI USB)) {
+ eval "use Dahdi::Hardware::$type";
+ die $@ if $@;
+ $hardware_list{$type} = [ "Dahdi::Hardware::$type"->scan_devices ];
+ }
+}
+
+sub import {
+ Dahdi::Hardware->scan unless grep(/\bnoscan\b/i, @_);
+}
+
+sub showall {
+ my $pack = shift || die;
+ my @devs;
+
+ my $printer = sub {
+ my $title = shift;
+ my @devs = @_;
+
+ return unless @devs;
+ printf "%s:\n", $title;
+ foreach my $dev (@devs) {
+ printf "\t%s\n", $dev->hardware_name;
+ foreach my $k (sort keys %{$dev}) {
+ my $v = $dev->{$k};
+ if($k eq 'MPPINFO') {
+ printf "\t\tMPPINFO:\n";
+ eval "use Dahdi::Xpp::Mpp";
+ die $@ if $@;
+ $v->showinfo("\t\t ");
+ } else {
+ printf "\t\t%-20s %s\n", $k, $v;
+ }
+ }
+ }
+ };
+ foreach my $type (qw(USB PCI)) {
+ my $lst = $hardware_list{$type};
+ &$printer("$type devices", @{$lst});
+ }
}
1;
diff --git a/xpp/perl_modules/Dahdi/Hardware/PCI.pm b/xpp/perl_modules/Dahdi/Hardware/PCI.pm
index 4811c54..02bce74 100644
--- a/xpp/perl_modules/Dahdi/Hardware/PCI.pm
+++ b/xpp/perl_modules/Dahdi/Hardware/PCI.pm
@@ -134,12 +134,13 @@ sub pci_sorter {
return $a->priv_device_name() cmp $b->priv_device_name();
}
-sub new($$) {
- my $pack = shift or die "Wasn't called as a class method\n";
- my $self = { @_ };
+sub new($@) {
+ my $pack = shift || die "Wasn't called as a class method\n";
+ my %attr = @_;
+ my $name = sprintf("pci:%s", $attr{PRIV_DEVICE_NAME});
+ my $self = Dahdi::Hardware->new($name, 'PCI');
+ %{$self} = (%{$self}, %attr);
bless $self, $pack;
- Dahdi::Hardware::device_detected($self,
- sprintf("pci:%s", $self->{PRIV_DEVICE_NAME}));
return $self;
}
@@ -197,7 +198,6 @@ sub scan_devices($) {
next unless defined $pci_ids{$key};
my $d = Dahdi::Hardware::PCI->new(
- BUS_TYPE => 'PCI',
PRIV_DEVICE_NAME => $dev->{PRIV_DEVICE_NAME},
VENDOR => $dev->{VENDOR},
PRODUCT => $dev->{PRODUCT},
diff --git a/xpp/perl_modules/Dahdi/Hardware/USB.pm b/xpp/perl_modules/Dahdi/Hardware/USB.pm
index 8c4220a..af0274f 100644
--- a/xpp/perl_modules/Dahdi/Hardware/USB.pm
+++ b/xpp/perl_modules/Dahdi/Hardware/USB.pm
@@ -10,8 +10,7 @@ package Dahdi::Hardware::USB;
use strict;
use Dahdi::Utils;
use Dahdi::Hardware;
-use Dahdi::Xpp;
-use Dahdi::Xpp::Xbus;
+use Dahdi::Xpp::Mpp;
our @ISA = qw(Dahdi::Hardware);
@@ -42,41 +41,75 @@ my %usb_ids = (
$ENV{PATH} .= ":/usr/sbin:/sbin:/usr/bin:/bin";
-my @xbuses = Dahdi::Xpp::xbuses('SORT_CONNECTOR');
-
sub usb_sorter() {
return $a->hardware_name cmp $b->hardware_name;
}
-sub xbus_of_usb($) {
- my $priv_device_name = shift;
- my $dev = shift;
+sub mpp_addinfo($) {
+ my $self = shift || die;
- my ($wanted) = grep {
- defined($_->usb_devname) &&
- $priv_device_name eq $_->usb_devname
- } @xbuses;
- return $wanted;
+ my $mppinfo = Dahdi::Xpp::Mpp->new($self);
+ $self->{MPPINFO} = $mppinfo if defined $mppinfo;
}
-sub new($$) {
+sub new($@) {
my $pack = shift or die "Wasn't called as a class method\n";
- my $self = { @_ };
+ my %attr = @_;
+ my $name = sprintf("usb:%s", $attr{PRIV_DEVICE_NAME});
+ my $self = Dahdi::Hardware->new($name, 'USB');
+ %{$self} = (%{$self}, %attr);
bless $self, $pack;
- my $xbus = xbus_of_usb($self->priv_device_name);
- if(defined $xbus) {
- $self->{XBUS} = $xbus;
- $self->{LOADED} = 'xpp_usb';
- } else {
- $self->{XBUS} = undef;
- $self->{LOADED} = undef;
- }
- Dahdi::Hardware::device_detected($self,
- sprintf("usb:%s", $self->{PRIV_DEVICE_NAME}));
return $self;
}
-sub devices($) {
+sub readval($) {
+ my $fname = shift || warn;
+ open(F, $fname) || warn "Failed opening '$fname': $!";
+ my $val = <F>;
+ close F;
+ chomp $val;
+ warn "$fname is empty" unless defined $val and $val;
+ return $val;
+}
+
+sub set_transport($$) {
+ my $pack = shift || die;
+ my $xbus = shift || die;
+ my $xbus_dir = shift;
+ my $transportdir = "$xbus_dir/transport";
+ my $hwdev;
+ if(! -e "$transportdir/ep_00") {
+ warn "A trasnport in '$transportdir' is not USB";
+ return undef;
+ }
+ my ($usbdev) = glob("$transportdir/usb_device:*");
+ my $busnum;
+ my $devnum;
+ # Different kernels...
+ if(defined $usbdev) { # It's USB
+ if($usbdev =~ /.*usb_device:usbdev(\d+)\.(\d+)/) {
+ $busnum = $1;
+ $devnum = $2;
+ } else {
+ warn "Bad USB transportdir='$transportdir' usbdev='$usbdev'\n";
+ }
+ } elsif(-d "$transportdir/usb_endpoint") {
+ $busnum = readval("$transportdir/busnum");
+ $devnum = readval("$transportdir/devnum");
+ }
+ my $usbname = sprintf("%03d/%03d", $busnum, $devnum);
+ #printf STDERR "DEBUG: %03d/%03d\n", $busnum, $devnum;
+ $xbus->{USB_DEVNAME} = $usbname;
+ $hwdev = Dahdi::Hardware->device_by_hwname("usb:$usbname");
+ #print "set_transport: ", $hwdev, "\n";
+ $xbus->{TRANSPORT} = $hwdev;
+ $hwdev->{XBUS} = $xbus;
+ $hwdev->{LOADED} = 'xpp_usb';
+ $xbus->{IS_TWINSTAR} = $hwdev->is_twinstar;
+ return $hwdev;
+}
+
+sub scan_devices($) {
my $pack = shift || die;
my $usb_device_list = "/proc/bus/usb/devices";
return unless (-r $usb_device_list);
@@ -102,7 +135,6 @@ sub devices($) {
next unless defined $model;
my $d = Dahdi::Hardware::USB->new(
IS_ASTRIBANK => ($model->{DRIVER} eq 'xpp_usb')?1:0,
- BUS_TYPE => 'USB',
PRIV_DEVICE_NAME => $devname,
VENDOR => $vendor,
PRODUCT => $product,
@@ -114,6 +146,7 @@ sub devices($) {
}
close F;
@devices = sort usb_sorter @devices;
+ return @devices;
}
1;
diff --git a/xpp/perl_modules/Dahdi/Xpp.pm b/xpp/perl_modules/Dahdi/Xpp.pm
index 847dedc..f9e62a5 100644
--- a/xpp/perl_modules/Dahdi/Xpp.pm
+++ b/xpp/perl_modules/Dahdi/Xpp.pm
@@ -8,6 +8,7 @@ package Dahdi::Xpp;
# $Id$
#
use strict;
+use Dahdi::Hardware;
use Dahdi::Xpp::Xbus;
=head1 NAME
@@ -28,12 +29,29 @@ Dahdi::Xpp - Perl interface to the Xorcom Astribank drivers.
}
=cut
+#
+# A global handle for all xbuses
+#
+my @xbuses;
my $proc_base = "/proc/xpp";
our $sysfs_astribanks = "/sys/bus/astribanks/devices";
our $sysfs_xpds = "/sys/bus/xpds/devices";
our $sysfs_ab_driver = "/sys/bus/astribanks/drivers/xppdrv";
+sub scan($) {
+ my $pack = shift || die;
+
+ opendir(D, $sysfs_astribanks) || return();
+ while(my $entry = readdir D) {
+ next unless $entry =~ /xbus-(\d+)/;
+ my $xbus = Dahdi::Xpp::Xbus->new($1);
+ push(@xbuses, $xbus);
+ }
+ closedir D;
+ return @xbuses;
+}
+
# Nominal sorters for xbuses
sub by_name {
return $a->name cmp $b->name;
@@ -72,6 +90,11 @@ sub by_type {
return $res;
}
+sub by_xpporder {
+ my $cmp = $a->xpporder cmp $b->xpporder;
+ return $cmp if $cmp != 0;
+ return $a->connector cmp $b->connector;
+}
=head1 xbuses([sort_order])
@@ -91,6 +114,19 @@ The built in sorters are:
=over
+=item SORT_XPPORDER
+
+Sort by ordering defined in F</etc/dahdi/xpp_order> file.
+Astribanks can be listed in this file by their label or by
+their connector string (prefixed with <@>).
+
+Astribanks not listed in the F<xpp_order> file are sorted
+via ordering number 999 -- So they come after the Astribanks
+that are listed.
+
+Astribanks with same ordering number (e.g: 999) are sorted
+by their connector string (to preserve legacy behaviour).
+
=item SORT_CONNECTOR
Sort by the connector string. For USB this defines the "path" to get to
@@ -129,38 +165,73 @@ sub sorters {
SORT_NAME => \&by_name,
SORT_LABEL => \&by_label,
SORT_TYPE => \&by_type,
+ SORT_XPPORDER => \&by_xpporder,
# Aliases
connector => \&by_connector,
name => \&by_name,
label => \&by_label,
type => \&by_type,
+ xpporder => \&by_xpporder,
);
my $which_sorter = shift || return sort keys %sorter_table;
return $which_sorter if ref($which_sorter) eq 'CODE';
return $sorter_table{$which_sorter};
}
+sub add_xpporder(@) {
+ my @xbuses = @_;
+ my $cfg = $ENV{XPPORDER_CONF} || '/etc/dahdi/xpp_order';
+ my %order;
+
+ # Set defaults
+ foreach my $xbus (@xbuses) {
+ $xbus->{XPPORDER} = 99;
+ }
+ # Read from optional config file
+ if(!open(F, $cfg)) {
+ warn "$0: Failed opening '$cfg': $!"
+ unless $! == 2; # ENOENT
+ return;
+ }
+ my $count = 1;
+ while(<F>) {
+ chomp;
+ s/#.*//;
+ s/^\s*//;
+ s/\s*$//;
+ next unless /\S/;
+ $order{$_} = $count++;
+ }
+ close F;
+ # Overrides from config file
+ foreach my $xbus (@xbuses) {
+ my $label = $xbus->label;
+ my $connector = '@' . $xbus->connector;
+ my $val;
+ $val = $order{$label};
+ $val = $order{$connector} unless defined $val;
+ $xbus->{XPPORDER} = $val if defined $val;
+ }
+}
+
sub xbuses {
- my $optsort = shift || 'SORT_CONNECTOR';
- my @xbuses;
+ my $optsort = shift || 'SORT_XPPORDER';
+ my @sorted_xbuses;
- opendir(D, $sysfs_astribanks) || return();
- while(my $entry = readdir D) {
- next unless $entry =~ /xbus-(\d+)/;
- my $xbus = Dahdi::Xpp::Xbus->new($1);
- push(@xbuses, $xbus);
+ if(! @xbuses) {
+ @xbuses = Dahdi::Xpp->scan();
}
- closedir D;
+ add_xpporder(@xbuses);
my $sorter = sorters($optsort);
die "Unknown optional sorter '$optsort'" unless defined $sorter;
- @xbuses = sort $sorter @xbuses;
- return @xbuses;
+ @sorted_xbuses = sort $sorter @xbuses;
+ return @sorted_xbuses;
}
sub xpd_of_span($) {
my $span = shift or die "Missing span parameter";
return undef unless defined $span;
- foreach my $xbus (Dahdi::Xpp::xbuses('SORT_CONNECTOR')) {
+ foreach my $xbus (Dahdi::Xpp::xbuses) {
foreach my $xpd ($xbus->xpds()) {
return $xpd if $xpd->fqn eq $span->name;
}
diff --git a/xpp/perl_modules/Dahdi/Xpp/Mpp.pm b/xpp/perl_modules/Dahdi/Xpp/Mpp.pm
new file mode 100644
index 0000000..6e23260
--- /dev/null
+++ b/xpp/perl_modules/Dahdi/Xpp/Mpp.pm
@@ -0,0 +1,184 @@
+package Dahdi::Xpp::Mpp;
+#
+# Written by Oron Peled <oron@actcom.co.il>
+# Copyright (C) 2009, 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::Utils;
+
+=head1 NAME
+
+Dahdi::Xpp::Mpp - Perl interface to C<astribank_tool(8)>
+
+=head1 DESCRIPTION
+
+This package uses C<astribank_tool(8)> to collect information
+about Astribanks via MPP (Managment Processor Protocol).
+
+The binary default location is F</usr/sbin/astribank_tool>. It may be
+overridden via module parameter C<astribank_tool=> and the
+C<ASTRIBANK_TOOL> environment variable (higher priority).
+
+It may also be set/unset from code via the set_astribank_tool() method.
+
+=head1 METHODS
+
+=head2 mpp_addinfo()
+
+Called with a list of C<Dahdi::Hardware> objects and augment their
+data with C<Dahdi::Xpp::Mpp> objects.
+
+This method is the normal external interface of this class.
+
+=head2 new()
+
+Constructor. Receive as parameter an instance of C<Dahdi::Hardware> class
+and return a C<Dahdi::Xpp:Mpp> object.
+
+Normally, used indirectly via the mpp_addinfo() method.
+
+=head2 set_astribank_tool()
+
+Override default location of astribank_tool(8). It is legal
+to set it to C<undef>.
+
+=head2 showinfo()
+
+Dump an C<Dahdi::Xpp::Mpp> object for debugging.
+
+=cut
+
+my $astribank_tool = '/usr/sbin/astribank_tool';
+
+sub set_astribank_tool($$) {
+ my $pack = shift || die;
+ $pack eq 'Dahdi::Xpp::Mpp' or die "$0: Called from wrong package? ($pack)";
+ my $arg = shift;
+ $astribank_tool = $arg;
+ #print STDERR "Setting astribank_tool='$astribank_tool'\n";
+}
+
+sub import {
+ my ($param) = grep(/^astribank_tool=/, @_);
+ if(defined $param) {
+ $param =~ s/^astribank_tool=//;
+ $astribank_tool = $param;
+ }
+ if(defined $ENV{ASTRIBANK_TOOL}) {
+ $astribank_tool = $ENV{ASTRIBANK_TOOL};
+ }
+}
+
+sub showinfo($$) {
+ my $self = shift || die;
+ my $prefix = shift || die;
+
+ return unless defined $self;
+ foreach my $k (sort keys %{$self}) {
+ my $v = $self->{$k};
+ if(ref($v) eq 'ARRAY') {
+ my @a = @{$v};
+ my $i;
+ my $ki;
+ for($i = 0; $i < @a; $i++) {
+ $ki = sprintf "%s[%d]", $k, $i;
+ printf "$prefix%-20s %s\n", $ki, $a[$i];
+ }
+ } else {
+ if($k eq 'DEV') {
+ printf "$prefix%-20s -> %s\n", $k, $v->hardware_name;
+ } else {
+ printf "$prefix%-20s %s\n", $k, $v;
+ }
+ }
+ }
+}
+
+sub new($$$) {
+ my $pack = shift || die;
+ my $dev = shift || die;
+ my $product = $dev->product;
+ my $usb_top;
+
+ return undef unless $dev->is_astribank;
+ return undef unless $dev->bus_type eq 'USB';
+ return undef unless $product =~ /116./;
+ # Find USB bus toplevel
+ $usb_top = '/dev/bus/usb';
+ $usb_top = '/proc/bus/usb' unless -d $usb_top;
+ die "No USB toplevel found\n" unless -d $usb_top;
+ my $name = $dev->priv_device_name();
+ die "$0: Unkown private device name" unless defined $name;
+ my $path = "$usb_top/$name";
+ my $mppinfo = {
+ DEV => $dev,
+ HAS_MPP => 1,
+ };
+ bless $mppinfo, $pack;
+ #print STDERR "$astribank_tool($path) -- '$product'\n";
+ if(! -x $astribank_tool) {
+ warn "Could not run '$astribank_tool'\n";
+ return $mppinfo;
+ }
+ return $mppinfo unless $product =~ /116[12]/;
+ $mppinfo->{'MPP_TALK'} = 1;
+ my $dbg_file = "$name";
+ $dbg_file =~ s/\W/_/g;
+ #$dbg_file = "/tmp/twinstar-debug-$dbg_file";
+ $dbg_file = "/dev/null";
+ unless(open(F, "$astribank_tool -D '$path' 2> '$dbg_file' |")) {
+ warn "Failed running '$astribank_tool': $!";
+ return undef;
+ }
+ local $/ = "\n";
+ local $_;
+ while(<F>) {
+ chomp;
+ if(s/^INFO:\s*//) {
+ $mppinfo->{'PROTOCOL'} = $1 if /^protocol\s+version:\s*(\d+)/i;
+ } elsif(s/^EEPROM:\s*//) {
+ $mppinfo->{'EEPROM_RELEASE'} = $1 if /^release\s*:\s*([\d\.]+)/i;
+ $mppinfo->{'EEPROM_LABEL'} = $1 if /^label\s*:\s*([\w._'-]+)/i;
+ } elsif(s/^Extrainfo:\s+:\s*(.+?)$//) {
+ $mppinfo->{'EEPROM_EXTRAINFO'} = $1;
+ } elsif(s/^TwinStar:\s*//) {
+ $mppinfo->{'TWINSTAR_PORT'} = $1 if /^connected\s+to\s*:\s*usb-(\d+)/i;
+ if(s/^USB-(\d+)\s*POWER\s*:\s*//) {
+ my $v = ($_ eq 'ON') ? 1 : 0;
+ $mppinfo->{'TWINSTAR_POWER'}->[$1] = $v;
+ }
+ if(s/^Watchdog[^:]+:\s*//) {
+ my $v = ($_ eq 'on-guard') ? 1 : 0;
+ $mppinfo->{'TWINSTAR_WATCHDOG'} = $v;
+ }
+ #printf STDERR "\t%s\n", $_;
+ } else {
+ #printf STDERR "\t%s\n", $_;
+ }
+ }
+ unless(close F) {
+ warn "Failed running '$astribank_tool': $!";
+ return undef;
+ }
+ #$mppinfo->showinfo;
+ return $mppinfo;
+}
+
+sub mpp_addinfo($@) {
+ my $pack = shift || die;
+ my @devlist = @_;
+
+ foreach my $dev (@devlist) {
+ $dev->{MPPINFO} = $pack->new($dev);
+ }
+}
+
+1;
diff --git a/xpp/perl_modules/Dahdi/Xpp/Xbus.pm b/xpp/perl_modules/Dahdi/Xpp/Xbus.pm
index b7994f8..b57148c 100644
--- a/xpp/perl_modules/Dahdi/Xpp/Xbus.pm
+++ b/xpp/perl_modules/Dahdi/Xpp/Xbus.pm
@@ -9,6 +9,7 @@ package Dahdi::Xpp::Xbus;
#
use strict;
use Dahdi::Utils;
+use Dahdi::Hardware;
use Dahdi::Xpp::Xpd;
my $proc_base = "/proc/xpp";
@@ -95,6 +96,19 @@ sub read_attrs() {
}
}
+sub transport_type($$) {
+ my $xbus = shift || die;
+ my $xbus_dir = shift;
+ my $transport = "$xbus_dir/transport";
+ if(-e "$transport/ep_00") { # It's USB
+ $xbus->{TRANSPORT_TYPE} = 'USB';
+ } else {
+ warn "Unkown transport in $xbus_dir\n";
+ undef $xbus->{TRANSPORT_TYPE};
+ }
+ return $xbus->{TRANSPORT_TYPE};
+}
+
sub read_xpdnames_old($) {
my $xbus_num = shift || die;
my $pat = sprintf "/proc/xpp/XBUS-%02d/XPD-[0-9][0-9]", $xbus_num;
@@ -142,16 +156,11 @@ sub new($$) {
$self->read_attrs;
# Get transport related info
my $transport = "$xbus_dir/transport";
- my ($usbdev) = glob("$transport/usb_device:*");
- if(defined $usbdev) { # It's USB
- if($usbdev =~ /.*usb_device:usbdev(\d+)\.(\d+)/) {
- my $busnum = $1;
- my $devnum = $2;
- #printf STDERR "DEBUG: %03d/%03d\n", $busnum, $devnum;
- $self->{USB_DEVNAME} = sprintf("%03d/%03d", $busnum, $devnum);
- } else {
- warn "Bad USB transport='$transport' usbdev='$usbdev'\n";
- }
+ my $transport_type = $self->transport_type($xbus_dir);
+ if(defined $transport_type) {
+ my $tt = "Dahdi::Hardware::$transport_type";
+ my $hw = $tt->set_transport($self, $xbus_dir);
+ #printf STDERR "Xbus::new transport($transport_type): %s\n", $hw->{HARDWARE_NAME};
}
my @xpdnames;
my @xpds;
diff --git a/xpp/perl_modules/Dahdi/Xpp/Xpd.pm b/xpp/perl_modules/Dahdi/Xpp/Xpd.pm
index e5aed5d..a1e7eb3 100644
--- a/xpp/perl_modules/Dahdi/Xpp/Xpd.pm
+++ b/xpp/perl_modules/Dahdi/Xpp/Xpd.pm
@@ -162,7 +162,7 @@ sub dahdi_registration($$) {
}
sub xpds_by_spanno() {
- my @xbuses = Dahdi::Xpp::xbuses("SORT_CONNECTOR");
+ my @xbuses = Dahdi::Xpp::xbuses();
my @xpds = map { $_->xpds } @xbuses;
@xpds = grep { $_->spanno } @xpds;
@xpds = sort { $a->spanno <=> $b->spanno } @xpds;
@@ -181,7 +181,7 @@ sub new($$$$$) {
my $sysfsdir = shift || die;
my $self = {
XBUS => $xbus,
- ID => "$unit$subunit",
+ ID => sprintf("%1d%1d", $unit, $subunit),
FQN => $xbus->name . "/" . "XPD-$unit$subunit",
UNIT => $unit,
SUBUNIT => $subunit,