summaryrefslogtreecommitdiffstats
path: root/scripts/usb/usbtree
blob: 54b9e64fd1698abdcf35a1c94bdc578b6819dcb5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#!/usr/bin/perl

# Reads /proc/bus/usb/devices and selectively lists and/or
# interprets it.

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

print "\n";

$TAGS = $ARGV[0];		# save user TAGS
if (length ($TAGS) == 0)
{
}

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

while ($line = <DEVNUM>)	# read a text line from DEVNUM
{
	# skip all lines except those that begin with "T:" or "D:" or "I:".
	if (($line !~ "^T:") && ($line !~ "^I:") && ($line !~ "^D:"))
	{
		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;

	if ($line =~ "^T:")
	{
		# split yields: $level, $port, $devnum, $speed, $maxchild.

		$level  = @fields [2];
		$port   = @fields [6];
		$devnum = @fields [10];
		$speed  = @fields [12];
		$maxchild = @fields [14];
		$devclass = "?";
		$intclass = "?";
		$driver   = "?";

		if (($devnum == -1) && ($level == 0))
		{
			print "/:  Dev# -1, root hub/$maxchild ports, $speed Mbps\n";
		}
		next;
	} # end T: line
	elsif ($line =~ "^D:")
	{ # for D: line
		$devclass = @fields [5];
		next;
	}
	else
	{ # for I: line
		$intclass = @fields [9];
		$ifnum    = @fields [2];
		$driver   = @fields [15];
	} # end I: line

	if ($level > 1)
	{
		$temp = $level;
		while ($temp > 1)
		{
			print "    ";
			$temp--;
		}
	}
	
	print sprintf ("|__ Port# $port: Dev# $devnum, If# $ifnum, Class=$devclass, Ifc=$intclass, Driver=$driver%s, $speed Mbps\n",
		($maxchild == 0) ? "" : ("/" . $maxchild . " ports"));
} # end while DEVNUM

close (DEVNUM);
print "\n";

# END.