libusb20.h revision 246789
160789Sps/* $FreeBSD: head/lib/libusb/libusb20.h 246789 2013-02-14 12:22:40Z hselasky $ */ 2170260Sdelphij/*- 3128349Stjr * Copyright (c) 2008-2009 Hans Petter Selasky. All rights reserved. 4128349Stjr * Copyright (c) 2007-2008 Daniel Drake. All rights reserved. 5128349Stjr * Copyright (c) 2001 Johannes Erdfelt. All rights reserved. 660789Sps * 760789Sps * Redistribution and use in source and binary forms, with or without 860789Sps * modification, are permitted provided that the following conditions 960789Sps * are met: 1060789Sps * 1. Redistributions of source code must retain the above copyright 1160789Sps * notice, this list of conditions and the following disclaimer. 1260789Sps * 2. Redistributions in binary form must reproduce the above copyright 1360789Sps * notice, this list of conditions and the following disclaimer in the 1460789Sps * documentation and/or other materials provided with the distribution. 1560789Sps * 1660789Sps * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17128349Stjr * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1860789Sps * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1960789Sps * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2060789Sps * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2160789Sps * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2260789Sps * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23161479Sdelphij * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2460789Sps * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25161479Sdelphij * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2660789Sps * SUCH DAMAGE. 2760789Sps */ 2860789Sps 2960789Sps#ifndef _LIBUSB20_H_ 3060789Sps#define _LIBUSB20_H_ 3160789Sps 3260789Sps#include <sys/endian.h> 3360789Sps#include <sys/time.h> 3460789Sps#include <sys/types.h> 3560789Sps 3660789Sps#include <stdint.h> 3760789Sps#include <string.h> 3860789Sps#include <time.h> 3960789Sps 4060789Sps#ifdef __cplusplus 4160789Spsextern "C" { 4260789Sps#endif 4360789Sps#if 0 4460789Sps}; /* style */ 4560789Sps 4660789Sps#endif 4760789Sps 4860789Sps/** \ingroup misc 4960789Sps * Error codes. Most libusb20 functions return 0 on success or one of 5060789Sps * these codes on failure. 51170260Sdelphij */ 5260789Spsenum libusb20_error { 5360789Sps /** Success (no error) */ 5460789Sps LIBUSB20_SUCCESS = 0, 5560789Sps 5660789Sps /** Input/output error */ 5760789Sps LIBUSB20_ERROR_IO = -1, 5860789Sps 5960789Sps /** Invalid parameter */ 6060789Sps LIBUSB20_ERROR_INVALID_PARAM = -2, 6160789Sps 6260789Sps /** Access denied (insufficient permissions) */ 6360789Sps LIBUSB20_ERROR_ACCESS = -3, 6460789Sps 6560789Sps /** No such device (it may have been disconnected) */ 6660789Sps LIBUSB20_ERROR_NO_DEVICE = -4, 6760789Sps 6860789Sps /** Entity not found */ 69170260Sdelphij LIBUSB20_ERROR_NOT_FOUND = -5, 7060789Sps 7160789Sps /** Resource busy */ 7260789Sps LIBUSB20_ERROR_BUSY = -6, 7360789Sps 7460789Sps /** Operation timed out */ 7560789Sps LIBUSB20_ERROR_TIMEOUT = -7, 7660789Sps 7760789Sps /** Overflow */ 7860789Sps LIBUSB20_ERROR_OVERFLOW = -8, 7960789Sps 8060789Sps /** Pipe error */ 8160789Sps LIBUSB20_ERROR_PIPE = -9, 8260789Sps 8360789Sps /** System call interrupted (perhaps due to signal) */ 8460789Sps LIBUSB20_ERROR_INTERRUPTED = -10, 8560789Sps 8660789Sps /** Insufficient memory */ 8760789Sps LIBUSB20_ERROR_NO_MEM = -11, 8860789Sps 8960789Sps /** Operation not supported or unimplemented on this platform */ 9060789Sps LIBUSB20_ERROR_NOT_SUPPORTED = -12, 9160789Sps 9260789Sps /** Other error */ 9360789Sps LIBUSB20_ERROR_OTHER = -99, 9460789Sps}; 9560789Sps 9660789Sps/** \ingroup asyncio 9760789Sps * libusb20_tr_get_status() values */ 9860789Spsenum libusb20_transfer_status { 9960789Sps /** Transfer completed without error. Note that this does not 10060789Sps * indicate that the entire amount of requested data was 10160789Sps * transferred. */ 10260789Sps LIBUSB20_TRANSFER_COMPLETED, 10360789Sps 10460789Sps /** Callback code to start transfer */ 10560789Sps LIBUSB20_TRANSFER_START, 106170260Sdelphij 10760789Sps /** Drain complete callback code */ 10860789Sps LIBUSB20_TRANSFER_DRAINED, 109170260Sdelphij 11060789Sps /** Transfer failed */ 111161479Sdelphij LIBUSB20_TRANSFER_ERROR, 112161479Sdelphij 11360789Sps /** Transfer timed out */ 11460789Sps LIBUSB20_TRANSFER_TIMED_OUT, 115128350Stjr 11660789Sps /** Transfer was cancelled */ 117161479Sdelphij LIBUSB20_TRANSFER_CANCELLED, 11860789Sps 119128349Stjr /** For bulk/interrupt endpoints: halt condition detected 12060789Sps * (endpoint stalled). For control endpoints: control request 12160789Sps * not supported. */ 12260789Sps LIBUSB20_TRANSFER_STALL, 12360789Sps 12460789Sps /** Device was disconnected */ 12560789Sps LIBUSB20_TRANSFER_NO_DEVICE, 12660789Sps 12760789Sps /** Device sent more data than requested */ 12860789Sps LIBUSB20_TRANSFER_OVERFLOW, 12960789Sps}; 13060789Sps 13160789Sps/** \ingroup asyncio 13260789Sps * libusb20_tr_set_flags() values */ 133170260Sdelphijenum libusb20_transfer_flags { 134170260Sdelphij /** Report a short frame as error */ 135170260Sdelphij LIBUSB20_TRANSFER_SINGLE_SHORT_NOT_OK = 0x0001, 136170260Sdelphij 137170260Sdelphij /** Multiple short frames are not allowed */ 138170260Sdelphij LIBUSB20_TRANSFER_MULTI_SHORT_NOT_OK = 0x0002, 13960789Sps 14060789Sps /** All transmitted frames are short terminated */ 141128349Stjr LIBUSB20_TRANSFER_FORCE_SHORT = 0x0004, 14260789Sps 14360789Sps /** Will do a clear-stall before xfer */ 14460789Sps LIBUSB20_TRANSFER_DO_CLEAR_STALL = 0x0008, 14560789Sps}; 14660789Sps 14760789Sps/** \ingroup misc 14860789Sps * libusb20_dev_get_mode() values 14960789Sps */ 15060789Spsenum libusb20_device_mode { 15160789Sps LIBUSB20_MODE_HOST, /* default */ 15260789Sps LIBUSB20_MODE_DEVICE, 15360789Sps}; 15460789Sps 15560789Sps/** \ingroup misc 15660789Sps * libusb20_dev_get_speed() values 15760789Sps */ 15860789Spsenum { 15960789Sps LIBUSB20_SPEED_UNKNOWN, /* default */ 16060789Sps LIBUSB20_SPEED_LOW, 16160789Sps LIBUSB20_SPEED_FULL, 16260789Sps LIBUSB20_SPEED_HIGH, 16360789Sps LIBUSB20_SPEED_VARIABLE, 16460789Sps LIBUSB20_SPEED_SUPER, 16560789Sps}; 16660789Sps 167170260Sdelphij/** \ingroup misc 16860789Sps * libusb20_dev_set_power() values 16960789Sps */ 170170260Sdelphijenum { 17160789Sps LIBUSB20_POWER_OFF, 17260789Sps LIBUSB20_POWER_ON, 17360789Sps LIBUSB20_POWER_SAVE, 17460789Sps LIBUSB20_POWER_SUSPEND, 175170260Sdelphij LIBUSB20_POWER_RESUME, 176170260Sdelphij}; 177170260Sdelphij 178170260Sdelphijstruct usb_device_info; 179170260Sdelphijstruct libusb20_transfer; 180170260Sdelphijstruct libusb20_backend; 181170260Sdelphijstruct libusb20_backend_methods; 182170260Sdelphijstruct libusb20_device; 183170260Sdelphijstruct libusb20_device_methods; 18460789Spsstruct libusb20_config; 18560789Spsstruct LIBUSB20_CONTROL_SETUP_DECODED; 18660789Spsstruct LIBUSB20_DEVICE_DESC_DECODED; 187242618Sdelphij 18860789Spstypedef void (libusb20_tr_callback_t)(struct libusb20_transfer *xfer); 18960789Sps 19060789Spsstruct libusb20_quirk { 19160789Sps uint16_t vid; /* vendor ID */ 19260789Sps uint16_t pid; /* product ID */ 19360789Sps uint16_t bcdDeviceLow; /* low revision value, inclusive */ 19460789Sps uint16_t bcdDeviceHigh; /* high revision value, inclusive */ 19560789Sps uint16_t reserved[2]; /* for the future */ 19689023Sps /* quirk name, UQ_XXX, including terminating zero */ 197242584Sdelphij char quirkname[64 - 12]; 198242584Sdelphij}; 199242584Sdelphij 200242584Sdelphij#define LIBUSB20_MAX_FRAME_PRE_SCALE (1U << 31) 201242584Sdelphij 202242584Sdelphij/* USB transfer operations */ 203242584Sdelphijint libusb20_tr_close(struct libusb20_transfer *xfer); 204242584Sdelphijint libusb20_tr_open(struct libusb20_transfer *xfer, uint32_t max_buf_size, uint32_t max_frame_count, uint8_t ep_no); 205242584Sdelphijint libusb20_tr_open_stream(struct libusb20_transfer *xfer, uint32_t max_buf_size, uint32_t max_frame_count, uint8_t ep_no, uint16_t stream_id); 206242584Sdelphijstruct libusb20_transfer *libusb20_tr_get_pointer(struct libusb20_device *pdev, uint16_t tr_index); 207242584Sdelphijuint16_t libusb20_tr_get_time_complete(struct libusb20_transfer *xfer); 208128349Stjruint32_t libusb20_tr_get_actual_frames(struct libusb20_transfer *xfer); 20960789Spsuint32_t libusb20_tr_get_actual_length(struct libusb20_transfer *xfer); 21060789Spsuint32_t libusb20_tr_get_max_frames(struct libusb20_transfer *xfer); 21160789Spsuint32_t libusb20_tr_get_max_packet_length(struct libusb20_transfer *xfer); 212128349Stjruint32_t libusb20_tr_get_max_total_length(struct libusb20_transfer *xfer); 213128349Stjruint8_t libusb20_tr_get_status(struct libusb20_transfer *xfer); 21460789Spsuint8_t libusb20_tr_pending(struct libusb20_transfer *xfer); 215128349Stjrvoid libusb20_tr_callback_wrapper(struct libusb20_transfer *xfer); 216128349Stjrvoid libusb20_tr_clear_stall_sync(struct libusb20_transfer *xfer); 21760789Spsvoid libusb20_tr_drain(struct libusb20_transfer *xfer); 218128349Stjrvoid libusb20_tr_set_buffer(struct libusb20_transfer *xfer, void *buffer, uint16_t fr_index); 219128349Stjrvoid libusb20_tr_set_callback(struct libusb20_transfer *xfer, libusb20_tr_callback_t *cb); 22060789Spsvoid libusb20_tr_set_flags(struct libusb20_transfer *xfer, uint8_t flags); 221128349Stjruint32_t libusb20_tr_get_length(struct libusb20_transfer *xfer, uint16_t fr_index); 222128349Stjrvoid libusb20_tr_set_length(struct libusb20_transfer *xfer, uint32_t length, uint16_t fr_index); 22360789Spsvoid libusb20_tr_set_priv_sc0(struct libusb20_transfer *xfer, void *sc0); 224128349Stjrvoid libusb20_tr_set_priv_sc1(struct libusb20_transfer *xfer, void *sc1); 225128349Stjrvoid libusb20_tr_set_timeout(struct libusb20_transfer *xfer, uint32_t timeout); 22660789Spsvoid libusb20_tr_set_total_frames(struct libusb20_transfer *xfer, uint32_t nFrames); 227161479Sdelphijvoid libusb20_tr_setup_bulk(struct libusb20_transfer *xfer, void *pbuf, uint32_t length, uint32_t timeout); 228161479Sdelphijvoid libusb20_tr_setup_control(struct libusb20_transfer *xfer, void *psetup, void *pbuf, uint32_t timeout); 229161479Sdelphijvoid libusb20_tr_setup_intr(struct libusb20_transfer *xfer, void *pbuf, uint32_t length, uint32_t timeout); 230128349Stjrvoid libusb20_tr_setup_isoc(struct libusb20_transfer *xfer, void *pbuf, uint32_t length, uint16_t fr_index); 231128349Stjruint8_t libusb20_tr_bulk_intr_sync(struct libusb20_transfer *xfer, void *pbuf, uint32_t length, uint32_t *pactlen, uint32_t timeout); 23260789Spsvoid libusb20_tr_start(struct libusb20_transfer *xfer); 23360789Spsvoid libusb20_tr_stop(struct libusb20_transfer *xfer); 23460789Spsvoid libusb20_tr_submit(struct libusb20_transfer *xfer); 23560789Spsvoid *libusb20_tr_get_priv_sc0(struct libusb20_transfer *xfer); 236221718Sdelphijvoid *libusb20_tr_get_priv_sc1(struct libusb20_transfer *xfer); 237221718Sdelphij 238221718Sdelphij 239128349Stjr/* USB device operations */ 240128349Stjr 24160789Spsconst char *libusb20_dev_get_backend_name(struct libusb20_device *pdev); 242237613Sdelphijconst char *libusb20_dev_get_desc(struct libusb20_device *pdev); 243237613Sdelphijint libusb20_dev_close(struct libusb20_device *pdev); 244237613Sdelphijint libusb20_dev_detach_kernel_driver(struct libusb20_device *pdev, uint8_t iface_index); 245128349Stjrint libusb20_dev_set_config_index(struct libusb20_device *pdev, uint8_t configIndex); 246128349Stjrint libusb20_dev_get_debug(struct libusb20_device *pdev); 24760789Spsint libusb20_dev_get_fd(struct libusb20_device *pdev); 248128349Stjrint libusb20_dev_kernel_driver_active(struct libusb20_device *pdev, uint8_t iface_index); 249128349Stjrint libusb20_dev_open(struct libusb20_device *pdev, uint16_t transfer_max); 250128349Stjrint libusb20_dev_process(struct libusb20_device *pdev); 25160789Spsint libusb20_dev_request_sync(struct libusb20_device *pdev, struct LIBUSB20_CONTROL_SETUP_DECODED *setup, void *data, uint16_t *pactlen, uint32_t timeout, uint8_t flags); 25260789Spsint libusb20_dev_req_string_sync(struct libusb20_device *pdev, uint8_t index, uint16_t langid, void *ptr, uint16_t len); 25360789Spsint libusb20_dev_req_string_simple_sync(struct libusb20_device *pdev, uint8_t index, void *ptr, uint16_t len); 254128349Stjrint libusb20_dev_reset(struct libusb20_device *pdev); 255128349Stjrint libusb20_dev_check_connected(struct libusb20_device *pdev); 25660789Spsint libusb20_dev_set_power_mode(struct libusb20_device *pdev, uint8_t power_mode); 257128349Stjruint8_t libusb20_dev_get_power_mode(struct libusb20_device *pdev); 258128349Stjruint16_t libusb20_dev_get_power_usage(struct libusb20_device *pdev); 25963132Spsint libusb20_dev_set_alt_index(struct libusb20_device *pdev, uint8_t iface_index, uint8_t alt_index); 260128349Stjrint libusb20_dev_get_info(struct libusb20_device *pdev, struct usb_device_info *pinfo); 261128349Stjrint libusb20_dev_get_iface_desc(struct libusb20_device *pdev, uint8_t iface_index, char *buf, uint8_t len); 26263132Sps 263128349Stjrstruct LIBUSB20_DEVICE_DESC_DECODED *libusb20_dev_get_device_desc(struct libusb20_device *pdev); 264128349Stjrstruct libusb20_config *libusb20_dev_alloc_config(struct libusb20_device *pdev, uint8_t config_index); 26560789Spsstruct libusb20_device *libusb20_dev_alloc(void); 266128349Stjruint8_t libusb20_dev_get_address(struct libusb20_device *pdev); 267128349Stjruint8_t libusb20_dev_get_parent_address(struct libusb20_device *pdev); 26860789Spsuint8_t libusb20_dev_get_parent_port(struct libusb20_device *pdev); 269128349Stjruint8_t libusb20_dev_get_bus_number(struct libusb20_device *pdev); 270128349Stjruint8_t libusb20_dev_get_mode(struct libusb20_device *pdev); 27189023Spsuint8_t libusb20_dev_get_speed(struct libusb20_device *pdev); 272128349Stjruint8_t libusb20_dev_get_config_index(struct libusb20_device *pdev); 273128349Stjrvoid libusb20_dev_free(struct libusb20_device *pdev); 27460789Spsvoid libusb20_dev_set_debug(struct libusb20_device *pdev, int debug); 275128349Stjrvoid libusb20_dev_wait_process(struct libusb20_device *pdev, int timeout); 276128349Stjr 27760789Sps/* USB global operations */ 278128349Stjr 279128349Stjrint libusb20_be_get_dev_quirk(struct libusb20_backend *pbe, uint16_t index, struct libusb20_quirk *pq); 280128349Stjrint libusb20_be_get_quirk_name(struct libusb20_backend *pbe, uint16_t index, struct libusb20_quirk *pq); 281128349Stjrint libusb20_be_add_dev_quirk(struct libusb20_backend *pbe, struct libusb20_quirk *pq); 28263132Spsint libusb20_be_remove_dev_quirk(struct libusb20_backend *pbe, struct libusb20_quirk *pq); 28363132Spsint libusb20_be_get_template(struct libusb20_backend *pbe, int *ptemp); 284128349Stjrint libusb20_be_set_template(struct libusb20_backend *pbe, int temp); 28560789Sps 28660789Sps/* USB backend operations */ 287170260Sdelphij 288170260Sdelphijstruct libusb20_backend *libusb20_be_alloc(const struct libusb20_backend_methods *methods); 289128349Stjrstruct libusb20_backend *libusb20_be_alloc_default(void); 290161479Sdelphijstruct libusb20_backend *libusb20_be_alloc_freebsd(void); 291161479Sdelphijstruct libusb20_backend *libusb20_be_alloc_linux(void); 292161479Sdelphijstruct libusb20_backend *libusb20_be_alloc_ugen20(void); 293128349Stjrstruct libusb20_device *libusb20_be_device_foreach(struct libusb20_backend *pbe, struct libusb20_device *pdev); 29460789Spsvoid libusb20_be_dequeue_device(struct libusb20_backend *pbe, struct libusb20_device *pdev); 29560789Spsvoid libusb20_be_enqueue_device(struct libusb20_backend *pbe, struct libusb20_device *pdev); 296173685Sdelphijvoid libusb20_be_free(struct libusb20_backend *pbe); 297173685Sdelphij 298173685Sdelphij/* USB debugging */ 299128349Stjr 300128349Stjrconst char *libusb20_strerror(int); 30160789Spsconst char *libusb20_error_name(int); 302128349Stjr 303128349Stjr#if 0 30460789Sps{ /* style */ 305128349Stjr#endif 306128349Stjr#ifdef __cplusplus 30760789Sps} 308128349Stjr 309128349Stjr#endif 31060789Sps 311128349Stjr#endif /* _LIBUSB20_H_ */ 312128349Stjr