Copyright | (c) 2009–2012 Bas van Dijk |
---|---|
License | BSD3 (see the file LICENSE) |
Maintainer | Bas van Dijk <v.dijk.bas@gmail.com> |
Safe Haskell | Unsafe |
Language | Haskell98 |
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 CInt
- withDevHndlPtr :: DeviceHandle -> (Ptr C'libusb_device_handle -> IO a) -> IO a
- convertUSBException :: (Num a, Eq a, Show a) => a -> USBException
- unmarshalReleaseNumber :: Word16 -> ReleaseNumber
- unmarshalStrIx :: Word8 -> Maybe StrIx
- marshalEndpointAddress :: (Bits a, Num a) => EndpointAddress -> a
- unmarshalEndpointAddress :: Word8 -> EndpointAddress
- type C'TransferType = CUChar
- getWait :: DeviceHandle -> Maybe Wait
- type Wait = Timeout -> Lock -> Ptr C'libusb_transfer -> IO ()
- allocaTransfer :: Int -> (Ptr C'libusb_transfer -> IO a) -> IO a
- withCallback :: (Ptr C'libusb_transfer -> IO ()) -> (C'libusb_transfer_cb_fn -> IO a) -> IO a
- pokeVector :: forall a. Storable a => Ptr a -> Vector a -> IO ()
- initIsoPacketDesc :: Size -> C'libusb_iso_packet_descriptor
- data Lock
- newLock :: IO Lock
- acquire :: Lock -> IO ()
- release :: Lock -> IO ()
Documentation
type C'TransferFunc = Ptr C'libusb_device_handle -> CUChar -> Ptr CUChar -> CInt -> Ptr CInt -> CUInt -> IO CInt Source
Handy type synonym for the libusb
transfer functions.
withDevHndlPtr :: DeviceHandle -> (Ptr C'libusb_device_handle -> IO a) -> IO a Source
convertUSBException :: (Num a, Eq a, Show a) => a -> USBException Source
Convert a C'libusb_error
to a USBException
. If the C'libusb_error
is
unknown an error
is thrown.
unmarshalReleaseNumber :: Word16 -> ReleaseNumber Source
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 StrIx Source
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.
- Bits 0-3 denote the
endpointNumber
. - Bit 7 denotes the
transferDirection
. 0 denotesOut
and 1 denotesIn
.
marshalEndpointAddress :: (Bits a, Num a) => EndpointAddress -> a Source
Marshal an endpoint address so that it can be used by the libusb
transfer
functions.
unmarshalEndpointAddress :: Word8 -> EndpointAddress Source
Unmarshal an 8bit word as an endpoint address. This function is primarily used when unmarshalling USB descriptors.
Useful types and functions for asynchronous implementations
type C'TransferType = CUChar Source
getWait :: DeviceHandle -> Maybe Wait Source
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 a) -> IO a 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 a) -> IO a 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).
initIsoPacketDesc :: Size -> C'libusb_iso_packet_descriptor Source
An isochronous packet descriptor with all fields zero except for the length.
Locks
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 torelease
in another thread wakes the calling thread. Upon awakening it will change the state to "locked".