1
2
3
4
5
6
7
8
9
10 "Scans the USB busses in the same way that comscan scans comm ports"
11
12 version="$Revision: 3577 $"
13
14 try:
15 import native.usb as usb
16 except ImportError:
17 usb=None
18
19 import guihelper
20 import usb_ids
21
22 ids=None
23 needdriver=None
24
26
27 if usb is None:
28 return []
29
30 global ids
31 if ids is None:
32 ids=usb_ids.usb_ids()
33 ids.add_data(guihelper.getresourcefile("usb.ids"))
34 ids.add_data(guihelper.getresourcefile("bitpim_usb.ids"))
35 global needdriver
36 if needdriver is None:
37 needdriver=[]
38 for line in open(guihelper.getresourcefile("usb_needdriver.ids"), "rt"):
39 line=line.strip()
40 if line.startswith("#") or len(line)==0:
41 continue
42 prod,vend,iface=[int(x, 16) for x in line.split()]
43 needdriver.append( (prod,vend,iface) )
44
45 res=[]
46 usb.UpdateLists()
47 for bus in usb.AllBusses():
48 for device in bus.devices():
49 for iface in device.interfaces():
50 seenin=False
51 seenout=False
52 for ep in iface.endpoints():
53 if ep.isbulk():
54 if ep.direction()==ep.IN:
55 seenin=True
56 else:
57 seenout=True
58 if seenin and seenout:
59
60 name="usb::%s::%s::%d" % (bus.name(), device.name(), iface.number())
61 active=True
62 available=False
63 try:
64 iface.openbulk().close()
65 available=True
66 except:
67 pass
68 v={'name': name, 'active': active, 'available': available,
69 'libusb': True,
70 'usb-vendor#': device.vendor(), 'usb-product#': device.product(),
71 'usb-interface#': iface.number(),
72 'VID': '0x%04X'%device.vendor(),
73 'PID': '0x%04X'%device.product() }
74
75 if ( device.vendor(), device.product(), iface.number() ) in needdriver:
76 v["available"]=False
77 v['driver-required']=True
78
79 vend,prod,i=ids.lookupdevice(device.vendor(), device.product(), iface.number())
80 if vend is None:
81 vend="#%04X" % (device.vendor(),)
82 else:
83 v['usb-vendor']=vend
84 if prod is None:
85 prod="#%04X" % (device.product(),)
86 else:
87 v['usb-product']=prod
88 if i is None:
89 i="#%02X" % (iface.number(),)
90 else:
91 v['usb-interface']=i
92 hwinstance="USB Device - Vendor %s, Product %s, (Interface %s)" % \
93 (vend, prod, i)
94 v['description']=hwinstance
95
96 prot=" / ".join([val for val in ids.lookupclass(*(iface.classdetails())) if val is not None])
97 if len(prot):
98 v["protocol"]=prot
99
100 for n,i in ("usb-vendorstring", device.vendorstring), \
101 ("usb-productstring", device.productstring), \
102 ("usb-serialnumber", device.serialnumber):
103 try:
104 x=i()
105 if x is not None:
106 v[n]=x
107 except:
108 pass
109 res.append(v)
110 return res
111
113 return usb is not None
114
115 if __name__=="__main__":
116 res=usbscan()
117
118 output="UsbScan "+version+"\n\n"
119
120 for r in res:
121 rkeys=r.keys()
122 rkeys.sort()
123
124 output+=r['name']+":\n"
125 offset=0
126 for rk in rkeys:
127 if rk=='name': continue
128 v=r[rk]
129 if not isinstance(v, type("")): v=`v`
130 op=' %s: %s ' % (rk, v)
131 if offset+len(op)>78:
132 output+="\n"+op
133 offset=len(op)+1
134 else:
135 output+=op
136 offset+=len(op)
137
138 if output[-1]!="\n":
139 output+="\n"
140 output+="\n"
141 offset=0
142
143 print output
144