usb1._libusb1: Do not load C library on import. Avoids unusual exceptions being raised during import. Allows the application to customise C library lookup.
diff --git a/README.rst b/README.rst index 31e055a..5ad0575 100644 --- a/README.rst +++ b/README.rst
@@ -513,6 +513,9 @@ ?.?.? ----- +Do not load the C library on import. Allows applications to customise the +lookup logic (see `usb1.loadLibrary`). + Add LIBUSB_SPEED_SUPER_PLUS. Better control device iterator end of life.
diff --git a/usb1/__init__.py b/usb1/__init__.py index 016e723..b8aeaf8 100644 --- a/usb1/__init__.py +++ b/usb1/__init__.py
@@ -58,7 +58,7 @@ import functools import contextlib import inspect -from . import libusb1 +from . import _libusb1 as libusb1 # pylint: disable=wrong-import-order,ungrouped-imports if sys.platform == 'win32': from ctypes import get_last_error as get_errno @@ -71,6 +71,7 @@ 'USBPoller', 'USBTransfer', 'USBTransferHelper', 'EVENT_CALLBACK_SET', 'USBEndpoint', 'USBInterfaceSetting', 'USBInterface', 'USBConfiguration', 'DoomedTransferError', 'getVersion', 'USBError', + 'loadLibrary', ] # Bind libusb1 constants and libusb1.USBError to this module, so user does not # have to import two modules. @@ -467,6 +468,8 @@ unregisterFinalizer, handle=finalizer_handle, ), + libusb_free_transfer=libusb1.libusb_free_transfer, + libusb_cancel_transfer=libusb1.libusb_cancel_transfer, ) registerFinalizer(finalizer_handle, self.__close) @@ -500,9 +503,9 @@ transfer, context, unregisterFinalizer, + libusb_free_transfer, + libusb_cancel_transfer, - libusb_free_transfer=libusb1.libusb_free_transfer, - libusb_cancel_transfer=libusb1.libusb_cancel_transfer, # pylint: disable=undefined-variable USBErrorInterrupted_=USBErrorInterrupted, # pylint: enable=undefined-variable @@ -1240,6 +1243,7 @@ unregisterFinalizer, handle=finalizer_handle, ), + libusb_close=libusb1.libusb_close, ) registerFinalizer(finalizer_handle, self.close) @@ -1259,9 +1263,9 @@ inflight, finalizer_dict, unregisterFinalizer, + libusb_close, set_=set, - libusb_close=libusb1.libusb_close, # pylint: disable=undefined-variable USBErrorNotFound_=USBErrorNotFound, USBErrorNoDevice_=USBErrorNoDevice, @@ -1969,6 +1973,8 @@ handle=finalizer_handle, ), descriptor_list=descriptor_list, + libusb_unref_device=libusb1.libusb_unref_device, + libusb_free_config_descriptor=libusb1.libusb_free_config_descriptor, ) registerFinalizer(finalizer_handle, self.close) self.device_p = device_p @@ -2015,10 +2021,10 @@ finalizer_dict, unregisterFinalizer, descriptor_list, + libusb_unref_device, + libusb_free_config_descriptor, byref_=byref, - libusb_unref_device=libusb1.libusb_unref_device, - libusb_free_config_descriptor=libusb1.libusb_free_config_descriptor, ): while finalizer_dict: for handle, finalizer in list(finalizer_dict.items()): @@ -2292,7 +2298,7 @@ __auto_open = True __has_pollfd_finalizer = False __mayRaiseUSBError = mayRaiseUSBError - __libusb_handle_events = libusb1.libusb_handle_events + __libusb_handle_events = None # pylint: disable=no-self-argument,protected-access def _validContext(func): @@ -2379,9 +2385,13 @@ form: this means there are ways to avoid calling close(), which can cause issues particularly hard to debug (ex: interpreter hangs on exit). + + Calls loadLibrary. """ assert self.__context_refcount == 0 assert not self.__context_p + loadLibrary() + self.__libusb_handle_events = libusb1.libusb_handle_events mayRaiseUSBError(libusb1.libusb_init(byref(self.__context_p))) self.__close = weakref_finalize( self, @@ -2389,6 +2399,8 @@ context_p=self.__context_p, hotplug_callback_dict=self.__hotplug_callback_dict, finalizer_dict=self.__finalizer_dict, + libusb_exit=libusb1.libusb_exit, + libusb_hotplug_deregister_callback=libusb1.libusb_hotplug_deregister_callback, ) return self @@ -2428,9 +2440,8 @@ context_p, hotplug_callback_dict, finalizer_dict, - - libusb_exit=libusb1.libusb_exit, - libusb_hotplug_deregister_callback=libusb1.libusb_hotplug_deregister_callback, + libusb_exit, + libusb_hotplug_deregister_callback, ): while hotplug_callback_dict: # Duplicates hotplugDeregisterCallback logic, to avoid finalizer @@ -2643,6 +2654,7 @@ self, self.__finalizePollFDNotifiers, # Note: staticmethod context_p=self.__context_p, + libusb_set_pollfd_notifiers=libusb1.libusb_set_pollfd_notifiers, ), ) except ValueError: # Already registered @@ -2651,11 +2663,11 @@ @staticmethod def __finalizePollFDNotifiers( context_p, + libusb_set_pollfd_notifiers, null_pointer=_null_pointer, added_cb_p=cast(_null_pointer, libusb1.libusb_pollfd_added_cb_p), removed_cb_p=cast(_null_pointer, libusb1.libusb_pollfd_removed_cb_p), - libusb_set_pollfd_notifiers=libusb1.libusb_set_pollfd_notifiers, ): libusb_set_pollfd_notifiers( context_p, @@ -2871,7 +2883,10 @@ - rc - describe Returns (0, 0, 0, 0, '', '') if libusb doesn't have required entry point. + + Calls loadLibrary. """ + loadLibrary() version = libusb1.libusb_get_version().contents return Version( version.major, @@ -2891,7 +2906,10 @@ CAP_HAS_HOTPLUG CAP_HAS_HID_ACCESS CAP_SUPPORTS_DETACH_KERNEL_DRIVER + + Calls loadLibrary. """ + loadLibrary() return libusb1.libusb_has_capability(capability) class LibUSBContext(USBContext): @@ -2905,6 +2923,8 @@ ) super(LibUSBContext, self).__init__() +loadLibrary = libusb1.loadLibrary + from ._version import get_versions __version__ = get_versions()['version'] del get_versions
diff --git a/usb1/_libusb1.py b/usb1/_libusb1.py index 24b6acb..543b0d8 100644 --- a/usb1/_libusb1.py +++ b/usb1/_libusb1.py
@@ -22,7 +22,7 @@ You should not need to import this if you use usb1 module. Declares all constants, data structures and exported symbols. -Locates and loads libusb1 dynamic library. +Some are only available after calling loadLibrary. """ from ctypes import ( Structure, LittleEndianStructure, @@ -36,6 +36,7 @@ import os.path import platform import sys +from threading import Lock class Enum(object): def __init__(self, member_dict, scope_dict=None): @@ -139,7 +140,7 @@ ('tv_usec', c_long)] timeval_p = POINTER(timeval) -def _loadLibrary(): +def __getLibrary(): system = platform.system() if system == 'Windows': dll_loader = ctypes.WinDLL @@ -182,7 +183,450 @@ raise return dll_loader(libusb_path, use_errno=True, use_last_error=True) -libusb = _loadLibrary() +__load_lock = Lock() +__loaded = False + +def loadLibrary(libusb=None): + """ + Load C library. + + libusb (ctypes.CDLL, ctypes.WinDLL, None) + If None, the C library will be searched for in several platform- + dependent paths. + Otherwise, this is the C library to use as libusb. This is to allow + customising library lookup logic. + + Only the first call actually loads the library. + + Returns True if any of the following is true: + - the library was loaded by this call + - libusb argument is None + - libusb argument is the same object that was initially loaded. + """ + global __loaded + if not __loaded: # avoid touching the lock if we are already loaded + with __load_lock: + if not __loaded: # we were not loaded, check again under lock + __loadLibrary(libusb) + __loaded = True + return True + return libusb is None or globals()['libusb'] is libusb + +def __loadLibrary(libusb): + # WARNING: every local in this function will be stored in + # globals . Treat this namespace the same as the module's. + if libusb is None: + libusb = __getLibrary() + + _libusb_transfer_fields = [ + ('dev_handle', libusb_device_handle_p), + ('flags', c_uint8), + ('endpoint', c_uchar), + ('type', c_uchar), + ('timeout', c_uint), + ('status', c_int), # enum libusb_transfer_status + ('length', c_int), + ('actual_length', c_int), + ('callback', libusb_transfer_cb_fn_p), + ('user_data', c_void_p), + ('buffer', c_void_p), + ('num_iso_packets', c_int), + ('iso_packet_desc', libusb_iso_packet_descriptor) + ] + if 'FreeBSD' in platform.system() and getattr( + libusb, 'libusb_get_string_descriptor', None + ) is None: + # Old FreeBSD version has a slight ABI incompatibility. + # Work around it unless libusb_get_string_descriptor is available, as it + # is only available on fixed versions. + assert _libusb_transfer_fields[2][0] == 'endpoint' + _libusb_transfer_fields[2] = ('endpoint', c_uint32) + assert _libusb_transfer_fields[11][0] == 'num_iso_packets' + _libusb_transfer_fields.insert(11, ('os_priv', c_void_p)) + + # pylint: disable=protected-access + libusb_transfer._fields_ = _libusb_transfer_fields + # pylint: enable=protected-access + + #int libusb_init(libusb_context **ctx); + libusb_init = libusb.libusb_init + libusb_init.argtypes = [libusb_context_p_p] + #void libusb_exit(libusb_context *ctx); + libusb_exit = libusb.libusb_exit + libusb_exit.argtypes = [libusb_context_p] + libusb_exit.restype = None + #void libusb_set_debug(libusb_context *ctx, int level); + libusb_set_debug = libusb.libusb_set_debug + libusb_set_debug.argtypes = [libusb_context_p, c_int] + libusb_set_debug.restype = None + #const struct libusb_version * libusb_get_version(void); + try: + libusb_get_version = libusb.libusb_get_version + except AttributeError: + _dummy_version = libusb_version(0, 0, 0, 0, b'', b'') + _dummy_version_p = pointer(_dummy_version) + def libusb_get_version(): + return _dummy_version_p + else: + libusb_get_version.argtypes = [] + libusb_get_version.restype = POINTER(libusb_version) + #int libusb_has_capability(uint32_t capability); + try: + libusb_has_capability = libusb.libusb_has_capability + except AttributeError: + def libusb_has_capability(_): + return 0 + else: + libusb_has_capability.argtypes = [c_uint32] + libusb_has_capability.restype = c_int + try: + # Note: Should be equivalent to libusb_error.get (except libusb_error.get + # one raises on unknown values). + #char *libusb_error_name(int errcode); + libusb_error_name = libusb.libusb_error_name + except AttributeError: + # pylint: disable=unused-argument + def libusb_error_name(errcode): + return None + # pylint: enable=unused-argument + else: + libusb_error_name.argtypes = [c_int] + libusb_error_name.restype = c_char_p + #ssize_t libusb_get_device_list(libusb_context *ctx, + # libusb_device ***list); + libusb_get_device_list = libusb.libusb_get_device_list + libusb_get_device_list.argtypes = [libusb_context_p, libusb_device_p_p_p] + libusb_get_device_list.restype = c_ssize_t + #void libusb_free_device_list(libusb_device **list, int unref_devices); + libusb_free_device_list = libusb.libusb_free_device_list + libusb_free_device_list.argtypes = [libusb_device_p_p, c_int] + libusb_free_device_list.restype = None + #libusb_device *libusb_ref_device(libusb_device *dev); + libusb_ref_device = libusb.libusb_ref_device + libusb_ref_device.argtypes = [libusb_device_p] + libusb_ref_device.restype = libusb_device_p + #void libusb_unref_device(libusb_device *dev); + libusb_unref_device = libusb.libusb_unref_device + libusb_unref_device.argtypes = [libusb_device_p] + libusb_unref_device.restype = None + + #int libusb_get_configuration(libusb_device_handle *dev, int *config); + libusb_get_configuration = libusb.libusb_get_configuration + libusb_get_configuration.argtypes = [libusb_device_handle_p, c_int_p] + #int libusb_get_device_descriptor(libusb_device *dev, + # struct libusb_device_descriptor *desc); + libusb_get_device_descriptor = libusb.libusb_get_device_descriptor + libusb_get_device_descriptor.argtypes = [ + libusb_device_p, libusb_device_descriptor_p] + #int libusb_get_active_config_descriptor(libusb_device *dev, + # struct libusb_config_descriptor **config); + libusb_get_active_config_descriptor = libusb.libusb_get_active_config_descriptor + libusb_get_active_config_descriptor.argtypes = [ + libusb_device_p, libusb_config_descriptor_p_p] + #int libusb_get_config_descriptor(libusb_device *dev, uint8_t config_index, + # struct libusb_config_descriptor **config); + libusb_get_config_descriptor = libusb.libusb_get_config_descriptor + libusb_get_config_descriptor.argtypes = [ + libusb_device_p, c_uint8, libusb_config_descriptor_p_p] + #int libusb_get_config_descriptor_by_value(libusb_device *dev, + # uint8_t bConfigurationValue, struct libusb_config_descriptor **config); + libusb_get_config_descriptor_by_value = \ + libusb.libusb_get_config_descriptor_by_value + libusb_get_config_descriptor_by_value.argtypes = [ + libusb_device_p, c_uint8, libusb_config_descriptor_p_p] + #void libusb_free_config_descriptor(struct libusb_config_descriptor *config); + libusb_free_config_descriptor = libusb.libusb_free_config_descriptor + libusb_free_config_descriptor.argtypes = [libusb_config_descriptor_p] + libusb_free_config_descriptor.restype = None + #uint8_t libusb_get_bus_number(libusb_device *dev); + libusb_get_bus_number = libusb.libusb_get_bus_number + libusb_get_bus_number.argtypes = [libusb_device_p] + libusb_get_bus_number.restype = c_uint8 + try: + #uint8_t libusb_get_port_number(libusb_device *dev); + libusb_get_port_number = libusb.libusb_get_port_number + except AttributeError: + pass + else: + libusb_get_port_number.argtypes = [libusb_device_p] + libusb_get_port_number.restype = c_uint8 + try: + #int libusb_get_port_numbers(libusb_device *dev, + # uint8_t* port_numbers, int port_numbers_len); + libusb_get_port_numbers = libusb.libusb_get_port_numbers + except AttributeError: + pass + else: + libusb_get_port_numbers.argtypes = [ + libusb_device_p, POINTER(c_uint8), c_int] + libusb_get_port_numbers.restype = c_int + # Missing: libusb_get_port_path (deprecated since 1.0.16) + try: + #libusb_device * LIBUSB_CALL libusb_get_parent(libusb_device *dev); + libusb_get_parent = libusb.libusb_get_parent + except AttributeError: + pass + else: + libusb_get_parent.argtypes = [libusb_device_p] + libusb_get_parent.restype = libusb_device_p + #uint8_t libusb_get_device_address(libusb_device *dev); + libusb_get_device_address = libusb.libusb_get_device_address + libusb_get_device_address.argtypes = [libusb_device_p] + libusb_get_device_address.restype = c_uint8 + try: + #int libusb_get_device_speed(libusb_device *dev); + libusb_get_device_speed = libusb.libusb_get_device_speed + except AttributeError: + # Place holder + def libusb_get_device_speed(_): + # pylint: disable=undefined-variable + return LIBUSB_SPEED_UNKNOWN + # pylint: enable=undefined-variable + else: + libusb_get_device_speed.argtypes = [libusb_device_p] + #int libusb_get_max_packet_size(libusb_device *dev, unsigned char endpoint); + libusb_get_max_packet_size = libusb.libusb_get_max_packet_size + libusb_get_max_packet_size.argtypes = [libusb_device_p, c_uchar] + #int libusb_get_max_iso_packet_size(libusb_device *dev, unsigned char endpoint); + try: + libusb_get_max_iso_packet_size = libusb.libusb_get_max_iso_packet_size + except AttributeError: + # FreeBSD's reimplementation of the API [used to ]lack[s] this function. + # It has been added in r234193, but is lacking in default 9.x install as + # of this change. Provide a fallback to error-out only if actually used. + # pylint: disable=unused-argument + def libusb_get_max_iso_packet_size(_, __): + raise NotImplementedError + # pylint: enable=unused-argument + else: + libusb_get_max_iso_packet_size.argtypes = [libusb_device_p, c_uchar] + + #int libusb_open(libusb_device *dev, libusb_device_handle **handle); + libusb_open = libusb.libusb_open + libusb_open.argtypes = [libusb_device_p, libusb_device_handle_p_p] + #void libusb_close(libusb_device_handle *dev_handle); + libusb_close = libusb.libusb_close + libusb_close.argtypes = [libusb_device_handle_p] + libusb_close.restype = None + #libusb_device *libusb_get_device(libusb_device_handle *dev_handle); + libusb_get_device = libusb.libusb_get_device + libusb_get_device.argtypes = [libusb_device_handle_p] + libusb_get_device.restype = libusb_device_p + + #int libusb_set_configuration(libusb_device_handle *dev, int configuration); + libusb_set_configuration = libusb.libusb_set_configuration + libusb_set_configuration.argtypes = [libusb_device_handle_p, c_int] + #int libusb_claim_interface(libusb_device_handle *dev, int iface); + libusb_claim_interface = libusb.libusb_claim_interface + libusb_claim_interface.argtypes = [libusb_device_handle_p, c_int] + #int libusb_release_interface(libusb_device_handle *dev, int iface); + libusb_release_interface = libusb.libusb_release_interface + libusb_release_interface.argtypes = [libusb_device_handle_p, c_int] + + #libusb_device_handle *libusb_open_device_with_vid_pid(libusb_context *ctx, + # uint16_t vendor_id, uint16_t product_id); + libusb_open_device_with_vid_pid = libusb.libusb_open_device_with_vid_pid + libusb_open_device_with_vid_pid.argtypes = [ + libusb_context_p, c_uint16, c_uint16] + libusb_open_device_with_vid_pid.restype = libusb_device_handle_p + + #int libusb_set_interface_alt_setting(libusb_device_handle *dev, + # int interface_number, int alternate_setting); + libusb_set_interface_alt_setting = libusb.libusb_set_interface_alt_setting + libusb_set_interface_alt_setting.argtypes = [ + libusb_device_handle_p, c_int, c_int] + #int libusb_clear_halt(libusb_device_handle *dev, unsigned char endpoint); + libusb_clear_halt = libusb.libusb_clear_halt + libusb_clear_halt.argtypes = [libusb_device_handle_p, c_uchar] + #int libusb_reset_device(libusb_device_handle *dev); + libusb_reset_device = libusb.libusb_reset_device + libusb_reset_device.argtypes = [libusb_device_handle_p] + + #int libusb_kernel_driver_active(libusb_device_handle *dev, int interface); + libusb_kernel_driver_active = libusb.libusb_kernel_driver_active + libusb_kernel_driver_active.argtypes = [libusb_device_handle_p, c_int] + #int libusb_detach_kernel_driver(libusb_device_handle *dev, int interface); + libusb_detach_kernel_driver = libusb.libusb_detach_kernel_driver + libusb_detach_kernel_driver.argtypes = [libusb_device_handle_p, c_int] + #int libusb_attach_kernel_driver(libusb_device_handle *dev, int interface); + libusb_attach_kernel_driver = libusb.libusb_attach_kernel_driver + libusb_attach_kernel_driver.argtypes = [libusb_device_handle_p, c_int] + try: + #int libusb_set_auto_detach_kernel_driver( + # libusb_device_handle *dev, int enable); + libusb_set_auto_detach_kernel_driver = \ + libusb.libusb_set_auto_detach_kernel_driver + except AttributeError: + pass + else: + libusb_set_auto_detach_kernel_driver.argtypes = [ + libusb_device_handle_p, c_int] + libusb_set_auto_detach_kernel_driver.restype = c_int + + #struct libusb_transfer *libusb_alloc_transfer(int iso_packets); + libusb_alloc_transfer = libusb.libusb_alloc_transfer + libusb_alloc_transfer.argtypes = [c_int] + libusb_alloc_transfer.restype = libusb_transfer_p + #int libusb_submit_transfer(struct libusb_transfer *transfer); + libusb_submit_transfer = libusb.libusb_submit_transfer + libusb_submit_transfer.argtypes = [libusb_transfer_p] + #int libusb_cancel_transfer(struct libusb_transfer *transfer); + libusb_cancel_transfer = libusb.libusb_cancel_transfer + libusb_cancel_transfer.argtypes = [libusb_transfer_p] + #void libusb_free_transfer(struct libusb_transfer *transfer); + libusb_free_transfer = libusb.libusb_free_transfer + libusb_free_transfer.argtypes = [libusb_transfer_p] + libusb_free_transfer.restype = None + + # sync I/O + + #int libusb_control_transfer(libusb_device_handle *dev_handle, + # uint8_t request_type, uint8_t request, uint16_t value, uint16_t index, + # unsigned char *data, uint16_t length, unsigned int timeout); + libusb_control_transfer = libusb.libusb_control_transfer + libusb_control_transfer.argtypes = [libusb_device_handle_p, c_uint8, c_uint8, + c_uint16, c_uint16, c_void_p, c_uint16, + c_uint] + + #int libusb_bulk_transfer(libusb_device_handle *dev_handle, + # unsigned char endpoint, unsigned char *data, int length, + # int *actual_length, unsigned int timeout); + libusb_bulk_transfer = libusb.libusb_bulk_transfer + libusb_bulk_transfer.argtypes = [libusb_device_handle_p, c_uchar, c_void_p, + c_int, c_int_p, c_uint] + + #int libusb_interrupt_transfer(libusb_device_handle *dev_handle, + # unsigned char endpoint, unsigned char *data, int length, + # int *actual_length, unsigned int timeout); + libusb_interrupt_transfer = libusb.libusb_interrupt_transfer + libusb_interrupt_transfer.argtypes = [libusb_device_handle_p, c_uchar, + c_void_p, c_int, c_int_p, c_uint] + + #int libusb_get_string_descriptor_ascii(libusb_device_handle *dev, + # uint8_t index, unsigned char *data, int length); + libusb_get_string_descriptor_ascii = libusb.libusb_get_string_descriptor_ascii + libusb_get_string_descriptor_ascii.argtypes = [libusb_device_handle_p, + c_uint8, c_void_p, c_int] + + # polling and timeouts + + #int libusb_try_lock_events(libusb_context *ctx); + libusb_try_lock_events = libusb.libusb_try_lock_events + libusb_try_lock_events.argtypes = [libusb_context_p] + #void libusb_lock_events(libusb_context *ctx); + libusb_lock_events = libusb.libusb_lock_events + libusb_lock_events.argtypes = [libusb_context_p] + #void libusb_unlock_events(libusb_context *ctx); + libusb_unlock_events = libusb.libusb_unlock_events + libusb_unlock_events.argtypes = [libusb_context_p] + libusb_unlock_events.restype = None + #int libusb_event_handling_ok(libusb_context *ctx); + libusb_event_handling_ok = libusb.libusb_event_handling_ok + libusb_event_handling_ok.argtypes = [libusb_context_p] + #int libusb_event_handler_active(libusb_context *ctx); + libusb_event_handler_active = libusb.libusb_event_handler_active + libusb_event_handler_active.argtypes = [libusb_context_p] + #void libusb_lock_event_waiters(libusb_context *ctx); + libusb_lock_event_waiters = libusb.libusb_lock_event_waiters + libusb_lock_event_waiters.argtypes = [libusb_context_p] + libusb_lock_event_waiters.restype = None + #void libusb_unlock_event_waiters(libusb_context *ctx); + libusb_unlock_event_waiters = libusb.libusb_unlock_event_waiters + libusb_unlock_event_waiters.argtypes = [] + libusb_unlock_event_waiters.restype = None + #int libusb_wait_for_event(libusb_context *ctx, struct timeval *tv); + libusb_wait_for_event = libusb.libusb_wait_for_event + libusb_wait_for_event.argtypes = [libusb_context_p, timeval_p] + + #int libusb_handle_events_timeout(libusb_context *ctx, struct timeval *tv); + libusb_handle_events_timeout = libusb.libusb_handle_events_timeout + libusb_handle_events_timeout.argtypes = [libusb_context_p, timeval_p] + #int libusb_handle_events_timeout_completed(libusb_context *ctx, + # struct timeval *tv, int *completed); + try: + libusb_handle_events_timeout_completed = libusb.\ + libusb_handle_events_timeout_completed + except AttributeError: + # No safe replacement possible. + pass + else: + libusb_handle_events_timeout_completed.argtypes = [ + libusb_context_p, timeval_p, c_int_p] + #int libusb_handle_events(libusb_context *ctx); + libusb_handle_events = libusb.libusb_handle_events + libusb_handle_events.argtypes = [libusb_context_p] + #int libusb_handle_events_completed(libusb_context *ctx, int *completed); + try: + libusb_handle_events_completed = libusb.libusb_handle_events_completed + except AttributeError: + # No safe replacement possible. + pass + else: + libusb_handle_events_completed.argtypes = [libusb_context_p, c_int_p] + #int libusb_handle_events_locked(libusb_context *ctx, struct timeval *tv); + libusb_handle_events_locked = libusb.libusb_handle_events_locked + libusb_handle_events_locked.argtypes = [libusb_context_p, timeval_p] + #int libusb_get_next_timeout(libusb_context *ctx, struct timeval *tv); + libusb_get_next_timeout = libusb.libusb_get_next_timeout + libusb_get_next_timeout.argtypes = [libusb_context_p, timeval_p] + + #const struct libusb_pollfd **libusb_get_pollfds(libusb_context *ctx); + libusb_get_pollfds = libusb.libusb_get_pollfds + libusb_get_pollfds.argtypes = [libusb_context_p] + libusb_get_pollfds.restype = libusb_pollfd_p_p + #void libusb_set_pollfd_notifiers(libusb_context *ctx, + # libusb_pollfd_added_cb added_cb, libusb_pollfd_removed_cb removed_cb, + # void *user_data); + libusb_set_pollfd_notifiers = libusb.libusb_set_pollfd_notifiers + libusb_set_pollfd_notifiers.argtypes = [libusb_context_p, + libusb_pollfd_added_cb_p, + libusb_pollfd_removed_cb_p, py_object] + libusb_set_pollfd_notifiers.restype = None + try: + #void libusb_get_pollfds(const struct libusb_pollfd **); + libusb_free_pollfds = libusb.libusb_free_pollfds + libusb_free_pollfds.argtypes = [libusb_pollfd_p_p] + libusb_free_pollfds.restype = None + except AttributeError: + # Not a safe replacement in general, but the versions of libusb that lack + # libusb_free_pollfds() only provide that function on *nix, where + # Python's free() and libusb's free() are ~always the same anyways. + libusb_free_pollfds = CDLL(None).free + + #int libusb_hotplug_register_callback(libusb_context *ctx, + # libusb_hotplug_event events, libusb_hotplug_flag flags, + # int vendor_id, int product_id, int dev_class, + # libusb_hotplug_callback_fn cb_fn, void *user_data, + # libusb_hotplug_callback_handle *handle); + try: + libusb_hotplug_register_callback = libusb.libusb_hotplug_register_callback + except AttributeError: + pass + else: + libusb_hotplug_register_callback.argtypes = [ + libusb_context_p, + c_int, c_int, + c_int, c_int, c_int, + libusb_hotplug_callback_fn_p, c_void_p, + POINTER(libusb_hotplug_callback_handle), + ] + libusb_hotplug_register_callback.restype = c_int + + #void libusb_hotplug_deregister_callback(libusb_context *ctx, + # libusb_hotplug_callback_handle handle); + try: + libusb_hotplug_deregister_callback = \ + libusb.libusb_hotplug_deregister_callback + except AttributeError: + pass + else: + libusb_hotplug_deregister_callback.argtypes = [ + libusb_context_p, + libusb_hotplug_callback_handle, + ] + libusb_hotplug_deregister_callback.restype = None + + globals().update(locals()) # libusb.h def bswap16(x): @@ -662,36 +1106,6 @@ libusb_transfer_cb_fn_p = CFUNCTYPE(None, libusb_transfer_p) -_libusb_transfer_fields = [ - ('dev_handle', libusb_device_handle_p), - ('flags', c_uint8), - ('endpoint', c_uchar), - ('type', c_uchar), - ('timeout', c_uint), - ('status', c_int), # enum libusb_transfer_status - ('length', c_int), - ('actual_length', c_int), - ('callback', libusb_transfer_cb_fn_p), - ('user_data', c_void_p), - ('buffer', c_void_p), - ('num_iso_packets', c_int), - ('iso_packet_desc', libusb_iso_packet_descriptor) -] -if 'FreeBSD' in platform.system() and getattr( - libusb, 'libusb_get_string_descriptor', None - ) is None: - # Old FreeBSD version has a slight ABI incompatibility. - # Work around it unless libusb_get_string_descriptor is available, as it - # is only available on fixed versions. - assert _libusb_transfer_fields[2][0] == 'endpoint' - _libusb_transfer_fields[2] = ('endpoint', c_uint32) - assert _libusb_transfer_fields[11][0] == 'num_iso_packets' - _libusb_transfer_fields.insert(11, ('os_priv', c_void_p)) - -# pylint: disable=protected-access -libusb_transfer._fields_ = _libusb_transfer_fields -# pylint: enable=protected-access - libusb_capability = Enum({ # The libusb_has_capability() API is available. 'LIBUSB_CAP_HAS_CAPABILITY': 0x0000, @@ -711,51 +1125,6 @@ 'LIBUSB_LOG_LEVEL_DEBUG': 4, }) -#int libusb_init(libusb_context **ctx); -libusb_init = libusb.libusb_init -libusb_init.argtypes = [libusb_context_p_p] -#void libusb_exit(libusb_context *ctx); -libusb_exit = libusb.libusb_exit -libusb_exit.argtypes = [libusb_context_p] -libusb_exit.restype = None -#void libusb_set_debug(libusb_context *ctx, int level); -libusb_set_debug = libusb.libusb_set_debug -libusb_set_debug.argtypes = [libusb_context_p, c_int] -libusb_set_debug.restype = None -#const struct libusb_version * libusb_get_version(void); -try: - libusb_get_version = libusb.libusb_get_version -except AttributeError: - _dummy_version = libusb_version(0, 0, 0, 0, b'', b'') - _dummy_version_p = pointer(_dummy_version) - def libusb_get_version(): - return _dummy_version_p -else: - libusb_get_version.argtypes = [] - libusb_get_version.restype = POINTER(libusb_version) -#int libusb_has_capability(uint32_t capability); -try: - libusb_has_capability = libusb.libusb_has_capability -except AttributeError: - def libusb_has_capability(_): - return 0 -else: - libusb_has_capability.argtypes = [c_uint32] - libusb_has_capability.restype = c_int -try: - # Note: Should be equivalent to libusb_error.get (except libusb_error.get - # one raises on unknown values). - #char *libusb_error_name(int errcode); - libusb_error_name = libusb.libusb_error_name -except AttributeError: - # pylint: disable=unused-argument - def libusb_error_name(errcode): - return None - # pylint: enable=unused-argument -else: - libusb_error_name.argtypes = [c_int] - libusb_error_name.restype = c_char_p - # Note on libusb_strerror, libusb_setlocale and future functions in the # same spirit: # I do not think end-user-facing messages belong to a technical library. @@ -768,177 +1137,6 @@ return None # pylint: enable=unused-argument -#ssize_t libusb_get_device_list(libusb_context *ctx, -# libusb_device ***list); -libusb_get_device_list = libusb.libusb_get_device_list -libusb_get_device_list.argtypes = [libusb_context_p, libusb_device_p_p_p] -libusb_get_device_list.restype = c_ssize_t -#void libusb_free_device_list(libusb_device **list, int unref_devices); -libusb_free_device_list = libusb.libusb_free_device_list -libusb_free_device_list.argtypes = [libusb_device_p_p, c_int] -libusb_free_device_list.restype = None -#libusb_device *libusb_ref_device(libusb_device *dev); -libusb_ref_device = libusb.libusb_ref_device -libusb_ref_device.argtypes = [libusb_device_p] -libusb_ref_device.restype = libusb_device_p -#void libusb_unref_device(libusb_device *dev); -libusb_unref_device = libusb.libusb_unref_device -libusb_unref_device.argtypes = [libusb_device_p] -libusb_unref_device.restype = None - -#int libusb_get_configuration(libusb_device_handle *dev, int *config); -libusb_get_configuration = libusb.libusb_get_configuration -libusb_get_configuration.argtypes = [libusb_device_handle_p, c_int_p] -#int libusb_get_device_descriptor(libusb_device *dev, -# struct libusb_device_descriptor *desc); -libusb_get_device_descriptor = libusb.libusb_get_device_descriptor -libusb_get_device_descriptor.argtypes = [ - libusb_device_p, libusb_device_descriptor_p] -#int libusb_get_active_config_descriptor(libusb_device *dev, -# struct libusb_config_descriptor **config); -libusb_get_active_config_descriptor = libusb.libusb_get_active_config_descriptor -libusb_get_active_config_descriptor.argtypes = [ - libusb_device_p, libusb_config_descriptor_p_p] -#int libusb_get_config_descriptor(libusb_device *dev, uint8_t config_index, -# struct libusb_config_descriptor **config); -libusb_get_config_descriptor = libusb.libusb_get_config_descriptor -libusb_get_config_descriptor.argtypes = [ - libusb_device_p, c_uint8, libusb_config_descriptor_p_p] -#int libusb_get_config_descriptor_by_value(libusb_device *dev, -# uint8_t bConfigurationValue, struct libusb_config_descriptor **config); -libusb_get_config_descriptor_by_value = \ - libusb.libusb_get_config_descriptor_by_value -libusb_get_config_descriptor_by_value.argtypes = [ - libusb_device_p, c_uint8, libusb_config_descriptor_p_p] -#void libusb_free_config_descriptor(struct libusb_config_descriptor *config); -libusb_free_config_descriptor = libusb.libusb_free_config_descriptor -libusb_free_config_descriptor.argtypes = [libusb_config_descriptor_p] -libusb_free_config_descriptor.restype = None -#uint8_t libusb_get_bus_number(libusb_device *dev); -libusb_get_bus_number = libusb.libusb_get_bus_number -libusb_get_bus_number.argtypes = [libusb_device_p] -libusb_get_bus_number.restype = c_uint8 -try: - #uint8_t libusb_get_port_number(libusb_device *dev); - libusb_get_port_number = libusb.libusb_get_port_number -except AttributeError: - pass -else: - libusb_get_port_number.argtypes = [libusb_device_p] - libusb_get_port_number.restype = c_uint8 -try: - #int libusb_get_port_numbers(libusb_device *dev, - # uint8_t* port_numbers, int port_numbers_len); - libusb_get_port_numbers = libusb.libusb_get_port_numbers -except AttributeError: - pass -else: - libusb_get_port_numbers.argtypes = [ - libusb_device_p, POINTER(c_uint8), c_int] - libusb_get_port_numbers.restype = c_int -# Missing: libusb_get_port_path (deprecated since 1.0.16) -try: - #libusb_device * LIBUSB_CALL libusb_get_parent(libusb_device *dev); - libusb_get_parent = libusb.libusb_get_parent -except AttributeError: - pass -else: - libusb_get_parent.argtypes = [libusb_device_p] - libusb_get_parent.restype = libusb_device_p -#uint8_t libusb_get_device_address(libusb_device *dev); -libusb_get_device_address = libusb.libusb_get_device_address -libusb_get_device_address.argtypes = [libusb_device_p] -libusb_get_device_address.restype = c_uint8 -try: - #int libusb_get_device_speed(libusb_device *dev); - libusb_get_device_speed = libusb.libusb_get_device_speed -except AttributeError: - # Place holder - def libusb_get_device_speed(_): - # pylint: disable=undefined-variable - return LIBUSB_SPEED_UNKNOWN - # pylint: enable=undefined-variable -else: - libusb_get_device_speed.argtypes = [libusb_device_p] -#int libusb_get_max_packet_size(libusb_device *dev, unsigned char endpoint); -libusb_get_max_packet_size = libusb.libusb_get_max_packet_size -libusb_get_max_packet_size.argtypes = [libusb_device_p, c_uchar] -#int libusb_get_max_iso_packet_size(libusb_device *dev, unsigned char endpoint); -try: - libusb_get_max_iso_packet_size = libusb.libusb_get_max_iso_packet_size -except AttributeError: - # FreeBSD's reimplementation of the API [used to ]lack[s] this function. - # It has been added in r234193, but is lacking in default 9.x install as - # of this change. Provide a fallback to error-out only if actually used. - # pylint: disable=unused-argument - def libusb_get_max_iso_packet_size(_, __): - raise NotImplementedError - # pylint: enable=unused-argument -else: - libusb_get_max_iso_packet_size.argtypes = [libusb_device_p, c_uchar] - -#int libusb_open(libusb_device *dev, libusb_device_handle **handle); -libusb_open = libusb.libusb_open -libusb_open.argtypes = [libusb_device_p, libusb_device_handle_p_p] -#void libusb_close(libusb_device_handle *dev_handle); -libusb_close = libusb.libusb_close -libusb_close.argtypes = [libusb_device_handle_p] -libusb_close.restype = None -#libusb_device *libusb_get_device(libusb_device_handle *dev_handle); -libusb_get_device = libusb.libusb_get_device -libusb_get_device.argtypes = [libusb_device_handle_p] -libusb_get_device.restype = libusb_device_p - -#int libusb_set_configuration(libusb_device_handle *dev, int configuration); -libusb_set_configuration = libusb.libusb_set_configuration -libusb_set_configuration.argtypes = [libusb_device_handle_p, c_int] -#int libusb_claim_interface(libusb_device_handle *dev, int iface); -libusb_claim_interface = libusb.libusb_claim_interface -libusb_claim_interface.argtypes = [libusb_device_handle_p, c_int] -#int libusb_release_interface(libusb_device_handle *dev, int iface); -libusb_release_interface = libusb.libusb_release_interface -libusb_release_interface.argtypes = [libusb_device_handle_p, c_int] - -#libusb_device_handle *libusb_open_device_with_vid_pid(libusb_context *ctx, -# uint16_t vendor_id, uint16_t product_id); -libusb_open_device_with_vid_pid = libusb.libusb_open_device_with_vid_pid -libusb_open_device_with_vid_pid.argtypes = [ - libusb_context_p, c_uint16, c_uint16] -libusb_open_device_with_vid_pid.restype = libusb_device_handle_p - -#int libusb_set_interface_alt_setting(libusb_device_handle *dev, -# int interface_number, int alternate_setting); -libusb_set_interface_alt_setting = libusb.libusb_set_interface_alt_setting -libusb_set_interface_alt_setting.argtypes = [ - libusb_device_handle_p, c_int, c_int] -#int libusb_clear_halt(libusb_device_handle *dev, unsigned char endpoint); -libusb_clear_halt = libusb.libusb_clear_halt -libusb_clear_halt.argtypes = [libusb_device_handle_p, c_uchar] -#int libusb_reset_device(libusb_device_handle *dev); -libusb_reset_device = libusb.libusb_reset_device -libusb_reset_device.argtypes = [libusb_device_handle_p] - -#int libusb_kernel_driver_active(libusb_device_handle *dev, int interface); -libusb_kernel_driver_active = libusb.libusb_kernel_driver_active -libusb_kernel_driver_active.argtypes = [libusb_device_handle_p, c_int] -#int libusb_detach_kernel_driver(libusb_device_handle *dev, int interface); -libusb_detach_kernel_driver = libusb.libusb_detach_kernel_driver -libusb_detach_kernel_driver.argtypes = [libusb_device_handle_p, c_int] -#int libusb_attach_kernel_driver(libusb_device_handle *dev, int interface); -libusb_attach_kernel_driver = libusb.libusb_attach_kernel_driver -libusb_attach_kernel_driver.argtypes = [libusb_device_handle_p, c_int] -try: - #int libusb_set_auto_detach_kernel_driver( - # libusb_device_handle *dev, int enable); - libusb_set_auto_detach_kernel_driver = \ - libusb.libusb_set_auto_detach_kernel_driver -except AttributeError: - pass -else: - libusb_set_auto_detach_kernel_driver.argtypes = [ - libusb_device_handle_p, c_int] - libusb_set_auto_detach_kernel_driver.restype = c_int - # Get the data section of a control transfer. This convenience function is here # to remind you that the data does not start until 8 bytes into the actual # buffer, as the setup packet comes first. @@ -967,21 +1165,6 @@ setup.wIndex = libusb_cpu_to_le16(wIndex) setup.wLength = libusb_cpu_to_le16(wLength) -#struct libusb_transfer *libusb_alloc_transfer(int iso_packets); -libusb_alloc_transfer = libusb.libusb_alloc_transfer -libusb_alloc_transfer.argtypes = [c_int] -libusb_alloc_transfer.restype = libusb_transfer_p -#int libusb_submit_transfer(struct libusb_transfer *transfer); -libusb_submit_transfer = libusb.libusb_submit_transfer -libusb_submit_transfer.argtypes = [libusb_transfer_p] -#int libusb_cancel_transfer(struct libusb_transfer *transfer); -libusb_cancel_transfer = libusb.libusb_cancel_transfer -libusb_cancel_transfer.argtypes = [libusb_transfer_p] -#void libusb_free_transfer(struct libusb_transfer *transfer); -libusb_free_transfer = libusb.libusb_free_transfer -libusb_free_transfer.argtypes = [libusb_transfer_p] -libusb_free_transfer.restype = None - # pylint: disable=redefined-builtin def libusb_fill_control_transfer( transfer_p, dev_handle, buffer, callback, user_data, timeout): @@ -1131,28 +1314,6 @@ # sync I/O -#int libusb_control_transfer(libusb_device_handle *dev_handle, -# uint8_t request_type, uint8_t request, uint16_t value, uint16_t index, -# unsigned char *data, uint16_t length, unsigned int timeout); -libusb_control_transfer = libusb.libusb_control_transfer -libusb_control_transfer.argtypes = [libusb_device_handle_p, c_uint8, c_uint8, - c_uint16, c_uint16, c_void_p, c_uint16, - c_uint] - -#int libusb_bulk_transfer(libusb_device_handle *dev_handle, -# unsigned char endpoint, unsigned char *data, int length, -# int *actual_length, unsigned int timeout); -libusb_bulk_transfer = libusb.libusb_bulk_transfer -libusb_bulk_transfer.argtypes = [libusb_device_handle_p, c_uchar, c_void_p, - c_int, c_int_p, c_uint] - -#int libusb_interrupt_transfer(libusb_device_handle *dev_handle, -# unsigned char endpoint, unsigned char *data, int length, -# int *actual_length, unsigned int timeout); -libusb_interrupt_transfer = libusb.libusb_interrupt_transfer -libusb_interrupt_transfer.argtypes = [libusb_device_handle_p, c_uchar, - c_void_p, c_int, c_int_p, c_uint] - # pylint: disable=undefined-variable def libusb_get_descriptor(dev, desc_type, desc_index, data, length): return libusb_control_transfer(dev, LIBUSB_ENDPOINT_IN, @@ -1169,74 +1330,8 @@ langid, data, length, 1000) # pylint: enable=undefined-variable -#int libusb_get_string_descriptor_ascii(libusb_device_handle *dev, -# uint8_t index, unsigned char *data, int length); -libusb_get_string_descriptor_ascii = libusb.libusb_get_string_descriptor_ascii -libusb_get_string_descriptor_ascii.argtypes = [libusb_device_handle_p, - c_uint8, c_void_p, c_int] - # polling and timeouts -#int libusb_try_lock_events(libusb_context *ctx); -libusb_try_lock_events = libusb.libusb_try_lock_events -libusb_try_lock_events.argtypes = [libusb_context_p] -#void libusb_lock_events(libusb_context *ctx); -libusb_lock_events = libusb.libusb_lock_events -libusb_lock_events.argtypes = [libusb_context_p] -#void libusb_unlock_events(libusb_context *ctx); -libusb_unlock_events = libusb.libusb_unlock_events -libusb_unlock_events.argtypes = [libusb_context_p] -libusb_unlock_events.restype = None -#int libusb_event_handling_ok(libusb_context *ctx); -libusb_event_handling_ok = libusb.libusb_event_handling_ok -libusb_event_handling_ok.argtypes = [libusb_context_p] -#int libusb_event_handler_active(libusb_context *ctx); -libusb_event_handler_active = libusb.libusb_event_handler_active -libusb_event_handler_active.argtypes = [libusb_context_p] -#void libusb_lock_event_waiters(libusb_context *ctx); -libusb_lock_event_waiters = libusb.libusb_lock_event_waiters -libusb_lock_event_waiters.argtypes = [libusb_context_p] -libusb_lock_event_waiters.restype = None -#void libusb_unlock_event_waiters(libusb_context *ctx); -libusb_unlock_event_waiters = libusb.libusb_unlock_event_waiters -libusb_unlock_event_waiters.argtypes = [] -libusb_unlock_event_waiters.restype = None -#int libusb_wait_for_event(libusb_context *ctx, struct timeval *tv); -libusb_wait_for_event = libusb.libusb_wait_for_event -libusb_wait_for_event.argtypes = [libusb_context_p, timeval_p] - -#int libusb_handle_events_timeout(libusb_context *ctx, struct timeval *tv); -libusb_handle_events_timeout = libusb.libusb_handle_events_timeout -libusb_handle_events_timeout.argtypes = [libusb_context_p, timeval_p] -#int libusb_handle_events_timeout_completed(libusb_context *ctx, -# struct timeval *tv, int *completed); -try: - libusb_handle_events_timeout_completed = libusb.\ - libusb_handle_events_timeout_completed -except AttributeError: - # No safe replacement possible. - pass -else: - libusb_handle_events_timeout_completed.argtypes = [ - libusb_context_p, timeval_p, c_int_p] -#int libusb_handle_events(libusb_context *ctx); -libusb_handle_events = libusb.libusb_handle_events -libusb_handle_events.argtypes = [libusb_context_p] -#int libusb_handle_events_completed(libusb_context *ctx, int *completed); -try: - libusb_handle_events_completed = libusb.libusb_handle_events_completed -except AttributeError: - # No safe replacement possible. - pass -else: - libusb_handle_events_completed.argtypes = [libusb_context_p, c_int_p] -#int libusb_handle_events_locked(libusb_context *ctx, struct timeval *tv); -libusb_handle_events_locked = libusb.libusb_handle_events_locked -libusb_handle_events_locked.argtypes = [libusb_context_p, timeval_p] -#int libusb_get_next_timeout(libusb_context *ctx, struct timeval *tv); -libusb_get_next_timeout = libusb.libusb_get_next_timeout -libusb_get_next_timeout.argtypes = [libusb_context_p, timeval_p] - class libusb_pollfd(Structure): _fields_ = [ ('fd', c_int), @@ -1248,29 +1343,6 @@ libusb_pollfd_added_cb_p = CFUNCTYPE(None, c_int, c_short, py_object) libusb_pollfd_removed_cb_p = CFUNCTYPE(None, c_int, py_object) -#const struct libusb_pollfd **libusb_get_pollfds(libusb_context *ctx); -libusb_get_pollfds = libusb.libusb_get_pollfds -libusb_get_pollfds.argtypes = [libusb_context_p] -libusb_get_pollfds.restype = libusb_pollfd_p_p -#void libusb_set_pollfd_notifiers(libusb_context *ctx, -# libusb_pollfd_added_cb added_cb, libusb_pollfd_removed_cb removed_cb, -# void *user_data); -libusb_set_pollfd_notifiers = libusb.libusb_set_pollfd_notifiers -libusb_set_pollfd_notifiers.argtypes = [libusb_context_p, - libusb_pollfd_added_cb_p, - libusb_pollfd_removed_cb_p, py_object] -libusb_set_pollfd_notifiers.restype = None -try: - #void libusb_get_pollfds(const struct libusb_pollfd **); - libusb_free_pollfds = libusb.libusb_free_pollfds - libusb_free_pollfds.argtypes = [libusb_pollfd_p_p] - libusb_free_pollfds.restype = None -except AttributeError: - # Not a safe replacement in general, but the versions of libusb that lack - # libusb_free_pollfds() only provide that function on *nix, where - # Python's free() and libusb's free() are ~always the same anyways. - libusb_free_pollfds = CDLL(None).free - #typedef int libusb_hotplug_callback_handle; libusb_hotplug_callback_handle = c_int @@ -1290,37 +1362,4 @@ libusb_hotplug_callback_fn_p = CFUNCTYPE( c_int, libusb_context_p, libusb_device_p, c_int, c_void_p) -#int libusb_hotplug_register_callback(libusb_context *ctx, -# libusb_hotplug_event events, libusb_hotplug_flag flags, -# int vendor_id, int product_id, int dev_class, -# libusb_hotplug_callback_fn cb_fn, void *user_data, -# libusb_hotplug_callback_handle *handle); -try: - libusb_hotplug_register_callback = libusb.libusb_hotplug_register_callback -except AttributeError: - pass -else: - libusb_hotplug_register_callback.argtypes = [ - libusb_context_p, - c_int, c_int, - c_int, c_int, c_int, - libusb_hotplug_callback_fn_p, c_void_p, - POINTER(libusb_hotplug_callback_handle), - ] - libusb_hotplug_register_callback.restype = c_int - -#void libusb_hotplug_deregister_callback(libusb_context *ctx, -# libusb_hotplug_callback_handle handle); -try: - libusb_hotplug_deregister_callback = \ - libusb.libusb_hotplug_deregister_callback -except AttributeError: - pass -else: - libusb_hotplug_deregister_callback.argtypes = [ - libusb_context_p, - libusb_hotplug_callback_handle, - ] - libusb_hotplug_deregister_callback.restype = None - # /libusb.h
diff --git a/usb1/libusb1.py b/usb1/libusb1.py index 15834a5..14527f5 100644 --- a/usb1/libusb1.py +++ b/usb1/libusb1.py
@@ -15,4 +15,6 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA from __future__ import absolute_import +from ._libusb1 import loadLibrary +loadLibrary() from ._libusb1 import *