usb- Communicate with USB devices

MaintainerBas van Dijk <>
Safe HaskellUnsafe




This module is not intended for end users. It provides internal and unsafe functions used for extending this package.



type C'TransferFunc = Ptr C'libusb_device_handle -> CUChar -> Ptr CUChar -> CInt -> Ptr CInt -> CUInt -> IO CIntSource

Handy type synonym for the libusb transfer functions.

convertUSBException :: (Num α, Eq α, Show α) => α -> USBExceptionSource

Convert a C'libusb_error to a USBException. If the C'libusb_error is unknown an error is thrown.

unmarshalReleaseNumber :: Word16 -> ReleaseNumberSource

Unmarshal a a 16bit word as a release number. The 16bit word should be encoded as a Binary Coded Decimal using 4 bits for each of the 4 decimals.

unmarshalStrIx :: Word8 -> Maybe StrIxSource

Unmarshal an 8bit word to a string descriptor index. 0 denotes that a string descriptor is not available and unmarshals to Nothing.

Marshal and unmarshal endpoint addresses

The address should be encoded according to section 9.6.6 of the USB 2.0 specification.

marshalEndpointAddress :: (Bits α, Num α) => EndpointAddress -> αSource

Marshal an endpoint address so that it can be used by the libusb transfer functions.

unmarshalEndpointAddress :: Word8 -> EndpointAddressSource

Unmarshal an 8bit word as an endpoint address. This function is primarily used when unmarshalling USB descriptors.

Useful types and functions for asynchronous implementations

getWait :: DeviceHandle -> Maybe WaitSource

Checks if the system supports asynchronous I/O.

  • Nothing means asynchronous I/O is not supported so synchronous I/O should be used instead.
  • Just wait means that asynchronous I/O is supported. The wait function can be used to wait for submitted transfers.

type Wait = Timeout -> Lock -> Ptr C'libusb_transfer -> IO ()Source

A function to wait for the termination of a submitted transfer.

allocaTransfer :: Int -> (Ptr C'libusb_transfer -> IO α) -> IO αSource

Allocate a transfer with the given number of isochronous packets and apply the function to the resulting pointer. The transfer is automatically freed when the function terminates (whether normally or by raising an exception).

A NoMemException may be thrown.

withCallback :: (Ptr C'libusb_transfer -> IO ()) -> (C'libusb_transfer_cb_fn -> IO α) -> IO αSource

Create a FunPtr to the given transfer callback function and pass it to the continuation function. The FunPtr is automatically freed when the continuation terminates (whether normally or by raising an exception).

data SumLength Source

Strict pair of sum and length.


SumLength !Int !Int 

sumLength :: [Int] -> SumLengthSource

Simultaneously calculate the sum and length of the given list.

peekIsoPacketDescs :: Int -> Ptr C'libusb_transfer -> IO [C'libusb_iso_packet_descriptor]Source

Retrieve the isochronous packet descriptors from the given transfer.

initIsoPacketDesc :: Size -> C'libusb_iso_packet_descriptorSource

An isochronous packet descriptor with all fields zero except for the length.


data Lock Source

A lock is in one of two states: "locked" or "unlocked".


newLock :: IO LockSource

Create a lock in the "unlocked" state.

acquire :: Lock -> IO ()Source

Acquires the Lock. Blocks if another thread has acquired the Lock.

acquire behaves as follows:

  • When the state is "unlocked" acquire changes the state to "locked".
  • When the state is "locked" acquire blocks until a call to release in another thread wakes the calling thread. Upon awakening it will change the state to "locked".

release :: Lock -> IO ()Source

release changes the state to "unlocked" and returns immediately.

The behaviour is undefined when a lock in the "unlocked" state is released!

If there are any threads blocked on acquire the thread that first called acquire will be woken up.