Skip to content

Commit

Permalink
Support for port_numbers hierarchy tuple with libusb1.
Browse files Browse the repository at this point in the history
  • Loading branch information
ecejeff authored and walac committed Jan 1, 2015
1 parent e4811b6 commit 61c82e8
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 2 deletions.
3 changes: 2 additions & 1 deletion tests/test_find.py
Expand Up @@ -52,7 +52,8 @@ def __init__(self, idVendor, idProduct):
self.bDeviceProtocol = 0xff
self.bus = 1
self.address = 1
self.port_number= None
self.port_number = None
self.port_numbers = None

# We are only interested in test usb.find() function, we don't need
# to implement all IBackend stuff
Expand Down
1 change: 1 addition & 0 deletions usb/backend/libusb0.py
Expand Up @@ -185,6 +185,7 @@ def __init__(self, dev):
self.bus = dev.bus[0].location

self.port_number = None
self.port_numbers = None
_lib = None

def _load_library(find_library=None):
Expand Down
25 changes: 25 additions & 0 deletions usb/backend/libusb1.py
Expand Up @@ -546,6 +546,19 @@ def libusb_fill_iso_transfer(_libusb_transfer_p, dev_handle, endpoint, buffer, l
except AttributeError:
pass

try:
# int libusb_get_port_numbers(libusb_device *dev,
# uint8_t* port_numbers,
# int port_numbers_len)
lib.libusb_get_port_numbers.argtypes = [
c_void_p,
POINTER(c_uint8),
c_int
]
lib.libusb_get_port_numbers.restype = c_int
except AttributeError:
pass

#int libusb_handle_events(libusb_context *ctx);
lib.libusb_handle_events.argtypes = [c_void_p]

Expand Down Expand Up @@ -692,6 +705,18 @@ def get_device_descriptor(self, dev):
except AttributeError:
dev_desc.port_number = None

# Only available in newer versions of libusb
try:
buff = (c_uint8 * 7)() # USB 3.0 maximum depth is 7
written = dev_desc.port_numbers = self.lib.libusb_get_port_numbers(
dev.devid, buff, len(buff))
if written > 0:
dev_desc.port_numbers = tuple(buff[:written])
else:
dev_desc.port_numbers = None
except AttributeError:
dev_desc.port_numbers = None

return dev_desc

@methodtrace(_logger)
Expand Down
1 change: 1 addition & 0 deletions usb/backend/openusb.py
Expand Up @@ -561,6 +561,7 @@ def get_device_descriptor(self, dev):
desc.bus = None
desc.address = None
desc.port_number = None
desc.port_numbers = None
return desc

@methodtrace(_logger)
Expand Down
3 changes: 2 additions & 1 deletion usb/core.py
Expand Up @@ -736,7 +736,8 @@ def __init__(self, dev, backend):
'bNumConfigurations',
'address',
'bus',
'port_number'
'port_number',
'port_numbers',
)
)

Expand Down

0 comments on commit 61c82e8

Please sign in to comment.