summaryrefslogtreecommitdiff
path: root/xpp/utils/zconf/Zaptel/Xpp.pm
diff options
context:
space:
mode:
Diffstat (limited to 'xpp/utils/zconf/Zaptel/Xpp.pm')
-rw-r--r--xpp/utils/zconf/Zaptel/Xpp.pm113
1 files changed, 93 insertions, 20 deletions
diff --git a/xpp/utils/zconf/Zaptel/Xpp.pm b/xpp/utils/zconf/Zaptel/Xpp.pm
index 3c4b52c..8a2a6eb 100644
--- a/xpp/utils/zconf/Zaptel/Xpp.pm
+++ b/xpp/utils/zconf/Zaptel/Xpp.pm
@@ -10,35 +10,89 @@ package Zaptel::Xpp;
use strict;
use Zaptel::Xpp::Xbus;
-my $proc_base = "/proc/xpp";
+=head1 NAME
+
+Zaptel::Xpp - Perl interface to the Xorcom Astribank drivers.
+
+=head1 SYNOPSIS
-# Static Functions
+ # Listing all Astribanks:
+ use Zaptel::Xpp;
+ # scans hardware:
+ my @xbuses = Zaptel::Xpp::xbuses("SORT_CONNECTOR");
+ for my $xbus (@xbuses) {
+ print $xbus->name." (".$xbus->label .", ". $xbus->connector .")\n";
+ for my $xpd ($xbus->xpds) {
+ print " - ".$xpd->fqn,"\n";
+ }
+ }
+=cut
+
+
+my $proc_base = "/proc/xpp";
# Nominal sorters for xbuses
sub by_name {
- return $a cmp $b;
+ return $a->name cmp $b->name;
}
sub by_connector {
return $a->connector cmp $b->connector;
}
-sub by_serial {
- my $cmp = $a->serial cmp $b->serial;
+sub by_label {
+ my $cmp = $a->label cmp $b->label;
return $cmp if $cmp != 0;
return $a->connector cmp $b->connector;
}
+=head1 xbuses([sort_order])
+
+Scans system (/proc and /sys) and returns a list of Astribank (Xbus)
+objects. The optional parameter sort_order is the order in which
+the Astribanks will be returns:
+
+=over
+
+=item SORT_CONNECTOR
+
+Sort by the connector string. For USB this defines the "path" to get to
+the device through controllers, hubs etc.
+
+=item SORT_LABEL
+
+Sorts by the label of the Astribank. The label field is unique to the
+Astribank. It can also be viewed through 'lsusb -v' without the drivers
+loaded (the iSerial field in the Device Descriptor).
+
+=item SORT_NAME
+
+Sort by the "name". e.g: "XBUS-00". The order of Astribank names depends
+on the load order, and hence may change between different runs.
+
+=item custom function
+
+Instead of using a predefined sorter, you can pass your own sorting
+function. See the example sorters in the code of this module.
+
+=back
+
+=cut
+
sub xbuses {
- my $optsort = shift || 'SORT_NAME';
+ my $optsort = shift || 'SORT_CONNECTOR';
my @xbuses;
- -d "/proc/xpp" or return ();
+ -d "$proc_base" or return ();
+ my @lines;
+ local $/ = "\n";
open(F, "$proc_base/xbuses") ||
die "$0: Failed to open $proc_base/xbuses: $!\n";
- while(<F>) {
- chomp;
- my ($name, @attr) = split;
+ @lines = <F>;
+ close F;
+ foreach my $line (@lines) {
+ chomp $line;
+ my ($name, @attr) = split(/\s+/, $line);
$name =~ s/://;
$name =~ /XBUS-(\d\d)/ or die "Bad XBUS number: $name";
my $num = $1;
@@ -46,20 +100,20 @@ sub xbuses {
my $xbus = Zaptel::Xpp::Xbus->new(NAME => $name, NUM => $num, @attr);
push(@xbuses, $xbus);
}
- close F;
my $sorter;
if($optsort eq "SORT_CONNECTOR") {
$sorter = \&by_connector;
} elsif($optsort eq "SORT_NAME") {
$sorter = \&by_name;
- } elsif($optsort eq "SORT_SERIAL") {
- $sorter = \&by_serial;
+ } elsif($optsort eq "SORT_LABEL") {
+ $sorter = \&by_label;
} elsif(ref($optsort) eq 'CODE') {
$sorter = $optsort;
} else {
die "Unknown optional sorter '$optsort'";
}
- return sort $sorter @xbuses;
+ @xbuses = sort $sorter @xbuses;
+ return @xbuses;
}
sub xpd_of_span($) {
@@ -73,6 +127,16 @@ sub xpd_of_span($) {
return undef;
}
+=head1 sync([new_sync_source])
+
+Gets (and optionally sets) the internal Astribanks synchronization
+source. When used to set sync source, returns the original sync source.
+
+A synchronization source is a value valid writing into /proc/xpp/sync .
+For more information read that file and see README.Astribank .
+
+=cut
+
sub sync {
my $newsync = shift;
my $result;
@@ -94,17 +158,26 @@ sub sync {
}
close F;
if(defined($newsync)) { # Now change
- open(F, ">$file") or die "Failed to open $file for writing: $!";
- if($newsync eq 'HOST') {
- print F "HOST";
- } elsif($newsync =~ /^(\d+)$/) {
- print F ($newapi)? "SYNC=$1" : "$1 0";
- } else {
+ $newsync =~ s/.*/\U$&/;
+ if($newsync =~ /^(\d+)$/) {
+ $newsync = ($newapi)? "SYNC=$1" : "$1 0";
+ } elsif($newsync ne 'ZAPTEL') {
die "Bad sync parameter '$newsync'";
}
+ open(F, ">$file") or die "Failed to open $file for writing: $!";
+ print F $newsync;
close(F) or die "Failed in closing $file: $!";
}
return $result;
}
+=head1 SEE ALSO
+
+For the documentation of xbus objects, see L<Zaptel::Xpp::Xbus>. For
+information about XPD objects, see L<Zaptel::Xpp::Xpd>.
+
+General documentation can be found in the master package L<Zaptel>.
+
+=cut
+
1;