libusb: user-space usb library


Table of Contents:

	1.0 	libusb: user-space usb library

	2.0 	Opensource applications that use libusb

	3.0 	libusb interfaces and data structures
		& writing libusb applications



-------------------------------------
1.0 	libusb: user-space usb library
-------------------------------------
	libusb is a usb library/API that lets user-space applications
	access and operate usb devices.  The library contains interfaces for 
	managing USB devices  without a kernel driver.  It is an opensource API 
	that is also supported on Linux, MacOS X, and  NetBSD.    
	See http://libusb.sourceforge.net.

	libusb has been implemented for both Sun Ray and Solaris platforms
	using the interfaces defined in the usb.h header file.

	For solaris please refer to ugen(7d) man page of how to bind ugen to
	devices before accessing them via libusb. This is not needed for Sun Ray.
	Note that in most cases explicitly binding ugen to the device is not
	needed, particularly if no driver has been found for the device.

	For the latest on USB, refer to:
	http://www.sun.com/io
	http://www.sun.com/io_technologies/USB-Faq.html

LICENSE
	usb.h has been licensed under LGPL and BSD.

AUTHOR
	Johannes Erdfelt started the libusb project, did the libusb implementation 
	for linux and is responsible for the libusb API definition.
	Solaris and Sun Ray implementations were done by Sun based on
	the interfaces in usb.h.


	To Build and Compile:
	--------------------

	cc [ flag... ] -I/usr/include file... \
	-L/usr/lib -R/usr/lib\
	-lusb  [ library... ]

     	#include <usb.h>

	Files
	-----

	/usr/lib/libusb.so.1        shared object

	/usr/lib/libusb_plugins     implementation-specific
                                     	libusb plugins directory
					{libusbut.so.1, libusbugen.so.1}


     	/usr/bin/libusb-config      script to determine linking
                                     	environment

     	/usr/include/usb.h          libusb header file


	Packages  
	--------

	The following packages are available:

	SUNWlibusb      Sun's libusb wrapper library that handles Solaris and 
		        Sun Ray plugin
	SUNWlibusbS	source

	SUNWlibusbugen  Solaris libusb plugin
	SUNWlibusbugenS	source

	The following package is installed as part of SRSS 3.0 and later
	installations:

	SUNWlibusbut    Sun Ray libusb plugin


	Environment Variables:
	----------------------

	Sun's libusb implementation makes use of a number of environment 
	variables

	SUN_LIBUSB_ALLBUS
	To access devices attached to Sun Ray usb port and also the
	Sun Ray server usb port.

	SUN_LIBUSBPLUGIN_DIR
	To change path of the libusb plugins. Default location is
	/usr/lib/libusb_plugins.

	SUN_LIBUSB_DEBUG
	SUN_LIBUSBUGEN_DEBUG
	SUN_LIBUSBUT_DEBUG

	The above are variables used to enable debugging at various
	levels in wrapper library and plugins. 
	Each can be set to values from 1 to 5 with 5 being the most
	verbose/detailed.

	Setting the environment variable SUN_LIBUSB_DEBUG will enable
	debugging at that level for both the wrapper and any platform-specific
	libraries that the wrapper loads. If the variable SUN_LIBUSBUGEN_DEBUG
	(ugen) or SUN_LIBUSBUT_DEBUG (Sun Ray) is also set, it will take
	precedence.

	The environment variables overrides what the application sets by
	calling usb_set_debug().

-----------------------------------------------
2.0 	Opensource applications that use libusb
-----------------------------------------------

There are a number of opensource applications that make use of the libusb 
library to drive the backends for a range of usb based devices like image 
scanners, digital still cameras, palm pilots, and others.  We will only cover 
some of these here but there are others and there always exists the option for the
user to write their own libusb application for the device of interest.

For now please check the Sun Download Center (www.sun.com/software/download)
for solaris binaries of these packages and documentation.
One may also check www.sun.com site for skeleton drivers and sample code or
send may to usb-help@sun.com for the latest status on porting libusb applications
to Solaris.

blastwave (http://www.blastwave.org) and www.sunfreeware.com are sites that
host solaris binaries for a host of opensrc applications.

To build the following please use gmake and gcc for simplicity.
Have /usr/bin in your path to build and run the open source applications.
(The /usr packages are required to build and run these apps).

The following package is also required to run certain apps if you do not have 
the gnu environment. This can be downloaded from www.sunfreeware.com.
	SMClibgcc     [libgcc-3.4.1-sol9-sparc-local.gz]


--------
2.1 SANE
--------

SANE stands for (Scanner Access Now Easy).  Information on SANE can be found at
http://www.sane-project.org.  It is a framework that consists of backends that
make use of libusb to drive the various usb scanners and frontends that are 
used for displaying the image acquired.

To Build SANE

      1. Please only work with SANE v1.0.14 or later and
         always build with posix thread enabled.

Building the SANE Backend package

      1. Extract the sane-backend package

      2. cd into the sane-backend directory

      3. run configure to generate the makefiles etc
            e.g. LD_LIBRARY_PATH=/usr/lib configure \
		 --oldincludedir=/usr/include \
		 --prefix=/opt/sane --disable-fork-process

      4. use gmake to build SANE
            e.g. LD_LIBRARY_PATH=/usr/lib gmake -e MAKE=gmake

      5. run gmake install 

* [ Note the disable-fork-process option above ]


Building the SANE Frontend package

      1. Extract the sane-frontend package

      2. cd into the sane-frontend directory

      3. Make sure /opt/sane/bin is in your path (this is required to locate 
	 the sane backend)

      4. run configure to generate the makefiles etc.
            e.g. LD_LIBRARY_PATH=/usr/lib configure --prefix=/opt/sane

      5. use gmake to build SANE
            e.g. LD_LIBRARY_PATH=/usr/lib gmake -e MAKE=gmake

      6. run gmake install 


To Use SANE

      Run the sane frontends scanimage or xscanimage (GUI)

      1. scanimage --help
      2. xscanimage --help

NOTE:	sane/etc/sane.d dir has conf files for each scanner driver 
	and may need entries that specify the usb vid/pid of the device.
	Some scanners require a firmware upload and the entry in the
	.conf file needs to be filled in with the path and f/w file


------------------
2.2 Gphoto & gtkam
------------------

Gphoto can be used to drive usb based digital still cameras.
http://www.gphoto.org/

Gphoto & gtkam are installed in /usr/bin and generally there is no need
to build the binaries. However, instructions are below.

Packages available are:

SUNWgnome-camera	-  GNOME Digital Camera Tool
SUNWgnome-camera-devel	-  GNOME Digital Camera Tool  - developer files
SUNWgnome-camera-share	-  GNOME Digital Camera Tool - platform independent files
							/usr/share


To Build Gphoto (libgphoto package)
(using version 2.1.4 and up)

      1. Extract the libgphoto package 

      2. cd into the libgphoto directory

      3. Make sure /usr/bin is in your path

      4. Run configure to build the make files
            e.g. LD_LIBRARY_PATH=/usr/lib ./configure --prefix=/opt/gphoto \
	         --oldincludedir=/usr/include 

      5. use gmake to build libgphoto

      6. run gmake install 


Building the Gphoto2 package

      1. Extract the gphoto package

      2. cd into the gphoto directory

      3. Run configure to build the make files
            e.g. PKG_CONFIG_PATH=/opt/gphoto/lib/pkgconfig ./configure \
		 --prefix=/opt/gphoto --without-pkgconfig --without-readline 

      4. Edit Makefile in the gphoto2 sub directory to include -lgphoto2
	 and -lgphoto2_port to the lines the begin with LIBS= 
	 e.g. LIBS = -lgphoto2 -lgphoto2_port

      5. use gmake to build gphoto
            e.g. gmake -e MAKE=gmake -e CFLAGS=-I/usr/include

      6. run gmake install 


To Use gphoto

      1. Run the command gphoto2 --help

      2. Use gphoto2 -P to download pictures from the digital camera to the
         current directory.

For example:

%  /usr/bin/gphoto2 --auto-detect
Model                          Port                                            
----------------------------------------------------------
Canon PowerShot S110           usb: 
           
% cd /tmp
% /usr/bin/gphoto2 --get-all-thumbnails
Detected a 'Canon:PowerShot S110'.                                             
Downloading 'IMG_2207.JPG' from folder '/DCIM/122CANON'...
Downloading 'IMG_2207.JPG' from folder '/DCIM/122CANON'...
Saving file as thumb_IMG_2207.jpg
Downloading 'IMG_2208.JPG' from folder '/DCIM/122CANON'...
Downloading 'IMG_2208.JPG' from folder '/DCIM/122CANON'...
Saving file as thumb_IMG_2208.jpg

alternatively, use gtkam, select your camera and view the pictures
(This is a gui).
%  /usr/bin/gtkam


--------------
2.3 pilot-xfer
--------------

pilot-xfer is installed in /usr/bin. Refer to pilot-xfer(1).

pilot-xfer allows the user to install databases contained in
the  standard  .prc  (Palm  Resource  Database),  .pdb (Palm
Record Database), and .pqa (Palm Query Application)  formats
onto  a  Palm,  retrieve  databases  from the Palm, list the
databases contained in a Palm, and backup or restore all  of
the databases at once, and many other powerful operations.

The following packages are available:

SUNWpltlk	- includes pilot-xfer, libpisock, libpisync	
SUNWpltlkS	- source package

------------
2.4 ColdSync
------------

pilot-xfer is preferred over ColdSync.
http://www.coldsync.org/

(using version 3.0-pre4)
To build ColdSync

      1. Extract the coldsync package

      2. cd into the coldsync directory

      3. Run configure to build the make files 

      4. Run configure to build the make files
            e.g LDFLAGS=-L/usr/lib CFLAGS=-I/usr/include ./configure \
	        --prefix=/tmp/coldsync --with-libusb

      5. If solaris 9 edit the file src/config.c and add the function below
         to the code

int     setenv(name, value, clobber)
char   *name;
char   *value;
int     clobber;
{
    char   *malloc();
    char   *getenv();
    char   *cp;

    if (clobber == 0 && getenv(name) != 0)
        return (0);
    if ((cp = malloc(strlen(name) + strlen(value) + 2)) == 0)
        return (1);
    sprintf(cp, "%s=%s", name, value);
    return (putenv(cp));
}

      6. The code suffers from endian issues relating to the numports in the file 
         libpconn/PConnection_libusb.c in particular the function pconn_libusb_open().
	 To fix this for big endian machines add the line shown below before the
	 following code:

      for (i = 0; i < ci.numPorts; i++) {
               IO_TRACE(2)
               fprintf(stderr,
                       "ConnectionInfo: entry %d function %s on port %d\n",
                       i,
                       (ci.connections[i].portFunctionID <= hs_usbfun_MAX)
                         ? hs_usb_functions[ci.connections[i].portFunctionID]
                         : "unknown",
                       ci.connections[i].port);

               if (ci.connections[i].portFunctionID == hs_usbfun_Hotsync)
                       u->hotsync_ep = ci.connections[i].port;
       }

      Line to add for big endian machines (sparc)

     ci.numPorts=(((ci.numPorts &0xff) <<8) | (((ci.numPorts) & 0xff00) >> 8));

      7. type gmake to build coldsync

      8. type gmake install to install coldsync


To use ColdSync

      1. Run the command coldsync --help

      2. Use coldsync -m list -t libusb to list files.

      3. Use coldsync -t libusb -mb /tmp to backup device to /tmp directory

------------------------
2.5 USB CCID IFD Handler
------------------------

This is the opensource USB CCID IFD Handler built to operate
with the Solaris Smartcard Framework. It supports a number
of USB CCID compliant smartcard readers.
Refer to usb_ccid_ifd(3SMARTCARD).

Packages available are:

SUNWusbccid	- ifdh_usbccid.so
SUNWusbccidS	- the source package



-------------------------------------------------
3.0 	libusb data structures and interfaces and 
	writing libusb applications
-------------------------------------------------

3.1 libusb data structures and interfaces

3.2 Writing libusb applications


Please also see the programming info/docs in http://www.libusb.sourceforge.net


3.1 libusb data structures and interfaces
-----------------------------------------

Data Structures:

    usb_descriptor_header -- standard USB descriptor header
    usb_device_descriptor -- standard USB device descriptor
    usb_config_descriptor -- standard USB configuration descriptor with
                           some extras
    usb_interface_descriptor -- stardard USB interface descriptor with some
                           extras
    usb_endpoint_descriptor -- standard USB endpoint descriptor with some
                           extras
    usb_hid_descriptor  -- standard USB HID descriptor
    usb_string_descriptor -- standard string descriptor

    usb_ctrl_setup      -- standard USB setup bytes

- Libusb data structures

    usb_bus             -- structure describing a USB bus in the system
    usb_device          -- structure describing a device on a USB bus
    usb_interface       -- structure describing a USB interface

- Initialization and discovery

    usb_init            -- Initializes libusb
    usb_find_busses     -- Finds all USB busses in the system
    usb_find_devices    -- Finds all devices on all USB busses
    usb_busses          -- Linked list of USB busses in the system
    usb_get_busses      -- Returns usb_busses

- Device operations

    usb_open            -- Opens a USB device
    usb_close           -- Closes a USB device
    usb_claim_interface -- Claim an interface of a device
    usb_release_interface -- Releases a previously claimed interface

- Control Transfers

    usb_control_msg     -- Send a control message to a device
    usb_get_string      -- Retrieves a string descriptor from a device
    usb_get_string_simple -- Retrieves a string descriptor from a device
                            using the first language
    usb_get_descriptor  -- Retrieves the Device / Config Descriptor
    usb_get_descriptor_by_endpoint -- Retrieves Descriptor using non default
				      control endpint (*)

    usb_set_configuration -- Sets the active configuration of a device
    usb_set_altinterface -- Sets the active alternate setting of the
                            current interface
    usb_clear_halt      -- Clears any halt status on an endpoint
    usb_resetep         -- Resets state of an endpoint
    usb_reset           -- Resets a device

- Bulk Transfers

    usb_bulk_write      -- Write data to a bulk endpoint
    usb_bulk_read       -- Read data from a bulk endpoint

- Interrupt Transfers

    usb_interrupt_write -- Write data to an interrupt endpoint (**)
    usb_interrupt_read  -- Read data from an interrupt endpoint

- Miscellaneous

    usb_strerror        -- usb error string
    usb_set_debug       -- set debug level

NOTE:
(*) Not implemented for Sun plugins (Solaris , Sun Ray)
(**) Not implemented for Sun Ray plugins

(Refer to www.libusb.sourceforge.net and www.usb.org for more details)

For all libusb interfaces:

SYNOPSIS
     cc [ flag ...]  -I/usr/include  file  [  library  ...  ]
     -L/usr/lib -R/usr/lib -lusb

     #include <usb.h>

    ____________________________________________________________
    |       ATTRIBUTE TYPE        |       ATTRIBUTE VALUE       |
    |_____________________________|_____________________________|
    | Interface Stability         | External                    |
    |_____________________________|_____________________________|
    | MT-Level                    | Unsafe                      |
    |_____________________________|_____________________________|



libusb Library Data Structures

NAME
     usb_descriptor_header - structure describing the standard USB
			     descriptor header  


DESCRIPTION
    The usb_descriptor_header structure has the following fields:

    uint8_t	bLength		length of the descriptor
    uint8_t	bDescriptorType type of the descriptor

    The following sizes are defined

    USB_DT_DEVICE_SIZE
    USB_DT_CONFIG_SIZE
    USB_DT_INTERFACE_SIZE
    USB_DT_ENDPOINT_SIZE
    USB_DT_ENDPOINT_AUDIO_SIZE
    USB_DT_HUB_NONVAR_SIZE

    The following types are defined

    USB_DT_DEVICE
    USB_DT_CONFIG
    USB_DT_STRING
    USB_DT_INTERFACE
    USB_DT_ENDPOINT
    USB_DT_HID
    USB_DT_REPORT
    USB_DT_PHYSICAL
    USB_DT_HUB

NAME
     usb_device_descriptor - standard USB device descriptor

DESCRIPTION
    The device descriptor usb_device_descriptor defines device-wide attributes.
    Please refer to the USB 2.0 spec, section 9.6.1.  The USB 2.0 spec is
    available at www.usb.org.

    The usb_device_descriptor structure has the following fields:

    A device descriptor has the following fields:

        uint8_t         bLength                 Size of this descriptor,
                                                in bytes.

        uint8_t         bDescriptorType         Set to USB_DT_DEVICE.

        uint16_t        bcdUSB                  USB specification release
                                                number supported, in bcd.

        uint8_t         bDeviceClass            Class code (see below).

        uint8_t         bDeviceSubClass         Subclass code (see USB 2.0
                                                specification of applicable
                                                device class for information.)

        uint8_t         bDeviceProtocol         Protocol code (see USB 2.0
                                                specification of applicable
                                                device class for information.)

        uint8_t         bMaxPacketSize0         Maximum packet size of
                                                endpoint 0.

        uint16_t        idVendor                vendor ID value.

        uint16_t        idProduct               product ID value.

        uint16_t        bcdDevice               Device release number in
                                                binary coded decimal.

        uint8_t         iManufacturer           Index of optional manufacturer
                                                description string.
                                                Valid if > 0.

        uint8_t         iProduct                Index of optional product
                                                description string.
                                                Valid if > 0.

        uint8_t         iSerialNumber           Index of optional serial
                                                number string.
                                                Valid if > 0.

        uint8_t         bNumConfigurations      Number of available
                                                configurations.


     The following values are defined for the bDeviceClass field:

     USB_CLASS_PER_INTERFACE
     USB_CLASS_AUDIO
     USB_CLASS_COMM
     USB_CLASS_HID
     USB_CLASS_PRINTER
     USB_CLASS_MASS_STORAGE
     USB_CLASS_HUB
     USB_CLASS_DATA
     USB_CLASS_VENDOR_SPEC


NAME
     usb_config_descriptor - USB configuration descriptor

DESCRIPTION
    The configuration descriptor usb_config_descriptor defines attributes of a
    configuration.  A configuration contains of one or more interfaces.  A
    configuration descriptor acts as a header for the group of other
    descriptors describing the subcomponents (i.e. interfaces, endpoints) of
    a configuration.  Please refer to the USB 2.0 spec, section 9.6.3.
    The USB 2.0 spec is available at www.usb.org.

    A configuration descriptor has the following fields:

        uint8_t         bLength                 Size of this descriptor,
                                                in bytes.

        uint8_t         bDescriptorType         Set to USB_DT_CONFIG

        uint16_t        wTotalLength            Total length of data returned,
                                                including this and all other
                                                descriptors in this
                                                configuration.

        uint8_t         bNumInterfaces          Number of interfaces in this
                                                configuration.

        uint8_t         bConfigurationValue     ID of this configuration
                                                (1-based).

        uint8_t         iConfiguration          Index of optional configuration
                                                string.  Valid if > 0.

        uint8_t         bmAttributes            Configuration characteristics
                                                (see below).

        uint8_t         bMaxPower               Maximum power consumption, in
                                                2mA units.
	struct usb_interface
			*interface		pointer to interface descriptor
	uchar_t		*extra			extra descriptors
	int		extralen		length of extra descriptors

     USB_MAXCONFIG provides the limit on the number of configurations.


NAME
     usb_interface_descriptor - USB interface descriptor

DESCRIPTION
    The interface descriptor usb_interface_descriptor defines attributes of an
    interface.  A configuration contains one or more interfaces.  An
    interface contains one or more endpoints.

    Please refer to the USB 2.0 spec, section 9.6.5.  The USB 2.0 spec is
    available at www.usb.org.

    An interface descriptor has the following fields:

        uint8_t         bLength                 Size of this descriptor,
                                                in bytes.

        uint8_t         bDescriptorType         Set to USB_DT_INTERFACE

        uint8_t         bInterfaceNumber        Interface number (0-based).

        uint8_t         bAlternateSetting       Alternate setting number for
                                                this interface and its
                                                endpoints (0-based).

        uint8_t         bNumEndpoints           Number of endpoints,
                                                excluding endpoint 0.

        uint8_t         bInterfaceClass         Interface Class code
                                                (see below).

        uint8_t         bInterfaceSubClass      Sub class code.  (See USB 2.0
                                                specification of applicable
                                                interface class for
                                                information.)

        uint8_t         bInterfaceProtocol      Protocol code.  (See USB 2.0
                                                specification of applicable
                                                interface class for
                                                information.)

        uint8_t         iInterface              Index of optional string
                                                describing this interface.
                                                Valid if > 0.

	uchar_t         *extra                  extra descriptors

	int             extralen                length of extra descriptors



     The following values are defined for the bInterfaceClass field:

     USB_CLASS_AUDIO
     USB_CLASS_COMM
     USB_CLASS_HID
     USB_CLASS_PRINTER
     USB_CLASS_MASS_STORAGE
     USB_CLASS_HUB
     USB_CLASS_DATA
     USB_CLASS_VENDOR_SPEC

     Refer to www.usb.org for details about USB device classes.

     USB_MAXINTERFACES provides the limit on the number of interfaces.


NAME
     usb_endpoint_descriptor - USB endpoint descriptor

DESCRIPTION
    The endpoint descriptor usb_endpoint_descriptor defines attributes of an
    endpoint.  An endpoint is a uniquely addressable portion of a USB device
    that is a source or sink of data.

    Please refer to the USB 2.0 spec, section 9.6.6.  The USB 2.0 spec is
    available at www.usb.org.

    An endpoint descriptor has the following fields:

        uint8_t         bLength                 Size of this descriptor,
                                                in bytes.

        uint8_t         bDescriptorType         Set to USB_DT_ENDPOINT

        uint8_t         bEndpointAddress        Address of this endpoint.

        uint8_t         bmAttributes            Endpoint attributes (see
                                                below).

        uint16_t        wMaxPacketSize          Maximum packet size.

        uint8_t         bInterval               Polling interval for interrupt
                                                and isochronous endpoints.
                                                NAK rate for high-speed control
                                                and bulk endpoints.
	uint8_t		bRefresh
	uint8_t		bSynchAddress
	uchar_t		*extra			extra descriptors
	int		extralen		length of extra descriptors

     The following values are defined for endpoint descriptor fields:

     USB_ENDPOINT_ADDRESS_MASK
     USB_ENDPOINT_DIR_MASK
     USB_ENDPOINT_IN
     USB_ENDPOINT_OUT
     USB_ENDPOINT_TYPE_MASK
     USB_ENDPOINT_TYPE_CONTROL
     USB_ENDPOINT_TYPE_ISOCHRONOUS
     USB_ENDPOINT_TYPE_BULK
     USB_ENDPOINT_TYPE_INTERRUPT


NAME
     usb_hid_descriptor - USB hid descriptor

DESCRIPTION
     The hid descriptor has the following fields:

        uint8_t		bLength			size of descriptor in bytes
        uint8_t		bDescriptorType		set to USB_DT_HID
        uint8_t		bcdHID			HID spec release
        uint8_t		bCountryCode		country code
        uint8_t		bNumDescriptors		no. of class descriptors


NAME
     usb_string_descriptor - USB string descriptor

DESCRIPTION
     The string descriptor has the following fields:

        uint8_t		bLength			size of descriptor in bytes
        uint8_t		bDescriptorType		set to USB_DT_STRING
	uint16_t	wData[1];		unicode data

NAME
     usb_ctrl_setup - USB control setup bytes

DESCRIPTION
     The usb_ctrl_setup structure has the following fields:

        uint8_t		bRequestType	characteristics of request
	uint8_t		bRequest	request or command
	uint16_t	wValue		value which varies according
					to command
	uint16_t	wIndex		value which varies according
					to command
	uint16_t	wLength		number of bytes to transfer

     The following values are defined for bRequestType:

     USB_TYPE_STANDARD
     USB_TYPE_CLASS
     USB_TYPE_VENDOR
     USB_TYPE_RESERVED
     USB_RECIP_DEVICE
     USB_RECIP_INTERFACE
     USB_RECIP_ENDPOINT
     USB_RECIP_OTHER

     The following values are defined for bRequest:

     USB_REQ_GET_STATUS
     USB_REQ_CLEAR_FEATURE
     USB_REQ_SET_FEATURE
     USB_REQ_SET_ADDRESS
     USB_REQ_GET_DESCRIPTOR
     USB_REQ_SET_DESCRIPTOR
     USB_REQ_GET_CONFIGURATION
     USB_REQ_SET_CONFIGURATION
     USB_REQ_GET_INTERFACE
     USB_REQ_SET_INTERFACE
     USB_REQ_SYNCH_FRAME
	

     Refer to www.usb.org for details.

     To assist in byte swapping:

     USB_LE16_TO_CPU		macro to swap bytes

NAME
     usb_bus - structure describing a USB bus in the system

DESCRIPTION
    A usb_bus structure describes a bus.
    All usb_bus structures are linked in the usb_busses linked list. 

    The usb_bus structure has the following fields:

    struct usb_device   *next, *prev	linked list entries
    char		dirname		directory name of the USB bus
    struct usb_device   *devices	linked list of usb_device structures
    uint32_t		location


NAME
     usb_device - structure describing a USB device on a USB bus 

DESCRIPTION
    A usb_device structure describes a USB device.
    All usb_device structures are linked in the usb_busses devices
    linked list. 

    The usb_device structure has the following fields:

    struct usb_device	*next, *prev	linked list entries
    char		filename	device node name
    struct usb_bus	*bus		pointer to its usb_bus structure
    struct usb_device_descriptor
			descriptor	standard USB device descriptor
    struct usb_config_descriptor
			*config		pointer to standard USB config
					descriptor
    void		*dev		OS Specific
    

NAME
     usb_interface - structure describing a USB interface on a USB device 

DESCRIPTION
    A usb_interface structure describes an interface on a USB device.

    The usb_interface structure has the following fields:

    struct usb_interface_descriptor
			*altsetting	pointer to standard USB interface
					descriptor 
    int			num_altsetting  number of alternates

    USB_MAXALTSETTING is the limit on num_altsetting.


Initialization and discovery
----------------------------

libusb Library Functions

(NOTE: The error return values mentioned are not part of standard libusb
       spec. There is inconsistency in the error return values of the
       various libusb implementations)

NAME
     usb_init - initialization of libusb.

     void usb_init();

DESCRIPTION
     usb_init sets up some internal structures. usb_init must be called
     before any other libusb functions.

-------------

NAME
usb_find_busses - finds all USB devices on all USB busses in the
		  system.

     int usb_find_busses(void);

DESCRIPTION
     usb_find_busses finds all busses in the system and returns the
     number of changes compared to the previous call to usb_find_busses.

RETURN VALUES
     Returns the total of new and removed busses.



NAME
     usb_find_devices - finds all devices on each bus.

     int usb_find_devices(void);

DESCRIPTION
     usb_find_devices will find all of the devices on each bus.
     This function should be called after usb_find_busses. It returns the
     number of changes previous to this call

RETURN VALUES
     Returns the total of new devices and devices removed.



NAME
	usb_get_busses - returns usb_busses linked list.
usb_busses - linked list.
    
     struct usb_bus *usb_busses;
     struct usb_bus *usb_get_busses(void);

DESCRIPTION
     usb_get_busses returns a pointer the the usb_busses linked list.
     Applications can also directly access this linked list through
     the external variable usb_busses.


Device Operations
-----------------

NAME
     usb_open - open a usb device and return a device handle
     usb_dev_handle *usb_open(usb_device *device);

PARAMETERS
     device	pointer to usb_device structure

DESCRIPTION
     usb_open is required for opening a device for use. usb_open must be
     called before attempting to perform any operations to the device.
     It accepts a pointer to the usb_device struct which is used to build
     the device lists.  The usb_dev_handle pointer that is returned is for
     a particular interface that will be claimed (see usb_claim_interface).
     For operating on another interface usb_open will need to be called
     again for a unique dev_handle pointer.

     Upon successful completion, usb_open() returns a  pointer  to
     the  usb_dev_handle structure. This handle is opaque and
     the struct usb_dev_handle is not visible to the application.
     Upon failure, usb_open() returns  NULL.

RETURN VALUES
     NULL	the device could not be opened.
     != NULL	valid usb_dev_handle pointer


NAME
     usb_close - closes a usb device

     int  usb_close(usb_dev_handle *dev);

PARAMETERS
     dev	pointer to a usb device handle acquired through usb_open

DESCRIPTION
     usb_close closes a device opened with usb_open. No further operations
     may be performed on the handle after usb_close is called.  usb_close
     must be called after the application has completed performing all
     operations to the device. It takes the device handle as an
     argument. The application is responsible for releasing the interface
     before calling usb_close.
     If the device can not be closed, a negative errno is returned.

RETURN VALUES
     < 0	the device could not be closed. A negative errno
		is returned:

		EINTR		interrupted system call
		EIO		error accessing device
		ENOMEM		not enough memory
		EACCESS		permission denied
		EBUSY		device is busy
		ENODEV		device does not exist
		EINVAL		invalid usb_dev_handle pointer

     == 0	device was successfully closed

NAME
     usb_claim_interface - claims an interface from the active configuration

     int  usb_claim_interface(usb_dev_handle *dev, int interface);

PARAMETERS
     dev	pointer to a usb device handle acquired through usb_open
     interface	interface number

DESCRIPTION
     usb_claim_interface claims the interface for the active configuration
     of a device. dev is the device handle for the device whose interface is
     to be accessed.
     The interface value is the bInterfaceNumber field from the
     interface descriptor.
     If the interface can not be claimed, a negative errno is returned.

     usb_claim_interface must be performed prior to any endpoint access.

RETURN VALUES
     < 0	the interface could not claimed. A negative errno
		is returned:

                EINTR           interrupted system call
                EIO             error accessing device
                ENOMEM          not enough memory
                EACCESS         permission denied
                EBUSY           interface is already claimed
                ENODEV          device does not exist
                EINVAL          invalid usb_device pointer or interface

     == 0	the interface was successfully claimed
		
NAME
     usb_release_interface - releases an interface

     int  usb_release_interface(usb_dev_handle *dev, int interface);

PARAMETERS
     dev	pointer to a usb device handle acquired through usb_open
     interface	interface number

DESCRIPTION
     usb_release_interface releases an interface previously claimed
     by usb_claim_interface.
     The interface value is the bInterfaceNumber field from the
     interface descriptor.
     If the interface can not be released, a negative errno is returned.

RETURN VALUES
     < 0	the interface could not claimed. A negative errno
		is returned:

                EINTR           interrupted system call
                EIO             error accessing device
                ENOMEM          not enough memory
                EACCESS         permission denied
                ENODEV          device does not exist
                EINVAL          invalid usb_device pointer
				or interface was not claimed

     == 0	the interface was successfully released
		

Control Transfers
-----------------

NAME
     usb_control_msg - Performs a control request

     int usb_control_msg(usb_dev_handle *dev, int requesttype,
	int request, int value, int index, char *bytes, int size,
        int timeout);


PARAMETERS
     dev	 pointer to a usb device handle acquired through usb_open
     requesttype bmRequestType
     request	 bRequest
     value	 wValue
     index	 wIndex
     bytes	 data buffer
     size	 length of data buffer 
     timeout	 timeout in milliseconds

DESCRIPTION
     usb_control_msg performs a control request to the default control pipe
     on a device.
     The parameters mirror the types of the similar name in the USB
     specification.

RETURN VALUES
     < 0        the request could not be performed. A negative errno
                is returned:

                EINTR           interrupted system call
                EIO             error accessing device or timeout
                ENOMEM          not enough memory
                EACCESS         permission denied or
                                interface was not claimed
                ENODEV          device does not exist
                EINVAL          invalid usb_device pointer

     >= 0       the request was successfully performed
		0 or more bytes were transferred. 

NAME
     usb_get_string - Retrieves a string descriptor from a device
		      and returns a Unicode string
     usb_get_string_simple - Retrieves a string descriptor from a device
		      and returns an ASCII string

     int usb_get_string(usb_dev_handle *dev, int index, int langid,
	char *buf, size_t buflen);

     int usb_get_string_simple(usb_dev_handle *dev, int index,
        char *buf, size_t buflen);

PARAMETERS
     dev	 pointer to a usb device handle acquired through usb_open
     index	 string index
     langid	 language identifier
     buf	 data buffer
     buflen	 length of data buffer 

DESCRIPTION
     usb_get_string retrieves the string descriptor specified by index
     and langid from a device.

     The string will be returned in Unicode as specified by the USB
     specification.

     usb_get_string_simple is a wrapper around usb_get_string that
     retrieves the string description specified by index in the first
     language for the descriptor and converts it into C style ASCII.

RETURN VALUES
     < 0        the request could not be performed. A negative errno
                is returned:

                EINTR           interrupted system call
                EIO             error accessing device or timeout
                ENOMEM          not enough memory
                EACCESS         permission denied
                ENODEV          device does not exist
                EINVAL          invalid usb_device pointer

     >= 0       the request was successfully performed
		0 or more bytes were transferred. 

NAME

     usb_get_descriptor  - Retrives a descriptor given the descriptor
			   type

     usb_get_descriptor(usb_dev_handle *dev, uchar_t type,
                        uchar_t index, void *buf, int size);

PARAMETERS
     dev	 pointer to a usb device handle acquired through usb_open
     type	 descriptor type
     index	 descriptor index
     buf	 data buffer
     size 	 size of descriptor requested

DESCRIPTION
     usb_get_descriptor  returns the descriptor given a descriptor
     type

RETURN VALUES
     < 0	Could not retrieve the descriptor. A negative errno
		is returned:

                EINTR           interrupted system call
                EIO             error accessing device
                ENOMEM          not enough memory
                EACCESS         permission denied
                EBUSY           interfaces are still claimed
                ENODEV          device does not exist
                EINVAL          invalid usb_device pointer
				or invalid configuration value

     == 0	returned requested descriptor.
		

NAME
     usb_set_configuration - configures a usb device

     int  usb_set_configuration(usb_dev_handle *dev, int configuration);

PARAMETERS
     dev	pointer to a usb device handle acquired through usb_open
     confvalue 	configuration value

DESCRIPTION
     usb_set_configuration sets the active configuration of a device.
     dev is the device handle for the device whose configuration is to
     be changed.
     The argument configuration is the bConfigurationValue
     field of the configuration descriptor for this device.
     All interfaces must be released prior to setting the configuration.

RETURN VALUES
     < 0	the configuration could not set. A negative errno
		is returned:

                EINTR           interrupted system call
                EIO             error accessing device
                ENOMEM          not enough memory
                EACCESS         permission denied
                EBUSY           interfaces are still claimed
                ENODEV          device does not exist
                EINVAL          invalid usb_device pointer
				or invalid configuration value

     == 0	the configuration was successfully set
		

NAME
     usb_set_altinterface - Sets the alternate interface setting of the
     active interface

     int  usb_set_altinterface(usb_dev_handle *dev, int alternate);

PARAMETERS
     dev	pointer to a usb device handle acquired through usb_open
     alternate	a valid alternate setting

DESCRIPTION
     usb_set_altinterface sets the alternate setting for the active
     interface to the given argument alternate. dev is the device handle for
     the device whose interface is to be changed. The alternate argument needs
     to be a valid bAlternateSetting entry of the interface descriptor.
     This operation can only be performed after the interface has been
     claimed. 

RETURN VALUES
     < 0        the alternate could not set. A negative errno
                is returned:

                EINTR           interrupted system call
                EIO             error accessing device
                ENOMEM          not enough memory
                EACCESS         permission denied or
                                interface was not claimed
                ENODEV          device does not exist
                EINVAL          invalid usb_device pointer or alternate

     == 0       the interface was successfully claimed

NAME
     usb_resetep -- Resets state for an endpoint

     int usb_resetep(usb_dev_handle *dev, unsigned int ep);

PARAMETERS
     dev	pointer to a usb device handle acquired through usb_open
     ep		a valid endpoint address

DESCRIPTION
     usb_resetep resets all state for the specified endpoint.

RETURN VALUES
     < 0        the endpoint status could not be reset. A negative errno
                is returned:

                EINTR           interrupted system call
                EIO             error accessing device
                ENOMEM          not enough memory
                EACCESS         permission denied
                ENODEV          device does not exist
                EINVAL          invalid usb_device pointer or alternate
                ENOSUP          operation not supported

     == 0       the endpoint state was successfully reset


NAME
     usb_clear_halt - Clears a endpoint halt status

     int usb_clear_halt(usb_dev_handle *dev, unsigned int ep);

PARAMETERS
     dev	pointer to a usb device handle acquired through usb_open
     ep		a valid endpoint address

DESCRIPTION
     usb_clear_halt clears any halt status on the specified endpoint.
     The ep parameter is the value specified in the endpoint descriptor
     field bEndpointAddress.

     If the underlying implementation supports autoclearing of stalls then
     usb_clear_halt will return success immediately.

RETURN VALUES
     < 0        the endpoint halt status could not be cleared. A negative errno
                is returned:

                EINTR           interrupted system call
                EIO             error accessing device
                ENOMEM          not enough memory
                EACCESS         permission denied or
                                interface was not claimed
                ENODEV          device does not exist
                EINVAL          invalid usb_device pointer or endpoint
				address

     == 0       the endpoint halt status was successfully cleared

NAME
     usb_reset - Resets a device

     int usb_reset(usb_dev_handle *dev);

PARAMETERS
     dev	pointer to a usb device handle acquired through usb_open

DESCRIPTION
     usb_reset resets the specified device by sending a RESET down
     the port the device is connected to.

     After calling usb_reset, the device will need to
     re-enumerated and therefore requires finding the new device and
     opening a new handle.
     The handle used to call usb_reset will no longer work and
     the device should be released using usb_close(3LIB).

RETURN VALUES
     < 0        the device could not be reset. A negative errno
                is returned:

                EINTR           interrupted system call
                EIO             error accessing device
                ENOMEM          not enough memory
                EACCESS         permission denied
                ENODEV          device does not exist
                EINVAL          invalid usb_device pointer
		ENOSUP		usb_reset is not supported
		ENOSUP		operation is not supported

     == 0       the device was successfully reset


Bulk Transfers
--------------

NAME
     usb_bulk_write - Performs a bulk OUT request
     usb_bulk_read - Performs a bulk IN request

SYNOPSIS
     int usb_bulk_write(usb_dev_handle *dev, int ep, char *bytes,
     	int size, int timeout);
     int usb_bulk_read(usb_dev_handle *dev, int ep, char *bytes,
     	int size, int timeout);


PARAMETERS
     dev	 pointer to a usb device handle acquired through usb_open
     ep		 endpoint address
     bytes	 data buffer
     size	 length of data buffer 
     timeout	 timeout in milliseconds

DESCRIPTION
     usb_bulk_write performs a bulk OUT request to the endpoint specified
     by ep. It returns the number of bytes transferred or a negative errno.
     usb_bulk_read performs a bulk IN request from the endpoint specified
     by ep. It returns the number of bytes transferred or a negative errno.

RETURN VALUES
     < 0        the request could not be performed. A negative errno
                is returned:

                EINTR           interrupted system call
                EIO             error accessing device or timeout
                ENOMEM          not enough memory
                EACCESS         permission denied or
                                interface was not claimed
                ENODEV          device does not exist
                EINVAL          invalid usb_device pointer

     >= 0       the request was successfully performed
		0 or more bytes were transferred. 


Interrupt Transfers
-------------------

libusb Library Functions                        usb_interrupt_write(3LIB)

NAME
     usb_interrupt_write - Performs an interrupt OUT request
     usb_interrupt_read - Performs an interrupt IN request

     int usb_interrupt_write(usb_dev_handle *dev, int ep, char *bytes,
     	int size, int timeout);
     int usb_interrupt_read(usb_dev_handle *dev, int ep, char *bytes,
     	int size, int timeout);

PARAMETERS
     dev	 pointer to a usb device handle acquired through usb_open
     ep		 endpoint address
     bytes	 data buffer
     size	 length of data buffer 
     timeout	 timeout in milliseconds

DESCRIPTION
     usb_interrupt_write performs a interrupt OUT request to the endpoint
     specified by ep.
     It returns the number of bytes transferred or a negative errno.
     usb_interrupt_read performs a interrupt IN request from the endpoint
     specified by ep.
     It returns the number of bytes transferred or a negative errno.

RETURN VALUES
     < 0        the request could not be performed. A negative errno
                is returned:

                EINTR           interrupted system call
                EIO             error accessing device or timeout
                ENOMEM          not enough memory
                EACCESS         permission denied or
                                interface was not claimed
                ENODEV          device does not exist
                EINVAL          invalid usb_device pointer
                ENOSUP          operation not supported

     >= 0       the request was successfully performed
		0 or more bytes were transferred. 


Miscellaneous
-------------

NAME
     usb_strerror - returns error message string 

     char *usb_strerror(void);

DESCRIPTION
     usb_strerror is a wrapper around strerror(3C). It returns
     a libusb-specific string if available, otherwise it calls
     usb_strerror using errno returned by the implementation.

RETURN VALUES
     returns error string


NAME
     usb_set_debug - Set debug level

     void usb_set_debug(int level);

PARAMETERS
    level	debug level (0 is no debug messages)

DESCRIPTION
    usb_set_debug enables debug messages. level determines the
    level of detail of the debug messages. Level ranges from
    1 to 5 with 5 being the most verbose.

-------

3.2 Programming guideline

Using libusb involves the following steps:

        o usb_init() which initializes the library.
        o usb_find_busses() which initializes the usb_busses list.
        o usb_find_devices() which finds all USB devices.
        o By traversing the usb_busses linked list, the application can
          search for a device of interest and acquire a handle on the
          device using usb_open().
        o The application can set the device configuration of the device
          using usb_set_config().
        o The application claims an interface using usb_claim_interface().
        o The application can access the default endpoint using
          usb_control_msg(),  bulk endpoints using usb_bulk_read() or
          usb_bulk_write(), and interrupt endpoints using usb_interrupt_read()
	  or interrupt write
        o The application releases the interface using usb_release_interface().
        o The application closes the device using usb_close();

Please also check the libusb developers guide in libusb.sourceforge.net
for more info and sample programs

-------