packages feed

bindings-libusb 1.4 → 1.4.2

raw patch · 3 files changed

+138/−2 lines, 3 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

+ Bindings.Libusb.Asynchronous: mK'libusb_transfer_cb_fn :: C'libusb_transfer_cb_fn -> (Ptr C'libusb_transfer -> IO ())
+ Bindings.Libusb.HandlingAndEnumeration: c'libusb_get_max_iso_packet_size :: Ptr C'libusb_device -> CUChar -> IO CInt
+ Bindings.Libusb.HandlingAndEnumeration: p'libusb_get_max_iso_packet_size :: FunPtr (Ptr C'libusb_device -> CUChar -> IO CInt)
+ Bindings.Libusb.PollingAndTiming: mK'libusb_pollfd_added_cb :: C'libusb_pollfd_added_cb -> (CInt -> CShort -> Ptr () -> IO ())
+ Bindings.Libusb.PollingAndTiming: mK'libusb_pollfd_removed_cb :: C'libusb_pollfd_removed_cb -> (CInt -> Ptr () -> IO ())
- Bindings.Libusb.Asynchronous: c'LIBUSB_TRANSFER_CANCELLED :: (Num a) => a
+ Bindings.Libusb.Asynchronous: c'LIBUSB_TRANSFER_CANCELLED :: Num a => a
- Bindings.Libusb.Asynchronous: c'LIBUSB_TRANSFER_COMPLETED :: (Num a) => a
+ Bindings.Libusb.Asynchronous: c'LIBUSB_TRANSFER_COMPLETED :: Num a => a
- Bindings.Libusb.Asynchronous: c'LIBUSB_TRANSFER_ERROR :: (Num a) => a
+ Bindings.Libusb.Asynchronous: c'LIBUSB_TRANSFER_ERROR :: Num a => a
- Bindings.Libusb.Asynchronous: c'LIBUSB_TRANSFER_FREE_BUFFER :: (Num a) => a
+ Bindings.Libusb.Asynchronous: c'LIBUSB_TRANSFER_FREE_BUFFER :: Num a => a
- Bindings.Libusb.Asynchronous: c'LIBUSB_TRANSFER_FREE_TRANSFER :: (Num a) => a
+ Bindings.Libusb.Asynchronous: c'LIBUSB_TRANSFER_FREE_TRANSFER :: Num a => a
- Bindings.Libusb.Asynchronous: c'LIBUSB_TRANSFER_NO_DEVICE :: (Num a) => a
+ Bindings.Libusb.Asynchronous: c'LIBUSB_TRANSFER_NO_DEVICE :: Num a => a
- Bindings.Libusb.Asynchronous: c'LIBUSB_TRANSFER_OVERFLOW :: (Num a) => a
+ Bindings.Libusb.Asynchronous: c'LIBUSB_TRANSFER_OVERFLOW :: Num a => a
- Bindings.Libusb.Asynchronous: c'LIBUSB_TRANSFER_SHORT_NOT_OK :: (Num a) => a
+ Bindings.Libusb.Asynchronous: c'LIBUSB_TRANSFER_SHORT_NOT_OK :: Num a => a
- Bindings.Libusb.Asynchronous: c'LIBUSB_TRANSFER_STALL :: (Num a) => a
+ Bindings.Libusb.Asynchronous: c'LIBUSB_TRANSFER_STALL :: Num a => a
- Bindings.Libusb.Asynchronous: c'LIBUSB_TRANSFER_TIMED_OUT :: (Num a) => a
+ Bindings.Libusb.Asynchronous: c'LIBUSB_TRANSFER_TIMED_OUT :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_CLASS_AUDIO :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_CLASS_AUDIO :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_CLASS_COMM :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_CLASS_COMM :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_CLASS_DATA :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_CLASS_DATA :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_CLASS_HID :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_CLASS_HID :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_CLASS_HUB :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_CLASS_HUB :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_CLASS_MASS_STORAGE :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_CLASS_MASS_STORAGE :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_CLASS_PER_INTERFACE :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_CLASS_PER_INTERFACE :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_CLASS_PRINTER :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_CLASS_PRINTER :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_CLASS_PTP :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_CLASS_PTP :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_CLASS_VENDOR_SPEC :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_CLASS_VENDOR_SPEC :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_DT_CONFIG :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_DT_CONFIG :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_DT_DEVICE :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_DT_DEVICE :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_DT_ENDPOINT :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_DT_ENDPOINT :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_DT_HID :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_DT_HID :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_DT_HUB :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_DT_HUB :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_DT_INTERFACE :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_DT_INTERFACE :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_DT_PHYSICAL :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_DT_PHYSICAL :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_DT_REPORT :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_DT_REPORT :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_DT_STRING :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_DT_STRING :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_ENDPOINT_IN :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_ENDPOINT_IN :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_ENDPOINT_OUT :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_ENDPOINT_OUT :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_ISO_SYNC_TYPE_ADAPTIVE :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_ISO_SYNC_TYPE_ADAPTIVE :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_ISO_SYNC_TYPE_ASYNC :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_ISO_SYNC_TYPE_ASYNC :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_ISO_SYNC_TYPE_NONE :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_ISO_SYNC_TYPE_NONE :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_ISO_SYNC_TYPE_SYNC :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_ISO_SYNC_TYPE_SYNC :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_ISO_USAGE_TYPE_DATA :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_ISO_USAGE_TYPE_DATA :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_ISO_USAGE_TYPE_FEEDBACK :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_ISO_USAGE_TYPE_FEEDBACK :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_ISO_USAGE_TYPE_IMPLICIT :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_ISO_USAGE_TYPE_IMPLICIT :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_TRANSFER_TYPE_BULK :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_TRANSFER_TYPE_BULK :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_TRANSFER_TYPE_CONTROL :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_TRANSFER_TYPE_CONTROL :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_TRANSFER_TYPE_INTERRUPT :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_TRANSFER_TYPE_INTERRUPT :: Num a => a
- Bindings.Libusb.Descriptors: c'LIBUSB_TRANSFER_TYPE_ISOCHRONOUS :: (Num a) => a
+ Bindings.Libusb.Descriptors: c'LIBUSB_TRANSFER_TYPE_ISOCHRONOUS :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_ERROR_ACCESS :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_ERROR_ACCESS :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_ERROR_BUSY :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_ERROR_BUSY :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_ERROR_INTERRUPTED :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_ERROR_INTERRUPTED :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_ERROR_INVALID_PARAM :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_ERROR_INVALID_PARAM :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_ERROR_IO :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_ERROR_IO :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_ERROR_NOT_FOUND :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_ERROR_NOT_FOUND :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_ERROR_NOT_SUPPORTED :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_ERROR_NOT_SUPPORTED :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_ERROR_NO_DEVICE :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_ERROR_NO_DEVICE :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_ERROR_NO_MEM :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_ERROR_NO_MEM :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_ERROR_OTHER :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_ERROR_OTHER :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_ERROR_OVERFLOW :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_ERROR_OVERFLOW :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_ERROR_PIPE :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_ERROR_PIPE :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_ERROR_TIMEOUT :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_ERROR_TIMEOUT :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_RECIPIENT_DEVICE :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_RECIPIENT_DEVICE :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_RECIPIENT_ENDPOINT :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_RECIPIENT_ENDPOINT :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_RECIPIENT_INTERFACE :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_RECIPIENT_INTERFACE :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_RECIPIENT_OTHER :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_RECIPIENT_OTHER :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_REQUEST_CLEAR_FEATURE :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_REQUEST_CLEAR_FEATURE :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_REQUEST_GET_CONFIGURATION :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_REQUEST_GET_CONFIGURATION :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_REQUEST_GET_DESCRIPTOR :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_REQUEST_GET_DESCRIPTOR :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_REQUEST_GET_INTERFACE :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_REQUEST_GET_INTERFACE :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_REQUEST_GET_STATUS :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_REQUEST_GET_STATUS :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_REQUEST_SET_ADDRESS :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_REQUEST_SET_ADDRESS :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_REQUEST_SET_CONFIGURATION :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_REQUEST_SET_CONFIGURATION :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_REQUEST_SET_DESCRIPTOR :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_REQUEST_SET_DESCRIPTOR :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_REQUEST_SET_FEATURE :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_REQUEST_SET_FEATURE :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_REQUEST_SET_INTERFACE :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_REQUEST_SET_INTERFACE :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_REQUEST_SYNCH_FRAME :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_REQUEST_SYNCH_FRAME :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_REQUEST_TYPE_CLASS :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_REQUEST_TYPE_CLASS :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_REQUEST_TYPE_RESERVED :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_REQUEST_TYPE_RESERVED :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_REQUEST_TYPE_STANDARD :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_REQUEST_TYPE_STANDARD :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_REQUEST_TYPE_VENDOR :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_REQUEST_TYPE_VENDOR :: Num a => a
- Bindings.Libusb.Miscellaneous: c'LIBUSB_SUCCESS :: (Num a) => a
+ Bindings.Libusb.Miscellaneous: c'LIBUSB_SUCCESS :: Num a => a

Files

bindings-libusb.cabal view
@@ -3,7 +3,7 @@ homepage: http://bitbucket.org/mauricio/bindings-libusb synopsis:   Low level bindings to libusb.-version: 1.4+version: 1.4.2 license: BSD3 license-file: LICENSE maintainer: Maurício C. Antunes <mauricio.antunes@gmail.com>@@ -27,5 +27,7 @@     Bindings.Libusb.Miscellaneous     Bindings.Libusb.PollingAndTiming     Bindings.Libusb.Synchronous-  c-sources: src/inlines.c+  c-sources:+    src/inlines.c+    src/core.c   pkgconfig-depends: libusb-1.0 >= 1.0
src/Bindings/Libusb/HandlingAndEnumeration.hsc view
@@ -20,6 +20,7 @@ #ccall libusb_get_device_address , Ptr <libusb_device> -> IO Word8 #ccall libusb_get_max_packet_size , Ptr <libusb_device> -> \   CUChar -> IO CInt+#ccall libusb_get_max_iso_packet_size , Ptr <libusb_device> -> CUChar -> IO CInt #ccall libusb_ref_device , Ptr <libusb_device> -> \   IO (Ptr <libusb_device>) #ccall libusb_unref_device , Ptr <libusb_device> -> IO ()
+ src/core.c view
@@ -0,0 +1,133 @@+/*+ * All code from this file comes from libusb-1.0.5. It is here+ * to provide 'libusb_get_max_iso_packet_size' for those using+ * libusb-1.0.1, and will be removed when at least libusb-1.0.3+ * becomes standard in most popular Linux distributions.+ *+ * This is LGPL code, and should not be mixed with the rest of+ * the source. For details on file authors and history check+ * libusb-1.0.* source package, available on its website.+ */++#include <errno.h>+#include <poll.h>+#include <stdarg.h>+#include <stdio.h>+#include <stdlib.h>+#include <string.h>+#include <sys/types.h>+#include <unistd.h>++#include "libusb.h"++struct libusb_device {+ pthread_mutex_t a; int b;+ struct libusb_context *ctx;+};++enum usbi_log_level {+ LOG_LEVEL_DEBUG,+ LOG_LEVEL_INFO,+ LOG_LEVEL_WARNING,+ LOG_LEVEL_ERROR,+};+++static const struct libusb_endpoint_descriptor *find_endpoint(+ struct libusb_config_descriptor *, unsigned char);++void usbi_log(struct libusb_context *ctx, enum usbi_log_level level,+ const char *function, const char *format, ...)+{+ va_list args;+ FILE *stream = stdout;+ const char *prefix;++ switch (level) {+ case LOG_LEVEL_INFO:+  prefix = "info";+  break;+ case LOG_LEVEL_WARNING:+  stream = stderr;+  prefix = "warning";+  break;+ case LOG_LEVEL_ERROR:+  stream = stderr;+  prefix = "error";+  break;+ case LOG_LEVEL_DEBUG:+  stream = stderr;+  prefix = "debug";+  break;+ default:+  stream = stderr;+  prefix = "unknown";+  break;+ }++ fprintf(stream, "libusb:%s [%s] ", prefix, function);++ va_start (args, format);+ vfprintf(stream, format, args);+ va_end (args);++ fprintf(stream, "\n");+}++int libusb_get_max_iso_packet_size(libusb_device *dev,+ unsigned char endpoint)+{+ struct libusb_config_descriptor *config;+ const struct libusb_endpoint_descriptor *ep;+ enum libusb_transfer_type ep_type;+ uint16_t val;+ int r;++ r = libusb_get_active_config_descriptor(dev, &config);+ if (r < 0) {+  usbi_log((dev)->ctx, 3, __FUNCTION__, "could not retrieve active config descriptor");+  return LIBUSB_ERROR_OTHER;+ }++ ep = find_endpoint(config, endpoint);+ if (!ep)+  return LIBUSB_ERROR_NOT_FOUND;++ val = ep->wMaxPacketSize;+ ep_type = ep->bmAttributes & 0x3;+ libusb_free_config_descriptor(config);++ r = val & 0x07ff;+ if (ep_type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS+   || ep_type == LIBUSB_TRANSFER_TYPE_INTERRUPT)+  r *= (1 + ((val >> 11) & 3));+ return r;+}++static const struct libusb_endpoint_descriptor *find_endpoint(+ struct libusb_config_descriptor *config, unsigned char endpoint)+{+ int iface_idx;+ for (iface_idx = 0; iface_idx < config->bNumInterfaces; iface_idx++) {+  const struct libusb_interface *iface = &config->interface[iface_idx];+  int altsetting_idx;++  for (altsetting_idx = 0; altsetting_idx < iface->num_altsetting;+    altsetting_idx++) {+   const struct libusb_interface_descriptor *altsetting+    = &iface->altsetting[altsetting_idx];+   int ep_idx;++   for (ep_idx = 0; ep_idx < altsetting->bNumEndpoints; ep_idx++) {+    const struct libusb_endpoint_descriptor *ep =+     &altsetting->endpoint[ep_idx];+    if (ep->bEndpointAddress == endpoint)+     return ep;+   }+  }+ }+ return NULL;+}+++