diff -Nrc usb-modeswitch-1.1.9/Makefile usb_modeswitch/Makefile
*** usb-modeswitch-1.1.9/Makefile	2011-08-04 01:31:22.000000000 +0800
--- usb_modeswitch/Makefile	2011-09-26 13:10:12.854826000 +0800
***************
*** 1,10 ****
  PROG        = usb_modeswitch
  VERS        = 1.1.9
! CC          = gcc
! CFLAGS      += -Wall
! LIBS        = -l usb
  RM          = /bin/rm -f
! OBJS        = usb_modeswitch.c
  PREFIX      = $(DESTDIR)/usr
  ETCDIR      = $(DESTDIR)/etc
  UDEVDIR     = $(DESTDIR)/lib/udev
--- 1,10 ----
  PROG        = usb_modeswitch
  VERS        = 1.1.9
! CC          = arm-none-linux-gnueabi-gcc 
! CFLAGS      += -Wall -I $(PWD)/output/build/libusb-0.1.12/
! LIBS        = -static  $(PWD)/output/build/libusb-0.1.12/.libs/libusb.a
  RM          = /bin/rm -f
! OBJS        = usb_modeswitch.c 
  PREFIX      = $(DESTDIR)/usr
  ETCDIR      = $(DESTDIR)/etc
  UDEVDIR     = $(DESTDIR)/lib/udev
***************
*** 16,33 ****
  all:        $(PROG)
  
  $(PROG): $(OBJS)
  	$(CC) -o $(PROG) $(OBJS) $(CFLAGS) $(LIBS) $(LDFLAGS)
  
  clean:
  	$(RM) usb_modeswitch
  
  install: all
! 	install -D -s --mode=755 usb_modeswitch $(SBINDIR)/usb_modeswitch
! 	install -D --mode=755 usb_modeswitch.tcl $(SBINDIR)/usb_modeswitch_dispatcher
! 	install -D --mode=755 usb_modeswitch.sh $(UDEVDIR)/usb_modeswitch
! 	install -D --mode=644 usb_modeswitch.conf $(ETCDIR)/usb_modeswitch.conf
! 	install -D --mode=644 usb_modeswitch.1 $(MANDIR)/usb_modeswitch.1
! 	install -d $(DESTDIR)/var/lib/usb_modeswitch
  
  uninstall:
  	$(RM) $(SBINDIR)/usb_modeswitch
--- 16,34 ----
  all:        $(PROG)
  
  $(PROG): $(OBJS)
+ 
  	$(CC) -o $(PROG) $(OBJS) $(CFLAGS) $(LIBS) $(LDFLAGS)
  
  clean:
  	$(RM) usb_modeswitch
  
  install: all
! 	install -D --mode=755 usb_modeswitch $(SBINDIR)/usb_modeswitch
! 	#install -D --mode=755 usb_modeswitch.tcl $(SBINDIR)/usb_modeswitch_dispatcher
! 	#install -D --mode=755 usb_modeswitch.sh $(UDEVDIR)/usb_modeswitch
! 	#install -D --mode=644 usb_modeswitch.conf $(ETCDIR)/usb_modeswitch.conf
! 	#install -D --mode=644 usb_modeswitch.1 $(MANDIR)/usb_modeswitch.1
! 	#install -d $(DESTDIR)/var/lib/usb_modeswitch
  
  uninstall:
  	$(RM) $(SBINDIR)/usb_modeswitch
diff -Nrc usb-modeswitch-1.1.9/usb.h usb_modeswitch/usb.h
*** usb-modeswitch-1.1.9/usb.h	1970-01-01 08:00:00.000000000 +0800
--- usb_modeswitch/usb.h	2011-09-23 12:25:54.172552100 +0800
***************
*** 0 ****
--- 1,337 ----
+ /*
+  * Prototypes, structure definitions and macros.
+  *
+  * Copyright (c) 2000-2003 Johannes Erdfelt <johannes@erdfelt.com>
+  *
+  * This library is covered by the LGPL, read LICENSE for details.
+  *
+  * This file (and only this file) may alternatively be licensed under the
+  * BSD license as well, read LICENSE for details.
+  */
+ #ifndef __USB_H__
+ #define __USB_H__
+ 
+ #include <unistd.h>
+ #include <stdlib.h>
+ #include <limits.h>
+ 
+ #include <dirent.h>
+ 
+ /*
+  * USB spec information
+  *
+  * This is all stuff grabbed from various USB specs and is pretty much
+  * not subject to change
+  */
+ 
+ /*
+  * Device and/or Interface Class codes
+  */
+ #define USB_CLASS_PER_INTERFACE		0	/* for DeviceClass */
+ #define USB_CLASS_AUDIO			1
+ #define USB_CLASS_COMM			2
+ #define USB_CLASS_HID			3
+ #define USB_CLASS_PRINTER		7
+ #define USB_CLASS_PTP			6
+ #define USB_CLASS_MASS_STORAGE		8
+ #define USB_CLASS_HUB			9
+ #define USB_CLASS_DATA			10
+ #define USB_CLASS_VENDOR_SPEC		0xff
+ 
+ /*
+  * Descriptor types
+  */
+ #define USB_DT_DEVICE			0x01
+ #define USB_DT_CONFIG			0x02
+ #define USB_DT_STRING			0x03
+ #define USB_DT_INTERFACE		0x04
+ #define USB_DT_ENDPOINT			0x05
+ 
+ #define USB_DT_HID			0x21
+ #define USB_DT_REPORT			0x22
+ #define USB_DT_PHYSICAL			0x23
+ #define USB_DT_HUB			0x29
+ 
+ /*
+  * Descriptor sizes per descriptor type
+  */
+ #define USB_DT_DEVICE_SIZE		18
+ #define USB_DT_CONFIG_SIZE		9
+ #define USB_DT_INTERFACE_SIZE		9
+ #define USB_DT_ENDPOINT_SIZE		7
+ #define USB_DT_ENDPOINT_AUDIO_SIZE	9	/* Audio extension */
+ #define USB_DT_HUB_NONVAR_SIZE		7
+ 
+ /* All standard descriptors have these 2 fields in common */
+ struct usb_descriptor_header {
+ 	u_int8_t  bLength;
+ 	u_int8_t  bDescriptorType;
+ };
+ 
+ /* String descriptor */
+ struct usb_string_descriptor {
+ 	u_int8_t  bLength;
+ 	u_int8_t  bDescriptorType;
+ 	u_int16_t wData[1];
+ };
+ 
+ /* HID descriptor */
+ struct usb_hid_descriptor {
+ 	u_int8_t  bLength;
+ 	u_int8_t  bDescriptorType;
+ 	u_int16_t bcdHID;
+ 	u_int8_t  bCountryCode;
+ 	u_int8_t  bNumDescriptors;
+ 	/* u_int8_t  bReportDescriptorType; */
+ 	/* u_int16_t wDescriptorLength; */
+ 	/* ... */
+ };
+ 
+ /* Endpoint descriptor */
+ #define USB_MAXENDPOINTS	32
+ struct usb_endpoint_descriptor {
+ 	u_int8_t  bLength;
+ 	u_int8_t  bDescriptorType;
+ 	u_int8_t  bEndpointAddress;
+ 	u_int8_t  bmAttributes;
+ 	u_int16_t wMaxPacketSize;
+ 	u_int8_t  bInterval;
+ 	u_int8_t  bRefresh;
+ 	u_int8_t  bSynchAddress;
+ 
+ 	unsigned char *extra;	/* Extra descriptors */
+ 	int extralen;
+ };
+ 
+ #define USB_ENDPOINT_ADDRESS_MASK	0x0f    /* in bEndpointAddress */
+ #define USB_ENDPOINT_DIR_MASK		0x80
+ 
+ #define USB_ENDPOINT_TYPE_MASK		0x03    /* in bmAttributes */
+ #define USB_ENDPOINT_TYPE_CONTROL	0
+ #define USB_ENDPOINT_TYPE_ISOCHRONOUS	1
+ #define USB_ENDPOINT_TYPE_BULK		2
+ #define USB_ENDPOINT_TYPE_INTERRUPT	3
+ 
+ /* Interface descriptor */
+ #define USB_MAXINTERFACES	32
+ struct usb_interface_descriptor {
+ 	u_int8_t  bLength;
+ 	u_int8_t  bDescriptorType;
+ 	u_int8_t  bInterfaceNumber;
+ 	u_int8_t  bAlternateSetting;
+ 	u_int8_t  bNumEndpoints;
+ 	u_int8_t  bInterfaceClass;
+ 	u_int8_t  bInterfaceSubClass;
+ 	u_int8_t  bInterfaceProtocol;
+ 	u_int8_t  iInterface;
+ 
+ 	struct usb_endpoint_descriptor *endpoint;
+ 
+ 	unsigned char *extra;	/* Extra descriptors */
+ 	int extralen;
+ };
+ 
+ #define USB_MAXALTSETTING	128	/* Hard limit */
+ struct usb_interface {
+ 	struct usb_interface_descriptor *altsetting;
+ 
+ 	int num_altsetting;
+ };
+ 
+ /* Configuration descriptor information.. */
+ #define USB_MAXCONFIG		8
+ struct usb_config_descriptor {
+ 	u_int8_t  bLength;
+ 	u_int8_t  bDescriptorType;
+ 	u_int16_t wTotalLength;
+ 	u_int8_t  bNumInterfaces;
+ 	u_int8_t  bConfigurationValue;
+ 	u_int8_t  iConfiguration;
+ 	u_int8_t  bmAttributes;
+ 	u_int8_t  MaxPower;
+ 
+ 	struct usb_interface *interface;
+ 
+ 	unsigned char *extra;	/* Extra descriptors */
+ 	int extralen;
+ };
+ 
+ /* Device descriptor */
+ struct usb_device_descriptor {
+ 	u_int8_t  bLength;
+ 	u_int8_t  bDescriptorType;
+ 	u_int16_t bcdUSB;
+ 	u_int8_t  bDeviceClass;
+ 	u_int8_t  bDeviceSubClass;
+ 	u_int8_t  bDeviceProtocol;
+ 	u_int8_t  bMaxPacketSize0;
+ 	u_int16_t idVendor;
+ 	u_int16_t idProduct;
+ 	u_int16_t bcdDevice;
+ 	u_int8_t  iManufacturer;
+ 	u_int8_t  iProduct;
+ 	u_int8_t  iSerialNumber;
+ 	u_int8_t  bNumConfigurations;
+ };
+ 
+ struct usb_ctrl_setup {
+ 	u_int8_t  bRequestType;
+ 	u_int8_t  bRequest;
+ 	u_int16_t wValue;
+ 	u_int16_t wIndex;
+ 	u_int16_t wLength;
+ };
+ 
+ /*
+  * Standard requests
+  */
+ #define USB_REQ_GET_STATUS		0x00
+ #define USB_REQ_CLEAR_FEATURE		0x01
+ /* 0x02 is reserved */
+ #define USB_REQ_SET_FEATURE		0x03
+ /* 0x04 is reserved */
+ #define USB_REQ_SET_ADDRESS		0x05
+ #define USB_REQ_GET_DESCRIPTOR		0x06
+ #define USB_REQ_SET_DESCRIPTOR		0x07
+ #define USB_REQ_GET_CONFIGURATION	0x08
+ #define USB_REQ_SET_CONFIGURATION	0x09
+ #define USB_REQ_GET_INTERFACE		0x0A
+ #define USB_REQ_SET_INTERFACE		0x0B
+ #define USB_REQ_SYNCH_FRAME		0x0C
+ 
+ #define USB_TYPE_STANDARD		(0x00 << 5)
+ #define USB_TYPE_CLASS			(0x01 << 5)
+ #define USB_TYPE_VENDOR			(0x02 << 5)
+ #define USB_TYPE_RESERVED		(0x03 << 5)
+ 
+ #define USB_RECIP_DEVICE		0x00
+ #define USB_RECIP_INTERFACE		0x01
+ #define USB_RECIP_ENDPOINT		0x02
+ #define USB_RECIP_OTHER			0x03
+ 
+ /*
+  * Various libusb API related stuff
+  */
+ 
+ #define USB_ENDPOINT_IN			0x80
+ #define USB_ENDPOINT_OUT		0x00
+ 
+ /* Error codes */
+ #define USB_ERROR_BEGIN			500000
+ 
+ /*
+  * This is supposed to look weird. This file is generated from autoconf
+  * and I didn't want to make this too complicated.
+  */
+ #if 0
+ #define USB_LE16_TO_CPU(x) do { x = ((x & 0xff) << 8) | ((x & 0xff00) >> 8); } while(0)
+ #else
+ #define USB_LE16_TO_CPU(x)
+ #endif
+ 
+ /* Data types */
+ struct usb_device;
+ struct usb_bus;
+ 
+ /*
+  * To maintain compatibility with applications already built with libusb,
+  * we must only add entries to the end of this structure. NEVER delete or
+  * move members and only change types if you really know what you're doing.
+  */
+ struct usb_device {
+   struct usb_device *next, *prev;
+ 
+   char filename[PATH_MAX + 1];
+ 
+   struct usb_bus *bus;
+ 
+   struct usb_device_descriptor descriptor;
+   struct usb_config_descriptor *config;
+ 
+   void *dev;		/* Darwin support */
+ 
+   u_int8_t devnum;
+ 
+   unsigned char num_children;
+   struct usb_device **children;
+ };
+ 
+ struct usb_bus {
+   struct usb_bus *next, *prev;
+ 
+   char dirname[PATH_MAX + 1];
+ 
+   struct usb_device *devices;
+   u_int32_t location;
+ 
+   struct usb_device *root_dev;
+ };
+ 
+ struct usb_dev_handle;
+ typedef struct usb_dev_handle usb_dev_handle;
+ 
+ /* Variables */
+ extern struct usb_bus *usb_busses;
+ 
+ #ifdef __cplusplus
+ extern "C" {
+ #endif
+ 
+ /* Function prototypes */
+ 
+ /* usb.c */
+ usb_dev_handle *usb_open(struct usb_device *dev);
+ int usb_close(usb_dev_handle *dev);
+ 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);
+ 
+ /* descriptors.c */
+ int usb_get_descriptor_by_endpoint(usb_dev_handle *udev, int ep,
+ 	unsigned char type, unsigned char index, void *buf, int size);
+ int usb_get_descriptor(usb_dev_handle *udev, unsigned char type,
+ 	unsigned char index, void *buf, int size);
+ 
+ /* <arch>.c */
+ 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);
+ 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);
+ int usb_control_msg(usb_dev_handle *dev, int requesttype, int request,
+ 	int value, int index, char *bytes, int size, int timeout);
+ int usb_set_configuration(usb_dev_handle *dev, int configuration);
+ int usb_claim_interface(usb_dev_handle *dev, int interface);
+ int usb_release_interface(usb_dev_handle *dev, int interface);
+ int usb_set_altinterface(usb_dev_handle *dev, int alternate);
+ int usb_resetep(usb_dev_handle *dev, unsigned int ep);
+ int usb_clear_halt(usb_dev_handle *dev, unsigned int ep);
+ int usb_reset(usb_dev_handle *dev);
+ 
+ #if 1
+ #define LIBUSB_HAS_GET_DRIVER_NP 1
+ int usb_get_driver_np(usb_dev_handle *dev, int interface, char *name,
+ 	unsigned int namelen);
+ #define LIBUSB_HAS_DETACH_KERNEL_DRIVER_NP 1
+ int usb_detach_kernel_driver_np(usb_dev_handle *dev, int interface);
+ #endif
+ 
+ char *usb_strerror(void);
+ 
+ void usb_init(void);
+ void usb_set_debug(int level);
+ int usb_find_busses(void);
+ int usb_find_devices(void);
+ struct usb_device *usb_device(usb_dev_handle *dev);
+ struct usb_bus *usb_get_busses(void);
+ 
+ #ifdef __cplusplus
+ }
+ #endif
+ 
+ #endif /* __USB_H__ */
+ 
diff -Nrc usb-modeswitch-1.1.9/usb_modeswitch.c usb_modeswitch/usb_modeswitch.c
*** usb-modeswitch-1.1.9/usb_modeswitch.c	2011-08-06 01:24:13.000000000 +0800
--- usb_modeswitch/usb_modeswitch.c	2011-09-25 10:17:03.814023000 +0800
***************
*** 53,59 ****
  #include <getopt.h>
  #include <syslog.h>
  
! #include <usb.h>
  #include "usb_modeswitch.h"
  
  #define LINE_DIM 1024
--- 53,59 ----
  #include <getopt.h>
  #include <syslog.h>
  
! #include "usb.h"
  #include "usb_modeswitch.h"
  
  #define LINE_DIM 1024
diff -Nrc usb-modeswitch-1.1.9/usb_modeswitch.diff usb_modeswitch/usb_modeswitch.diff
*** usb-modeswitch-1.1.9/usb_modeswitch.diff	1970-01-01 08:00:00.000000000 +0800
--- usb_modeswitch/usb_modeswitch.diff	2011-09-23 17:17:37.894616617 +0800
***************
*** 0 ****
--- 1,409 ----
+ diff -crN usb-modeswitch/Makefile usb_modeswitch-1.1.9/Makefile
+ *** usb-modeswitch/Makefile	2011-08-04 01:31:22.000000000 +0800
+ --- usb_modeswitch-1.1.9/Makefile	2011-09-23 14:19:57.118608000 +0800
+ ***************
+ *** 1,10 ****
+   PROG        = usb_modeswitch
+   VERS        = 1.1.9
+ ! CC          = gcc
+ ! CFLAGS      += -Wall
+ ! LIBS        = -l usb
+   RM          = /bin/rm -f
+ ! OBJS        = usb_modeswitch.c
+   PREFIX      = $(DESTDIR)/usr
+   ETCDIR      = $(DESTDIR)/etc
+   UDEVDIR     = $(DESTDIR)/lib/udev
+ --- 1,10 ----
+   PROG        = usb_modeswitch
+   VERS        = 1.1.9
+ ! CC          = arm-none-linux-gnueabi-gcc 
+ ! CFLAGS      += -Wall -I /.
+ ! LIBS        = -static  $(PWD)/output/target/usr/lib/libusb.a 
+   RM          = /bin/rm -f
+ ! OBJS        = usb_modeswitch.c 
+   PREFIX      = $(DESTDIR)/usr
+   ETCDIR      = $(DESTDIR)/etc
+   UDEVDIR     = $(DESTDIR)/lib/udev
+ ***************
+ *** 16,33 ****
+   all:        $(PROG)
+   
+   $(PROG): $(OBJS)
+   	$(CC) -o $(PROG) $(OBJS) $(CFLAGS) $(LIBS) $(LDFLAGS)
+   
+   clean:
+   	$(RM) usb_modeswitch
+   
+   install: all
+ ! 	install -D -s --mode=755 usb_modeswitch $(SBINDIR)/usb_modeswitch
+ ! 	install -D --mode=755 usb_modeswitch.tcl $(SBINDIR)/usb_modeswitch_dispatcher
+ ! 	install -D --mode=755 usb_modeswitch.sh $(UDEVDIR)/usb_modeswitch
+ ! 	install -D --mode=644 usb_modeswitch.conf $(ETCDIR)/usb_modeswitch.conf
+ ! 	install -D --mode=644 usb_modeswitch.1 $(MANDIR)/usb_modeswitch.1
+ ! 	install -d $(DESTDIR)/var/lib/usb_modeswitch
+   
+   uninstall:
+   	$(RM) $(SBINDIR)/usb_modeswitch
+ --- 16,34 ----
+   all:        $(PROG)
+   
+   $(PROG): $(OBJS)
+ + 
+   	$(CC) -o $(PROG) $(OBJS) $(CFLAGS) $(LIBS) $(LDFLAGS)
+   
+   clean:
+   	$(RM) usb_modeswitch
+   
+   install: all
+ ! 	install -D --mode=755 usb_modeswitch $(SBINDIR)/usb_modeswitch
+ ! 	#install -D --mode=755 usb_modeswitch.tcl $(SBINDIR)/usb_modeswitch_dispatcher
+ ! 	#install -D --mode=755 usb_modeswitch.sh $(UDEVDIR)/usb_modeswitch
+ ! 	#install -D --mode=644 usb_modeswitch.conf $(ETCDIR)/usb_modeswitch.conf
+ ! 	#install -D --mode=644 usb_modeswitch.1 $(MANDIR)/usb_modeswitch.1
+ ! 	#install -d $(DESTDIR)/var/lib/usb_modeswitch
+   
+   uninstall:
+   	$(RM) $(SBINDIR)/usb_modeswitch
+ diff -crN usb-modeswitch/usb.h usb_modeswitch-1.1.9/usb.h
+ *** usb-modeswitch/usb.h	1970-01-01 08:00:00.000000000 +0800
+ --- usb_modeswitch-1.1.9/usb.h	2011-09-23 12:25:54.172552100 +0800
+ ***************
+ *** 0 ****
+ --- 1,337 ----
+ + /*
+ +  * Prototypes, structure definitions and macros.
+ +  *
+ +  * Copyright (c) 2000-2003 Johannes Erdfelt <johannes@erdfelt.com>
+ +  *
+ +  * This library is covered by the LGPL, read LICENSE for details.
+ +  *
+ +  * This file (and only this file) may alternatively be licensed under the
+ +  * BSD license as well, read LICENSE for details.
+ +  */
+ + #ifndef __USB_H__
+ + #define __USB_H__
+ + 
+ + #include <unistd.h>
+ + #include <stdlib.h>
+ + #include <limits.h>
+ + 
+ + #include <dirent.h>
+ + 
+ + /*
+ +  * USB spec information
+ +  *
+ +  * This is all stuff grabbed from various USB specs and is pretty much
+ +  * not subject to change
+ +  */
+ + 
+ + /*
+ +  * Device and/or Interface Class codes
+ +  */
+ + #define USB_CLASS_PER_INTERFACE		0	/* for DeviceClass */
+ + #define USB_CLASS_AUDIO			1
+ + #define USB_CLASS_COMM			2
+ + #define USB_CLASS_HID			3
+ + #define USB_CLASS_PRINTER		7
+ + #define USB_CLASS_PTP			6
+ + #define USB_CLASS_MASS_STORAGE		8
+ + #define USB_CLASS_HUB			9
+ + #define USB_CLASS_DATA			10
+ + #define USB_CLASS_VENDOR_SPEC		0xff
+ + 
+ + /*
+ +  * Descriptor types
+ +  */
+ + #define USB_DT_DEVICE			0x01
+ + #define USB_DT_CONFIG			0x02
+ + #define USB_DT_STRING			0x03
+ + #define USB_DT_INTERFACE		0x04
+ + #define USB_DT_ENDPOINT			0x05
+ + 
+ + #define USB_DT_HID			0x21
+ + #define USB_DT_REPORT			0x22
+ + #define USB_DT_PHYSICAL			0x23
+ + #define USB_DT_HUB			0x29
+ + 
+ + /*
+ +  * Descriptor sizes per descriptor type
+ +  */
+ + #define USB_DT_DEVICE_SIZE		18
+ + #define USB_DT_CONFIG_SIZE		9
+ + #define USB_DT_INTERFACE_SIZE		9
+ + #define USB_DT_ENDPOINT_SIZE		7
+ + #define USB_DT_ENDPOINT_AUDIO_SIZE	9	/* Audio extension */
+ + #define USB_DT_HUB_NONVAR_SIZE		7
+ + 
+ + /* All standard descriptors have these 2 fields in common */
+ + struct usb_descriptor_header {
+ + 	u_int8_t  bLength;
+ + 	u_int8_t  bDescriptorType;
+ + };
+ + 
+ + /* String descriptor */
+ + struct usb_string_descriptor {
+ + 	u_int8_t  bLength;
+ + 	u_int8_t  bDescriptorType;
+ + 	u_int16_t wData[1];
+ + };
+ + 
+ + /* HID descriptor */
+ + struct usb_hid_descriptor {
+ + 	u_int8_t  bLength;
+ + 	u_int8_t  bDescriptorType;
+ + 	u_int16_t bcdHID;
+ + 	u_int8_t  bCountryCode;
+ + 	u_int8_t  bNumDescriptors;
+ + 	/* u_int8_t  bReportDescriptorType; */
+ + 	/* u_int16_t wDescriptorLength; */
+ + 	/* ... */
+ + };
+ + 
+ + /* Endpoint descriptor */
+ + #define USB_MAXENDPOINTS	32
+ + struct usb_endpoint_descriptor {
+ + 	u_int8_t  bLength;
+ + 	u_int8_t  bDescriptorType;
+ + 	u_int8_t  bEndpointAddress;
+ + 	u_int8_t  bmAttributes;
+ + 	u_int16_t wMaxPacketSize;
+ + 	u_int8_t  bInterval;
+ + 	u_int8_t  bRefresh;
+ + 	u_int8_t  bSynchAddress;
+ + 
+ + 	unsigned char *extra;	/* Extra descriptors */
+ + 	int extralen;
+ + };
+ + 
+ + #define USB_ENDPOINT_ADDRESS_MASK	0x0f    /* in bEndpointAddress */
+ + #define USB_ENDPOINT_DIR_MASK		0x80
+ + 
+ + #define USB_ENDPOINT_TYPE_MASK		0x03    /* in bmAttributes */
+ + #define USB_ENDPOINT_TYPE_CONTROL	0
+ + #define USB_ENDPOINT_TYPE_ISOCHRONOUS	1
+ + #define USB_ENDPOINT_TYPE_BULK		2
+ + #define USB_ENDPOINT_TYPE_INTERRUPT	3
+ + 
+ + /* Interface descriptor */
+ + #define USB_MAXINTERFACES	32
+ + struct usb_interface_descriptor {
+ + 	u_int8_t  bLength;
+ + 	u_int8_t  bDescriptorType;
+ + 	u_int8_t  bInterfaceNumber;
+ + 	u_int8_t  bAlternateSetting;
+ + 	u_int8_t  bNumEndpoints;
+ + 	u_int8_t  bInterfaceClass;
+ + 	u_int8_t  bInterfaceSubClass;
+ + 	u_int8_t  bInterfaceProtocol;
+ + 	u_int8_t  iInterface;
+ + 
+ + 	struct usb_endpoint_descriptor *endpoint;
+ + 
+ + 	unsigned char *extra;	/* Extra descriptors */
+ + 	int extralen;
+ + };
+ + 
+ + #define USB_MAXALTSETTING	128	/* Hard limit */
+ + struct usb_interface {
+ + 	struct usb_interface_descriptor *altsetting;
+ + 
+ + 	int num_altsetting;
+ + };
+ + 
+ + /* Configuration descriptor information.. */
+ + #define USB_MAXCONFIG		8
+ + struct usb_config_descriptor {
+ + 	u_int8_t  bLength;
+ + 	u_int8_t  bDescriptorType;
+ + 	u_int16_t wTotalLength;
+ + 	u_int8_t  bNumInterfaces;
+ + 	u_int8_t  bConfigurationValue;
+ + 	u_int8_t  iConfiguration;
+ + 	u_int8_t  bmAttributes;
+ + 	u_int8_t  MaxPower;
+ + 
+ + 	struct usb_interface *interface;
+ + 
+ + 	unsigned char *extra;	/* Extra descriptors */
+ + 	int extralen;
+ + };
+ + 
+ + /* Device descriptor */
+ + struct usb_device_descriptor {
+ + 	u_int8_t  bLength;
+ + 	u_int8_t  bDescriptorType;
+ + 	u_int16_t bcdUSB;
+ + 	u_int8_t  bDeviceClass;
+ + 	u_int8_t  bDeviceSubClass;
+ + 	u_int8_t  bDeviceProtocol;
+ + 	u_int8_t  bMaxPacketSize0;
+ + 	u_int16_t idVendor;
+ + 	u_int16_t idProduct;
+ + 	u_int16_t bcdDevice;
+ + 	u_int8_t  iManufacturer;
+ + 	u_int8_t  iProduct;
+ + 	u_int8_t  iSerialNumber;
+ + 	u_int8_t  bNumConfigurations;
+ + };
+ + 
+ + struct usb_ctrl_setup {
+ + 	u_int8_t  bRequestType;
+ + 	u_int8_t  bRequest;
+ + 	u_int16_t wValue;
+ + 	u_int16_t wIndex;
+ + 	u_int16_t wLength;
+ + };
+ + 
+ + /*
+ +  * Standard requests
+ +  */
+ + #define USB_REQ_GET_STATUS		0x00
+ + #define USB_REQ_CLEAR_FEATURE		0x01
+ + /* 0x02 is reserved */
+ + #define USB_REQ_SET_FEATURE		0x03
+ + /* 0x04 is reserved */
+ + #define USB_REQ_SET_ADDRESS		0x05
+ + #define USB_REQ_GET_DESCRIPTOR		0x06
+ + #define USB_REQ_SET_DESCRIPTOR		0x07
+ + #define USB_REQ_GET_CONFIGURATION	0x08
+ + #define USB_REQ_SET_CONFIGURATION	0x09
+ + #define USB_REQ_GET_INTERFACE		0x0A
+ + #define USB_REQ_SET_INTERFACE		0x0B
+ + #define USB_REQ_SYNCH_FRAME		0x0C
+ + 
+ + #define USB_TYPE_STANDARD		(0x00 << 5)
+ + #define USB_TYPE_CLASS			(0x01 << 5)
+ + #define USB_TYPE_VENDOR			(0x02 << 5)
+ + #define USB_TYPE_RESERVED		(0x03 << 5)
+ + 
+ + #define USB_RECIP_DEVICE		0x00
+ + #define USB_RECIP_INTERFACE		0x01
+ + #define USB_RECIP_ENDPOINT		0x02
+ + #define USB_RECIP_OTHER			0x03
+ + 
+ + /*
+ +  * Various libusb API related stuff
+ +  */
+ + 
+ + #define USB_ENDPOINT_IN			0x80
+ + #define USB_ENDPOINT_OUT		0x00
+ + 
+ + /* Error codes */
+ + #define USB_ERROR_BEGIN			500000
+ + 
+ + /*
+ +  * This is supposed to look weird. This file is generated from autoconf
+ +  * and I didn't want to make this too complicated.
+ +  */
+ + #if 0
+ + #define USB_LE16_TO_CPU(x) do { x = ((x & 0xff) << 8) | ((x & 0xff00) >> 8); } while(0)
+ + #else
+ + #define USB_LE16_TO_CPU(x)
+ + #endif
+ + 
+ + /* Data types */
+ + struct usb_device;
+ + struct usb_bus;
+ + 
+ + /*
+ +  * To maintain compatibility with applications already built with libusb,
+ +  * we must only add entries to the end of this structure. NEVER delete or
+ +  * move members and only change types if you really know what you're doing.
+ +  */
+ + struct usb_device {
+ +   struct usb_device *next, *prev;
+ + 
+ +   char filename[PATH_MAX + 1];
+ + 
+ +   struct usb_bus *bus;
+ + 
+ +   struct usb_device_descriptor descriptor;
+ +   struct usb_config_descriptor *config;
+ + 
+ +   void *dev;		/* Darwin support */
+ + 
+ +   u_int8_t devnum;
+ + 
+ +   unsigned char num_children;
+ +   struct usb_device **children;
+ + };
+ + 
+ + struct usb_bus {
+ +   struct usb_bus *next, *prev;
+ + 
+ +   char dirname[PATH_MAX + 1];
+ + 
+ +   struct usb_device *devices;
+ +   u_int32_t location;
+ + 
+ +   struct usb_device *root_dev;
+ + };
+ + 
+ + struct usb_dev_handle;
+ + typedef struct usb_dev_handle usb_dev_handle;
+ + 
+ + /* Variables */
+ + extern struct usb_bus *usb_busses;
+ + 
+ + #ifdef __cplusplus
+ + extern "C" {
+ + #endif
+ + 
+ + /* Function prototypes */
+ + 
+ + /* usb.c */
+ + usb_dev_handle *usb_open(struct usb_device *dev);
+ + int usb_close(usb_dev_handle *dev);
+ + 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);
+ + 
+ + /* descriptors.c */
+ + int usb_get_descriptor_by_endpoint(usb_dev_handle *udev, int ep,
+ + 	unsigned char type, unsigned char index, void *buf, int size);
+ + int usb_get_descriptor(usb_dev_handle *udev, unsigned char type,
+ + 	unsigned char index, void *buf, int size);
+ + 
+ + /* <arch>.c */
+ + 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);
+ + 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);
+ + int usb_control_msg(usb_dev_handle *dev, int requesttype, int request,
+ + 	int value, int index, char *bytes, int size, int timeout);
+ + int usb_set_configuration(usb_dev_handle *dev, int configuration);
+ + int usb_claim_interface(usb_dev_handle *dev, int interface);
+ + int usb_release_interface(usb_dev_handle *dev, int interface);
+ + int usb_set_altinterface(usb_dev_handle *dev, int alternate);
+ + int usb_resetep(usb_dev_handle *dev, unsigned int ep);
+ + int usb_clear_halt(usb_dev_handle *dev, unsigned int ep);
+ + int usb_reset(usb_dev_handle *dev);
+ + 
+ + #if 1
+ + #define LIBUSB_HAS_GET_DRIVER_NP 1
+ + int usb_get_driver_np(usb_dev_handle *dev, int interface, char *name,
+ + 	unsigned int namelen);
+ + #define LIBUSB_HAS_DETACH_KERNEL_DRIVER_NP 1
+ + int usb_detach_kernel_driver_np(usb_dev_handle *dev, int interface);
+ + #endif
+ + 
+ + char *usb_strerror(void);
+ + 
+ + void usb_init(void);
+ + void usb_set_debug(int level);
+ + int usb_find_busses(void);
+ + int usb_find_devices(void);
+ + struct usb_device *usb_device(usb_dev_handle *dev);
+ + struct usb_bus *usb_get_busses(void);
+ + 
+ + #ifdef __cplusplus
+ + }
+ + #endif
+ + 
+ + #endif /* __USB_H__ */
+ + 
