diff options
Diffstat (limited to 'xpp/utils/zconf/Zaptel/Hardware/USB.pm')
-rw-r--r-- | xpp/utils/zconf/Zaptel/Hardware/USB.pm | 81 |
1 files changed, 42 insertions, 39 deletions
diff --git a/xpp/utils/zconf/Zaptel/Hardware/USB.pm b/xpp/utils/zconf/Zaptel/Hardware/USB.pm index bbf00fe..0f2024b 100644 --- a/xpp/utils/zconf/Zaptel/Hardware/USB.pm +++ b/xpp/utils/zconf/Zaptel/Hardware/USB.pm @@ -12,21 +12,28 @@ use Zaptel::Hardware; use Zaptel::Xpp; use Zaptel::Xpp::Xbus; -my @idlist = qw( - e4e4:1130 - e4e4:1131 - e4e4:1132 - e4e4:1140 - e4e4:1141 - e4e4:1142 - e4e4:1150 - e4e4:1151 - e4e4:1152 +our @ISA = qw(Zaptel::Hardware); + +my %usb_ids = ( + # from wcusb + '06e6:831c' => { DRIVER => 'wcusb', DESCRIPTION => 'Wildcard S100U USB FXS Interface' }, + '06e6:831e' => { DRIVER => 'wcusb2', DESCRIPTION => 'Wildcard S110U USB FXS Interface' }, + '06e6:b210' => { DRIVER => 'wc_usb_phone', DESCRIPTION => 'Wildcard Phone Test driver' }, + + # from xpp_usb + 'e4e4:1130' => { DRIVER => 'xpp_usb', DESCRIPTION => 'Astribank-8/16 no-firmware' }, + 'e4e4:1131' => { DRIVER => 'xpp_usb', DESCRIPTION => 'Astribank-8/16 USB-firmware' }, + 'e4e4:1132' => { DRIVER => 'xpp_usb', DESCRIPTION => 'Astribank-8/16 FPGA-firmware' }, + 'e4e4:1140' => { DRIVER => 'xpp_usb', DESCRIPTION => 'Astribank-BRI no-firmware' }, + 'e4e4:1141' => { DRIVER => 'xpp_usb', DESCRIPTION => 'Astribank-BRI USB-firmware' }, + 'e4e4:1142' => { DRIVER => 'xpp_usb', DESCRIPTION => 'Astribank-BRI FPGA-firmware' }, + 'e4e4:1150' => { DRIVER => 'xpp_usb', DESCRIPTION => 'Astribank-multi no-firmware' }, + 'e4e4:1151' => { DRIVER => 'xpp_usb', DESCRIPTION => 'Astribank-multi USB-firmware' }, + 'e4e4:1152' => { DRIVER => 'xpp_usb', DESCRIPTION => 'Astribank-multi FPGA-firmware' }, ); $ENV{PATH} .= ":/usr/sbin:/sbin:/usr/bin:/bin"; -my $prog = 'lsusb'; # Accessors (miniperl does not have Class:Accessor) our $AUTOLOAD; @@ -45,21 +52,14 @@ my @devices; my @xbuses = Zaptel::Xpp::xbuses('SORT_CONNECTOR'); sub usb_sorter() { - return - sprintf("%03d/%03d", $a->bus, $a->dev) cmp - sprintf("%03d/%03d", $b->bus, $b->dev); + return $a->hardware_name cmp $b->hardware_name; } -sub xbus_of_usb($$) { - my $bus = shift; +sub xbus_of_usb($) { + my $priv_device_name = shift; my $dev = shift; - my ($wanted) = grep { - my $b = $_->usb_bus; - my $d = $_->usb_dev; - defined($b) && $b == $bus && - defined($d) && $d == $dev - } @xbuses; + my ($wanted) = grep { $priv_device_name eq $_->usb_devname } @xbuses; return $wanted; } @@ -67,14 +67,13 @@ sub new($$) { my $pack = shift or die "Wasn't called as a class method\n"; my $self = { @_ }; bless $self, $pack; - my $xbus = xbus_of_usb($self->bus, $self->dev); + my $xbus = xbus_of_usb($self->priv_device_name); if(defined $xbus) { $self->{XBUS} = $xbus; - $self->{DRIVER} = 'xpp_usb'; + $self->{LOADED} = 'xpp_usb'; } - my $hardware_name = sprintf("usb:%03d/%03d", $self->{BUS}, $self->{DEV}); - $self->{HARDWARE_NAME} = $hardware_name; - Zaptel::Hardware::device_detected($self, $hardware_name); + Zaptel::Hardware::device_detected($self, + sprintf("usb:%s", $self->{PRIV_DEVICE_NAME})); return $self; } @@ -85,20 +84,24 @@ sub devices($) { sub scan_devices($) { my $pack = shift || die; - open(F, "$prog|") || die "$0: Failed running $prog: $!"; + my $usb_device_list = "/proc/bus/usb/devices"; + open(F, $usb_device_list) || die "Failed to open $usb_device_list: $!"; + $/ = ''; while(<F>) { - chomp; - my ($bus,$dev,$id) = (split(/\s+/))[1,3,5]; - $dev =~ s/://; - $bus =~ s/^0*//; - $dev =~ s/^0*//; - next unless grep { lc($id) eq $_ } @idlist; - my($vendor,$product) = split(/:/, $id); + my @lines = split(/\n/); + my ($tline) = grep(/^T/, @lines); + my ($pline) = grep(/^P/, @lines); + my ($busnum,$devnum) = ($tline =~ /Bus=(\w+)\W.*Dev#=\s*(\w+)\W/); + my $devname = sprintf("%03d/%03d", $busnum, $devnum); + my ($vendor,$product) = ($pline =~ /Vendor=(\w+)\W.*ProdID=(\w+)\W/); + my $model = $usb_ids{"$vendor:$product"}; + next unless defined $model; my $d = Zaptel::Hardware::USB->new( - BUS => $bus, - DEV => $dev, - VENDOR => $vendor, - PRODUCT => $product, + PRIV_DEVICE_NAME => $devname, + VENDOR => $vendor, + PRODUCT => $product, + DESCRIPTION => $model->{DESCRIPTION}, + DRIVER => $model->{DRIVER}, ); push(@devices, $d); } |