Module usbscan
[hide private]
[frames] | no frames]

Source Code for Module usbscan

  1  ### BITPIM 
  2  ### 
  3  ### Copyright (C) 2003-2004 Roger Binns <rogerb@rogerbinns.com> 
  4  ### 
  5  ### This program is free software; you can redistribute it and/or modify 
  6  ### it under the terms of the BitPim license as detailed in the LICENSE file. 
  7  ### 
  8  ### $Id: usbscan.py 3577 2006-09-15 23:28:56Z djpham $ 
  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   
25 -def usbscan(*args, **kwargs):
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 # we now have a device/interface that has bidirectional bulk endpoints 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
112 -def isusbsupported():
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