On Thursday 05 July 2007, Steve Calfee wrote:

> cat /proc/bus/usb/devices give lots of hard to figure out topology info. 

So use the "usbtree" script (available from www.linux-usb.org) to
make it more comprehensible...

#!/usr/bin/perl
#
# Reads /proc/bus/usb/devices and selectively lists and/or
# interprets it.
#
# Originally written by Randy Dunlap. 
#

$DEVFILENAME = "/proc/bus/usb/devices";
$PROGNAME = $0;

if (! open (DEVNUM, "<$DEVFILENAME"))
{
        print "$PROGNAME: cannot open '$DEVFILENAME'\n";
        exit 1;
}

$showconfig = "yes";

while ($line = <DEVNUM>)        # read a text line from DEVNUM
{
        # skip all lines except those we recognize:
        if (($line !~ "^C:")            # Configuration: one is active
                    && ($line !~ "^D:") # Device:
                    && ($line !~ "^I:") # Interface: protocol group
                    && ($line !~ "^S:") # String: used with root hub
                    && ($line !~ "^T:") # Topology: starts each device
                    )
        {
                next;   # to the next line
        }

        chomp $line;            # remove line endings

        # First convert '=' signs to spaces.
        $line =~ tr/=/ /;

        # and convert all '(' and ')' to spaces.
        $line =~ tr/(/ /;
        $line =~ tr/)/ /;

        # split the line at spaces.
        @fields = split / +/, $line;

        # T:  Bus=01 Lev=01 Prnt=01 Port=03 Cnt=01 Dev#=  3 Spd=1.5 MxCh= 0
        if ($line =~ "^T:")
        {
                # split yields: $bus, $level, $parent, $port, $count, $devnum, 
$speed, $maxchild.

                $bus    = @fields [2];
                $level  = @fields [4];
                $parent = @fields [6];          # parent devnum
                $port   = @fields [8] + 1;      # make $port 1-based
                $count  = @fields [10];
                $devnum = @fields [12];
                $speed  = @fields [14];
                $maxchild = @fields [16];
                $devclass = "?";
                $intclass = "?";
                $driver   = "?";
                $ifnum    = "?";
                $showclass = "?";       # derived from $devclass or $intclass
                $lastif = "?";                  # show only first altsetting
                $HCtype = "?";
                $showconfig = "no";
                $nconfig = "0";
                next;
        } # end T: line

        # only show the _active_ configuration
        # C:* #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=100mA
        elsif ( $line =~ "^C:" ) {
            if ( $line =~ "^C:\\*" ) {
                $showconfig = @fields[4];
            } else {
                $showconfig = "no";
            }
            next;
        }

        # D:  Ver= 1.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1
        elsif ($line =~ "^D:")
        { # for D: line
                $devclass = @fields [5];
                $nconfig = @fields [13];
                next;
        }

        # in case this is a root hub, look at the device strings.
        #  - S:  Manufacturer:Linux 2.6.5 ehci_hcd      [all 2.6]
        #  - S:  Product=USB UHCI Root Hub              [all 2.4, 2.2]
        #  - S:  Product=OPTi Inc 82C861                [2.6/PCI_NAMES]
        elsif ( $line =~ "^S:" )
        { # for S: line
                if ( $level == 00 && $line =~ "hcd" )
                {
                    $HCtype = @fields [4];
                }
                elsif ( $level == 00 && $line =~ "HCI" && $HCtype eq "?")
                {
                    $HCtype = @fields [3];
                }
                next;
        }

        # the rest of this code:
        #  - only shows interface descriptors
        #  - for the active configuration
        #  - for the first (prefer: active!) altsetting
        elsif ( ! ( $line =~ "^I:" )
                || "$showconfig" eq "no") {
            next;
        }

        
        # I:  If#= 0 Alt= 0 #EPs= 1 Cls=03(HID  ) Sub=01 Prot=02 Driver=hid
        $intclass = @fields [9];
        $ifnum    = @fields [2];
        $driver   = @fields [15];

        if (($devclass eq ">ifc") || ($devclass eq "unk."))
        {       # then use InterfaceClass, not DeviceClass
                $showclass = $intclass;
        }
        else
        {       # use DeviceClass
                $showclass = $devclass;
        }

        if ($level == 0)
        {
            # substitute real driver name
            if ( $HCtype =~ "UHCI-alt" )
            {
                $HC = "uhci";
            }
            elsif ( $HCtype =~ "UHCI" )
            {
                $HC = "usb-uhci";
            }
            elsif ( $HCtype =~ "OHCI" )
            {
                $HC = "usb-ohci";
            }
            else
            {
                $HC = $HCtype;
            }

                print sprintf ("/:  Bus $bus.Port $port: Dev $devnum, 
Class=root_hub, Driver=%s/%sp, %sM\n",
                         $HC, $maxchild, $speed );
        }
        elsif ($lastif ne $ifnum)
        {
                $temp = $level;
                while ($temp >= 1)
                {
                        print "    ";
                        $temp--;
                }

                if ($nconfig ne "1") {
                    $temp = " Cfg $showconfig/$nconfig";
                } else {
                    $temp = "";
                }

                print sprintf ("|__ Port $port: Dev $devnum$temp, If $ifnum, 
Class=$showclass, Driver=$driver%s, %sM\n",
                        ($maxchild == 0) ? "" : ("/" . $maxchild . "p"),
                        $speed);
                $lastif = $ifnum;
        }
} # end while DEVNUM

close (DEVNUM);

# END.

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to