configure.ac: add libusb/libusbx support (for xpp)
[dahdi/tools.git] / xpp / dahdi_hardware
1 #! /usr/bin/perl -w
2 #
3 # Written by Oron Peled <oron@actcom.co.il>
4 # Copyright (C) 2007, Xorcom
5 # This program is free software; you can redistribute and/or
6 # modify it under the same terms as Perl itself.
7 #
8 # $Id$
9 #
10 use strict;
11 use File::Basename;
12 use Getopt::Std;
13 BEGIN { my $dir = dirname($0); unshift(@INC, "$dir", "$dir/perl_modules"); }
14
15 use Dahdi;
16 use Dahdi::Span;
17 use Dahdi::Xpp;
18 use Dahdi::Xpp::Xbus;
19 use Dahdi::Hardware;
20 use Dahdi::Xpp::Mpp;
21
22 sub usage {
23         die "Usage: $0 [-v][-x][-t]\n";
24 }
25
26 my %opts;
27 getopts('vxt', \%opts) || usage;
28 @ARGV == 0 or usage;
29
30 my @spans = Dahdi::spans;
31
32 sub show_xbus($) {
33         my $xbus = shift or die;
34         my @xpds = $xbus->xpds;
35         my $label = '[' . $xbus->label() . ']';
36         my $connector = ($xbus->status eq 'CONNECTED') ? $xbus->connector : "MISSING";
37         printf " LABEL=%-20s CONNECTOR=%-20s\n", $label, $connector;
38         foreach my $xpd (@xpds) {
39                 my $reg = $xpd->dahdi_registration;
40                 my $channels = '(' . $xpd->channels . ')';
41                 my $span;
42                 my $spanstr;
43                 if($reg && @spans) {
44                         ($span) = grep { $_->name eq $xpd->fqn } @spans;
45                         $spanstr = ($span) ? ("Span " . $span->num) : "";
46                 } else {
47                         $spanstr = "Unregistered";
48                 }
49                 my $master = '';
50                 #$master = "XPP-SYNC" if $xpd->is_sync_master;
51                 $master .= " DAHDI-SYNC" if defined($span) && $span->is_dahdi_sync_master;
52                 printf "\t%-10s: %-8s %-5s %s %s\n", $xpd->fqn, $xpd->type, $channels, $spanstr, $master;
53         }
54 }
55
56 my %seen;
57 my $format = "%-20s %-12s %4s:%4s %s\n";
58
59 sub show_disconnected(%) {
60         my %seen = @_;
61
62         my $notified_lost = 0;
63         foreach my $xbus (Dahdi::Xpp::xbuses) {
64                 if(!$seen{$xbus->name}) {
65                         print "----------- XPP Spans with disconnected hardware -----------\n"
66                                 unless $notified_lost++;
67                         printf($format, $xbus->name, '', '', '', "NO HARDWARE");
68                         show_xbus($xbus) if $opts{'v'};
69                 }
70         }
71 }
72
73 # FIXME: For verbose display we also need to see the XPP devices.
74 # If no spans are registered, this won't happen. A brute-force
75 # method for making it happen:
76 Dahdi::Xpp::xbuses if ($opts{'v'});
77
78 my @devices = Dahdi::Hardware->device_list;
79 foreach my $dev (@devices) {
80         my $driver = $dev->driver || "";
81         my $xbus;
82         my $loaded;
83         my $tws_port;
84         my $tws_power;
85         my $tws_watchdog;
86         my $mppinfo;
87         if($dev->is_astribank) {
88                 $xbus = $dev->xbus;
89                 if($opts{'v'} || $opts{'t'}) {
90                         Dahdi::Xpp::Mpp->mpp_addinfo($dev);
91                         $mppinfo = $dev->mppinfo;
92                         if(defined $mppinfo) {
93                                 $tws_port = $mppinfo->{TWINSTAR_PORT};
94                                 $tws_power = $mppinfo->{TWINSTAR_POWER};
95                                 $tws_watchdog = $mppinfo->{TWINSTAR_WATCHDOG};
96                         }
97                 }
98         }
99         $loaded = $dev->loaded;
100         warn "driver should be '$driver' but is actually '$loaded'\n"
101                 if defined($loaded) && $driver ne $loaded;
102         $driver = "$driver" . (($loaded) ? "+" : "-");
103         if(defined $tws_power && defined $tws_watchdog) {
104                 my $tws_active = $tws_watchdog && $tws_power->[0] && $tws_power->[1];
105                 $driver .= "[T]" if $tws_active;
106         }
107         my $description = $dev->description || "";
108         printf $format, $dev->hardware_name, $driver, $dev->vendor, $dev->product, $description;
109         if($opts{'v'} && defined $mppinfo && exists $mppinfo->{MPP_TALK}) {
110                 printf " MPP: TWINSTAR_PORT=$tws_port\n" if defined $tws_port;
111                 printf " MPP: TWINSTAR_WATCHDOG=$tws_watchdog\n" if defined $tws_watchdog;
112                 for(my $i = 0; $i < 2; $i++) {
113                         printf " MPP: TWINSTAR_POWER[%d]=%d\n",
114                                 $i, $tws_power->[$i] if defined $tws_power;
115                 }
116         }
117         if(!defined $xbus || !$xbus) {
118                 next;
119         }
120         $seen{$xbus->name} = 1;
121         show_xbus($xbus) if $opts{'v'};
122 }
123
124 show_disconnected(%seen) if $opts{'x'};
125
126 __END__
127
128 =head1 NAME
129
130 dahdi_hardware - Shows Dahdi hardware devices. 
131
132 =head1 SYNOPSIS
133
134 dahdi_hardware [-v][-x]
135
136 =head1 OPTIONS
137
138 =over
139
140 =item -v
141
142 Verbose output - show spans used by each device etc. Currently only
143 implemented for the Xorcom Astribank.
144
145 =item -x
146
147 Show disconnected Astribank unit, if any.
148
149 =back
150
151 =head1 DESCRIPTION
152
153 Show all Dahdi hardware devices. Devices are recognized according to
154 lists of PCI and USB IDs in Dahdi::Hardware::PCI.pm and 
155 Dahdi::Hardware::USB.pm . For PCI it is possible to detect by
156 sub-vendor and sub-product ID as well.
157
158 The first output column is the connector: a bus specific field that
159 shows where this device is. 
160
161 The second field shows which driver should handle the device. a "-" sign
162 marks that the device is not yet handled by this driver. A "+" sign
163 means that the device is handled by the driver.
164
165 For the Xorcom Astribank (and in the future: for other Dahdi devices)
166 some further information is provided from the driver. Those extra lines
167 always begin with spaces.
168
169 Example output: 
170
171 Without drivers loaded:
172
173   usb:001/002        xpp_usb-     e4e4:1152 Astribank-multi FPGA-firmware
174   usb:001/003        xpp_usb-     e4e4:1152 Astribank-multi FPGA-firmware
175   pci:0000:01:0b.0   wctdm-       e159:0001 Wildcard TDM400P REV H
176
177 With drivers loaded, without -v:
178   usb:001/002        xpp_usb+     e4e4:1152 Astribank-multi FPGA-firmware
179   usb:001/003        xpp_usb+     e4e4:1152 Astribank-multi FPGA-firmware
180   pci:0000:01:0b.0   wctdm+       e159:0001  Wildcard TDM400P REV E/F
181
182 With drivers loaded, with -v:
183   usb:001/002        xpp_usb+     e4e4:1152 Astribank-multi FPGA-firmware
184    LABEL=[usb:123] CONNECTOR=usb-0000:00:1d.7-1  
185           XBUS-00/XPD-00: FXS      Span 2 
186           XBUS-00/XPD-10: FXS      Span 3 
187           XBUS-00/XPD-20: FXS      Span 4 
188           XBUS-00/XPD-30: FXS      Span 5 
189   usb:001/003        xpp_usb+     e4e4:1152 Astribank-multi FPGA-firmware
190    LABEL=[usb:4567] CONNECTOR=usb-0000:00:1d.7-4  
191           XBUS-01/XPD-00: FXS      Span 6 XPP-SYNC
192           XBUS-01/XPD-10: FXO      Span 7 
193           XBUS-01/XPD-20: FXO      Span 8 
194           XBUS-01/XPD-30: FXO      Span 9 
195   pci:0000:01:0b.0   wctdm+       e159:0001  Wildcard TDM400P REV E/F
196