Linux device detection: Parse /proc/bus/usb/devices directly instead of using libusb

This commit is contained in:
Kovid Goyal 2009-08-28 11:37:24 -06:00
parent fc9053e907
commit 841ccff5d2

View File

@ -5,10 +5,9 @@ Device scanner that fetches list of devices on system ina platform dependent
manner.
'''
import sys
import sys, re, os
from calibre import iswindows, isosx, plugins
from calibre.devices import libusb
osx_scanner = win_scanner = linux_scanner = None
@ -22,16 +21,38 @@ elif isosx:
osx_scanner = plugins['usbobserver'][0].get_usb_devices
except:
raise RuntimeError('Failed to load the usbobserver plugin: %s'%plugins['usbobserver'][1])
else:
linux_scanner = libusb.get_devices
_usb_re = re.compile(r'Vendor\s*=\s*([0-9a-fA-F]+)\s+ProdID\s*=\s*([0-9a-fA-F]+)\s+Rev\s*=\s*([0-9a-fA-f.]+)')
_DEVICES = '/proc/bus/usb/devices'
def linux_scanner():
raw = open(_DEVICES).read()
devices = []
device = None
for x in raw.splitlines():
x = x.strip()
if x.startswith('T:'):
if device:
devices.append(device)
device = []
if device is not None and x.startswith('P:'):
match = _usb_re.search(x)
if match is not None:
ven, prod, bcd = match.group(1), match.group(2), match.group(3)
ven, prod, bcd = int(ven, 16), int(prod, 16), int(bcd.replace('.', ''), 16)
device = [ven, prod, bcd]
if device:
devices.append(device)
return devices
class DeviceScanner(object):
def __init__(self, *args):
if isosx and osx_scanner is None:
raise RuntimeError('The Python extension usbobserver must be available on OS X.')
if not (isosx or iswindows) and not libusb.has_library():
raise RuntimeError('DeviceScanner requires libusb to work.')
if not (isosx or iswindows) and not os.access(_DEVICES, os.R_OK):
raise RuntimeError('DeviceScanner requires %s to work.'%_DEVICES)
self.scanner = win_scanner if iswindows else osx_scanner if isosx else linux_scanner
self.devices = []