This Haskell library enables you to communicate with USB devices from userspace. It is implemented as a high-level wrapper around bindings-libusb which is a low-level binding to the C library: libusb-1.*.
Install it simply using cabal:
cabal update cabal install usb
The USB transfer functions in this library have a simple synchronous
interface (they block) but are implemented using the
asynchronous interface. They integrate with the GHC event manager
making them efficient (no busy-loops) and interruptible (throwing an
exception to the thread executing a transfer immediately cancels the
If the GHC event manager is not available (because you're either not
using GHC or because you're on Windows) the library degrades
gracefully to the
libusb synchronous implementation.
Documentation & Examples
The API documentation assumes knowledge of how to operate USB devices from a software standpoint (descriptors, configurations, interfaces, endpoints, control/bulk/interrupt/isochronous transfers, etc). Full information can be found in the USB 2.0 Specification.
Also see the usb-safe package which wraps this package and provides some strong safety guarantees for working with USB devices.
Finally have a look at the usb-iteratee package which provides iteratee enumerators for enumerating bulk, interrupt and isochronous endpoints.
Besides the API documentation the following sources might be interesting: