19b0c1abeSSascha Wildner /* $FreeBSD: head/lib/libusb/libusb10.h 248236 2013-03-13 12:23:14Z hselasky $ */ 21d96047eSMarkus Pfeiffer /*- 31d96047eSMarkus Pfeiffer * Copyright (c) 2009 Sylvestre Gallon. All rights reserved. 41d96047eSMarkus Pfeiffer * 51d96047eSMarkus Pfeiffer * Redistribution and use in source and binary forms, with or without 61d96047eSMarkus Pfeiffer * modification, are permitted provided that the following conditions 71d96047eSMarkus Pfeiffer * are met: 81d96047eSMarkus Pfeiffer * 1. Redistributions of source code must retain the above copyright 91d96047eSMarkus Pfeiffer * notice, this list of conditions and the following disclaimer. 101d96047eSMarkus Pfeiffer * 2. Redistributions in binary form must reproduce the above copyright 111d96047eSMarkus Pfeiffer * notice, this list of conditions and the following disclaimer in the 121d96047eSMarkus Pfeiffer * documentation and/or other materials provided with the distribution. 131d96047eSMarkus Pfeiffer * 141d96047eSMarkus Pfeiffer * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 151d96047eSMarkus Pfeiffer * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 161d96047eSMarkus Pfeiffer * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 171d96047eSMarkus Pfeiffer * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 181d96047eSMarkus Pfeiffer * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 191d96047eSMarkus Pfeiffer * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 201d96047eSMarkus Pfeiffer * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 211d96047eSMarkus Pfeiffer * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 221d96047eSMarkus Pfeiffer * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 231d96047eSMarkus Pfeiffer * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 241d96047eSMarkus Pfeiffer * SUCH DAMAGE. 251d96047eSMarkus Pfeiffer */ 261d96047eSMarkus Pfeiffer 271d96047eSMarkus Pfeiffer #ifndef __LIBUSB10_H__ 281d96047eSMarkus Pfeiffer #define __LIBUSB10_H__ 291d96047eSMarkus Pfeiffer 309b0c1abeSSascha Wildner #ifndef LIBUSB_GLOBAL_INCLUDE_FILE 311d96047eSMarkus Pfeiffer #include <sys/queue.h> 329b0c1abeSSascha Wildner #endif 331d96047eSMarkus Pfeiffer 341d96047eSMarkus Pfeiffer #define GET_CONTEXT(ctx) (((ctx) == NULL) ? usbi_default_context : (ctx)) 351d96047eSMarkus Pfeiffer #define UNEXPORTED __attribute__((__visibility__("hidden"))) 361d96047eSMarkus Pfeiffer #define CTX_LOCK(ctx) pthread_mutex_lock(&(ctx)->ctx_lock) 371d96047eSMarkus Pfeiffer #define CTX_TRYLOCK(ctx) pthread_mutex_trylock(&(ctx)->ctx_lock) 381d96047eSMarkus Pfeiffer #define CTX_UNLOCK(ctx) pthread_mutex_unlock(&(ctx)->ctx_lock) 39c4031fc1SImre Vadász #define HOTPLUG_LOCK(ctx) pthread_mutex_lock(&(ctx)->hotplug_lock) 40c4031fc1SImre Vadász #define HOTPLUG_UNLOCK(ctx) pthread_mutex_unlock(&(ctx)->hotplug_lock) 411d96047eSMarkus Pfeiffer 421d96047eSMarkus Pfeiffer #define DPRINTF(ctx, dbg, format, args...) do { \ 431d96047eSMarkus Pfeiffer if ((ctx)->debug == dbg) { \ 441d96047eSMarkus Pfeiffer switch (dbg) { \ 451d96047eSMarkus Pfeiffer case LIBUSB_DEBUG_FUNCTION: \ 461d96047eSMarkus Pfeiffer printf("LIBUSB_FUNCTION: " \ 471d96047eSMarkus Pfeiffer format "\n", ## args); \ 481d96047eSMarkus Pfeiffer break; \ 491d96047eSMarkus Pfeiffer case LIBUSB_DEBUG_TRANSFER: \ 501d96047eSMarkus Pfeiffer printf("LIBUSB_TRANSFER: " \ 511d96047eSMarkus Pfeiffer format "\n", ## args); \ 521d96047eSMarkus Pfeiffer break; \ 531d96047eSMarkus Pfeiffer default: \ 541d96047eSMarkus Pfeiffer break; \ 551d96047eSMarkus Pfeiffer } \ 561d96047eSMarkus Pfeiffer } \ 571d96047eSMarkus Pfeiffer } while(0) 581d96047eSMarkus Pfeiffer 591d96047eSMarkus Pfeiffer /* internal structures */ 601d96047eSMarkus Pfeiffer 611d96047eSMarkus Pfeiffer struct libusb_super_pollfd { 621d96047eSMarkus Pfeiffer TAILQ_ENTRY(libusb_super_pollfd) entry; 631d96047eSMarkus Pfeiffer struct libusb20_device *pdev; 641d96047eSMarkus Pfeiffer struct libusb_pollfd pollfd; 651d96047eSMarkus Pfeiffer }; 661d96047eSMarkus Pfeiffer 671d96047eSMarkus Pfeiffer struct libusb_super_transfer { 681d96047eSMarkus Pfeiffer TAILQ_ENTRY(libusb_super_transfer) entry; 691d96047eSMarkus Pfeiffer uint8_t *curr_data; 701d96047eSMarkus Pfeiffer uint32_t rem_len; 711d96047eSMarkus Pfeiffer uint32_t last_len; 721d96047eSMarkus Pfeiffer uint8_t state; 731d96047eSMarkus Pfeiffer #define LIBUSB_SUPER_XFER_ST_NONE 0 741d96047eSMarkus Pfeiffer #define LIBUSB_SUPER_XFER_ST_PEND 1 751d96047eSMarkus Pfeiffer }; 761d96047eSMarkus Pfeiffer 77*04a4f0d2SImre Vadász struct libusb_hotplug_callback_handle_struct { 78*04a4f0d2SImre Vadász TAILQ_ENTRY(libusb_hotplug_callback_handle_struct) entry; 79c4031fc1SImre Vadász int events; 80c4031fc1SImre Vadász int vendor; 81c4031fc1SImre Vadász int product; 82c4031fc1SImre Vadász int devclass; 83c4031fc1SImre Vadász libusb_hotplug_callback_fn fn; 84c4031fc1SImre Vadász void *user_data; 85c4031fc1SImre Vadász }; 86c4031fc1SImre Vadász 871d96047eSMarkus Pfeiffer struct libusb_context { 881d96047eSMarkus Pfeiffer int debug; 891d96047eSMarkus Pfeiffer int debug_fixed; 901d96047eSMarkus Pfeiffer int ctrl_pipe[2]; 911d96047eSMarkus Pfeiffer int tr_done_ref; 921d96047eSMarkus Pfeiffer int tr_done_gen; 931d96047eSMarkus Pfeiffer 941d96047eSMarkus Pfeiffer pthread_mutex_t ctx_lock; 95c4031fc1SImre Vadász pthread_mutex_t hotplug_lock; 961d96047eSMarkus Pfeiffer pthread_cond_t ctx_cond; 97c4031fc1SImre Vadász pthread_t hotplug_handler; 981d96047eSMarkus Pfeiffer pthread_t ctx_handler; 991d96047eSMarkus Pfeiffer #define NO_THREAD ((pthread_t)-1) 1001d96047eSMarkus Pfeiffer 1011d96047eSMarkus Pfeiffer TAILQ_HEAD(, libusb_super_pollfd) pollfds; 1021d96047eSMarkus Pfeiffer TAILQ_HEAD(, libusb_super_transfer) tr_done; 103*04a4f0d2SImre Vadász TAILQ_HEAD(, libusb_hotplug_callback_handle_struct) hotplug_cbh; 104c4031fc1SImre Vadász TAILQ_HEAD(, libusb_device) hotplug_devs; 1051d96047eSMarkus Pfeiffer 1061d96047eSMarkus Pfeiffer struct libusb_super_pollfd ctx_poll; 1071d96047eSMarkus Pfeiffer 1081d96047eSMarkus Pfeiffer libusb_pollfd_added_cb fd_added_cb; 1091d96047eSMarkus Pfeiffer libusb_pollfd_removed_cb fd_removed_cb; 1101d96047eSMarkus Pfeiffer void *fd_cb_user_data; 1111d96047eSMarkus Pfeiffer }; 1121d96047eSMarkus Pfeiffer 1131d96047eSMarkus Pfeiffer struct libusb_device { 1141d96047eSMarkus Pfeiffer int refcnt; 1151d96047eSMarkus Pfeiffer 1161d96047eSMarkus Pfeiffer uint32_t claimed_interfaces; 1171d96047eSMarkus Pfeiffer 1181d96047eSMarkus Pfeiffer struct libusb_super_pollfd dev_poll; 1191d96047eSMarkus Pfeiffer 1201d96047eSMarkus Pfeiffer struct libusb_context *ctx; 1211d96047eSMarkus Pfeiffer 122c4031fc1SImre Vadász TAILQ_ENTRY(libusb_device) hotplug_entry; 123c4031fc1SImre Vadász 1241d96047eSMarkus Pfeiffer TAILQ_HEAD(, libusb_super_transfer) tr_head; 1251d96047eSMarkus Pfeiffer 1261d96047eSMarkus Pfeiffer struct libusb20_device *os_priv; 1271d96047eSMarkus Pfeiffer }; 1281d96047eSMarkus Pfeiffer 1291d96047eSMarkus Pfeiffer extern struct libusb_context *usbi_default_context; 1301d96047eSMarkus Pfeiffer 1311d96047eSMarkus Pfeiffer void libusb10_add_pollfd(libusb_context *ctx, struct libusb_super_pollfd *pollfd, struct libusb20_device *pdev, int fd, short events); 1321d96047eSMarkus Pfeiffer void libusb10_remove_pollfd(libusb_context *ctx, struct libusb_super_pollfd *pollfd); 1331d96047eSMarkus Pfeiffer void libusb10_cancel_all_transfer(libusb_device *dev); 1341d96047eSMarkus Pfeiffer 1351d96047eSMarkus Pfeiffer #endif /* __LIBUSB10_H__ */ 136