1e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev/* 2e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * Prototypes, structure definitions and macros. 3e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * 4e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * Copyright (c) 2000-2003 Johannes Erdfelt <johannes@erdfelt.com> 5e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * 6e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * This library is free software; you can redistribute it and/or 7e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * modify it under the terms of the GNU Lesser General Public 8e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * License as published by the Free Software Foundation; either 9e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * version 2.1 of the License, or (at your option) any later version. 10e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * 11e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * This library is distributed in the hope that it will be useful, 12e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * but WITHOUT ANY WARRANTY; without even the implied warranty of 13e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * Lesser General Public License for more details. 15e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * 16e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * You should have received a copy of the GNU Lesser General Public 17e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * License along with this library; if not, write to the Free Software 18e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * 20e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * This file (and only this file) may alternatively be licensed under the 21e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * BSD license. See the LICENSE file shipped with the libusb-compat-0.1 source 22e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * distribution for details. 23e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev */ 24e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 25e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#ifndef __USB_H__ 26e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define __USB_H__ 27e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 28e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#include <unistd.h> 29e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#include <stdlib.h> 30e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#include <limits.h> 31e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 32e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#include <dirent.h> 33e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 34e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev/* 35e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * USB spec information 36e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * 37e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * This is all stuff grabbed from various USB specs and is pretty much 38e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * not subject to change 39e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev */ 40e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 41e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev/* 42e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * Device and/or Interface Class codes 43e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev */ 44e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */ 45e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_CLASS_AUDIO 1 46e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_CLASS_COMM 2 47e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_CLASS_HID 3 48e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_CLASS_PRINTER 7 49e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_CLASS_PTP 6 50e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_CLASS_MASS_STORAGE 8 51e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_CLASS_HUB 9 52e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_CLASS_DATA 10 53e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_CLASS_VENDOR_SPEC 0xff 54e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 55e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev/* 56e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * Descriptor types 57e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev */ 58e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_DT_DEVICE 0x01 59e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_DT_CONFIG 0x02 60e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_DT_STRING 0x03 61e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_DT_INTERFACE 0x04 62e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_DT_ENDPOINT 0x05 63e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 64e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_DT_HID 0x21 65e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_DT_REPORT 0x22 66e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_DT_PHYSICAL 0x23 67e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_DT_HUB 0x29 68e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 69e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev/* 70e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * Descriptor sizes per descriptor type 71e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev */ 72e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_DT_DEVICE_SIZE 18 73e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_DT_CONFIG_SIZE 9 74e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_DT_INTERFACE_SIZE 9 75e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_DT_ENDPOINT_SIZE 7 76e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */ 77e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_DT_HUB_NONVAR_SIZE 7 78e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 79e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev/* All standard descriptors have these 2 fields in common */ 80e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevstruct usb_descriptor_header { 81e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bLength; 82e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bDescriptorType; 83e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev}; 84e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 85e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev/* String descriptor */ 86e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevstruct usb_string_descriptor { 87e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bLength; 88e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bDescriptorType; 89e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int16_t wData[1]; 90e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev}; 91e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 92e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev/* HID descriptor */ 93e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevstruct usb_hid_descriptor { 94e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bLength; 95e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bDescriptorType; 96e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int16_t bcdHID; 97e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bCountryCode; 98e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bNumDescriptors; 99e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev /* u_int8_t bReportDescriptorType; */ 100e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev /* u_int16_t wDescriptorLength; */ 101e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev /* ... */ 102e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev}; 103e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 104e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev/* Endpoint descriptor */ 105e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_MAXENDPOINTS 32 106e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevstruct usb_endpoint_descriptor { 107e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bLength; 108e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bDescriptorType; 109e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bEndpointAddress; 110e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bmAttributes; 111e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int16_t wMaxPacketSize; 112e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bInterval; 113e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bRefresh; 114e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bSynchAddress; 115e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 116e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev unsigned char *extra; /* Extra descriptors */ 117e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev int extralen; 118e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev}; 119e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 120e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_ENDPOINT_ADDRESS_MASK 0x0f /* in bEndpointAddress */ 121e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_ENDPOINT_DIR_MASK 0x80 122e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 123e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_ENDPOINT_TYPE_MASK 0x03 /* in bmAttributes */ 124e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_ENDPOINT_TYPE_CONTROL 0 125e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_ENDPOINT_TYPE_ISOCHRONOUS 1 126e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_ENDPOINT_TYPE_BULK 2 127e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_ENDPOINT_TYPE_INTERRUPT 3 128e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 129e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev/* Interface descriptor */ 130e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_MAXINTERFACES 32 131e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevstruct usb_interface_descriptor { 132e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bLength; 133e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bDescriptorType; 134e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bInterfaceNumber; 135e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bAlternateSetting; 136e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bNumEndpoints; 137e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bInterfaceClass; 138e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bInterfaceSubClass; 139e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bInterfaceProtocol; 140e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t iInterface; 141e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 142e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev struct usb_endpoint_descriptor *endpoint; 143e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 144e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev unsigned char *extra; /* Extra descriptors */ 145e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev int extralen; 146e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev}; 147e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 148e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_MAXALTSETTING 128 /* Hard limit */ 149e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevstruct usb_interface { 150e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev struct usb_interface_descriptor *altsetting; 151e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 152e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev int num_altsetting; 153e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev}; 154e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 155e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev/* Configuration descriptor information.. */ 156e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_MAXCONFIG 8 157e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevstruct usb_config_descriptor { 158e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bLength; 159e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bDescriptorType; 160e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int16_t wTotalLength; 161e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bNumInterfaces; 162e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bConfigurationValue; 163e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t iConfiguration; 164e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bmAttributes; 165e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t MaxPower; 166e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 167e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev struct usb_interface *interface; 168e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 169e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev unsigned char *extra; /* Extra descriptors */ 170e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev int extralen; 171e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev}; 172e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 173e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev/* Device descriptor */ 174e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevstruct usb_device_descriptor { 175e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bLength; 176e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bDescriptorType; 177e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int16_t bcdUSB; 178e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bDeviceClass; 179e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bDeviceSubClass; 180e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bDeviceProtocol; 181e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bMaxPacketSize0; 182e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int16_t idVendor; 183e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int16_t idProduct; 184e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int16_t bcdDevice; 185e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t iManufacturer; 186e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t iProduct; 187e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t iSerialNumber; 188e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bNumConfigurations; 189e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev}; 190e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 191e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevstruct usb_ctrl_setup { 192e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bRequestType; 193e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t bRequest; 194e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int16_t wValue; 195e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int16_t wIndex; 196e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int16_t wLength; 197e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev}; 198e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 199e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev/* 200e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * Standard requests 201e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev */ 202e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_REQ_GET_STATUS 0x00 203e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_REQ_CLEAR_FEATURE 0x01 204e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev/* 0x02 is reserved */ 205e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_REQ_SET_FEATURE 0x03 206e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev/* 0x04 is reserved */ 207e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_REQ_SET_ADDRESS 0x05 208e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_REQ_GET_DESCRIPTOR 0x06 209e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_REQ_SET_DESCRIPTOR 0x07 210e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_REQ_GET_CONFIGURATION 0x08 211e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_REQ_SET_CONFIGURATION 0x09 212e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_REQ_GET_INTERFACE 0x0A 213e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_REQ_SET_INTERFACE 0x0B 214e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_REQ_SYNCH_FRAME 0x0C 215e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 216e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_TYPE_STANDARD (0x00 << 5) 217e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_TYPE_CLASS (0x01 << 5) 218e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_TYPE_VENDOR (0x02 << 5) 219e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_TYPE_RESERVED (0x03 << 5) 220e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 221e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_RECIP_DEVICE 0x00 222e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_RECIP_INTERFACE 0x01 223e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_RECIP_ENDPOINT 0x02 224e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_RECIP_OTHER 0x03 225e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 226e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev/* 227e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * Various libusb API related stuff 228e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev */ 229e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 230e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_ENDPOINT_IN 0x80 231e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_ENDPOINT_OUT 0x00 232e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 233e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev/* Error codes */ 234e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define USB_ERROR_BEGIN 500000 235e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 236e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev/* Data types */ 237e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevstruct usb_device; 238e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevstruct usb_bus; 239e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 240e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev/* 241e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * To maintain compatibility with applications already built with libusb, 242e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * we must only add entries to the end of this structure. NEVER delete or 243e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev * move members and only change types if you really know what you're doing. 244e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev */ 245e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevstruct usb_device { 246e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev struct usb_device *next, *prev; 247e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 248e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev char filename[PATH_MAX + 1]; 249e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 250e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev struct usb_bus *bus; 251e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 252e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev struct usb_device_descriptor descriptor; 253e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev struct usb_config_descriptor *config; 254e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 255e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev void *dev; /* Darwin support */ 256e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 257e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int8_t devnum; 258e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 259e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev unsigned char num_children; 260e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev struct usb_device **children; 261e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev}; 262e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 263e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevstruct usb_bus { 264e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev struct usb_bus *next, *prev; 265e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 266e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev char dirname[PATH_MAX + 1]; 267e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 268e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev struct usb_device *devices; 269e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev u_int32_t location; 270e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 271e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev struct usb_device *root_dev; 272e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev}; 273e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 274e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevstruct usb_dev_handle; 275e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevtypedef struct usb_dev_handle usb_dev_handle; 276e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 277e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev/* Variables */ 278e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevextern struct usb_bus *usb_busses; 279e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 280e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#ifdef __cplusplus 281e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevextern "C" { 282e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#endif 283e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 284e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev/* Function prototypes */ 285e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 286e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev/* usb.c */ 287e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevusb_dev_handle *usb_open(struct usb_device *dev); 288e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevint usb_close(usb_dev_handle *dev); 289e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevint usb_get_string(usb_dev_handle *dev, int index, int langid, char *buf, 290e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev size_t buflen); 291e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevint usb_get_string_simple(usb_dev_handle *dev, int index, char *buf, 292e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev size_t buflen); 293e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 294e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev/* descriptors.c */ 295e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevint usb_get_descriptor_by_endpoint(usb_dev_handle *udev, int ep, 296e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev unsigned char type, unsigned char index, void *buf, int size); 297e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevint usb_get_descriptor(usb_dev_handle *udev, unsigned char type, 298e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev unsigned char index, void *buf, int size); 299e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 300e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev/* <arch>.c */ 301e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevint usb_bulk_write(usb_dev_handle *dev, int ep, char *bytes, int size, 302e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev int timeout); 303e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevint usb_bulk_read(usb_dev_handle *dev, int ep, char *bytes, int size, 304e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev int timeout); 305e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevint usb_interrupt_write(usb_dev_handle *dev, int ep, char *bytes, int size, 306e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev int timeout); 307e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevint usb_interrupt_read(usb_dev_handle *dev, int ep, char *bytes, int size, 308e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev int timeout); 309e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevint usb_control_msg(usb_dev_handle *dev, int requesttype, int request, 310e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev int value, int index, char *bytes, int size, int timeout); 311e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevint usb_set_configuration(usb_dev_handle *dev, int configuration); 312e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevint usb_claim_interface(usb_dev_handle *dev, int interface); 313e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevint usb_release_interface(usb_dev_handle *dev, int interface); 314e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevint usb_set_altinterface(usb_dev_handle *dev, int alternate); 315e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevint usb_resetep(usb_dev_handle *dev, unsigned int ep); 316e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevint usb_clear_halt(usb_dev_handle *dev, unsigned int ep); 317e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevint usb_reset(usb_dev_handle *dev); 318e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 319e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define LIBUSB_HAS_GET_DRIVER_NP 1 320e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevint usb_get_driver_np(usb_dev_handle *dev, int interface, char *name, 321e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev unsigned int namelen); 322e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#define LIBUSB_HAS_DETACH_KERNEL_DRIVER_NP 1 323e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevint usb_detach_kernel_driver_np(usb_dev_handle *dev, int interface); 324e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 325e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevchar *usb_strerror(void); 326e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 327e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevvoid usb_init(void); 328e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevvoid usb_set_debug(int level); 329e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevint usb_find_busses(void); 330e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevint usb_find_devices(void); 331e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevstruct usb_device *usb_device(usb_dev_handle *dev); 332e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishevstruct usb_bus *usb_get_busses(void); 333e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 334e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#ifdef __cplusplus 335e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev} 336e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#endif 337e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 338e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev#endif /* __USB_H__ */ 339e9a683104ef3f40d38459c0ca62a2d46f20b0714Yavor Goulishev 340