libusbi.h revision c3844f7aeb2176636ce6e6ef697659fdb0b30048
1852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake/* 2e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drake * Internal header for libusb 3852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * Copyright (C) 2007 Daniel Drake <dsd@gentoo.org> 4852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * Copyright (c) 2001 Johannes Erdfelt <johannes@erdfelt.com> 5852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * 6852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * This library is free software; you can redistribute it and/or 7852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * modify it under the terms of the GNU Lesser General Public 8852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * License as published by the Free Software Foundation; either 9852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * version 2.1 of the License, or (at your option) any later version. 10852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * 11852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * This library is distributed in the hope that it will be useful, 12852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * but WITHOUT ANY WARRANTY; without even the implied warranty of 13852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * Lesser General Public License for more details. 15852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * 16852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * You should have received a copy of the GNU Lesser General Public 17852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * License along with this library; if not, write to the Free Software 18852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake */ 20852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 21e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drake#ifndef __LIBUSBI_H__ 22e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drake#define __LIBUSBI_H__ 23852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 24852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#include <config.h> 25852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 26852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#include <endian.h> 270efd2efa65d5513e5754d717d522b2c5c45332e2Daniel Drake#include <pthread.h> 28852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#include <stddef.h> 29c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake#include <sys/select.h> 30852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#include <time.h> 31852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 32e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drake#include <libusb.h> 33852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 34852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define DEVICE_DESC_LENGTH 18 35852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 36a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake#define USB_MAXENDPOINTS 32 37a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake#define USB_MAXINTERFACES 32 38a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake#define USB_MAXCONFIG 8 39a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake 40852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakestruct list_head { 41852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake struct list_head *prev, *next; 42852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake}; 43852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 44852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake/* Get an entry from the list 45852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * ptr - the address of this list_head element in "type" 46852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * type - the data type that contains "member" 47852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * member - the list_head element in "type" 48852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake */ 49852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define list_entry(ptr, type, member) \ 50852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake ((type *)((char *)(ptr) - (unsigned long)(&((type *)0L)->member))) 51852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 52852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake/* Get each entry from a list 53852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * pos - A structure pointer has a "member" element 54852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * head - list head 55852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * member - the list_head element in "pos" 56852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake */ 57852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define list_for_each_entry(pos, head, member) \ 58852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake for (pos = list_entry((head)->next, typeof(*pos), member); \ 59852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake &pos->member != (head); \ 60852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake pos = list_entry(pos->member.next, typeof(*pos), member)) 61852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 62852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define list_for_each_entry_safe(pos, n, head, member) \ 63852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake for (pos = list_entry((head)->next, typeof(*pos), member), \ 64852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake n = list_entry(pos->member.next, typeof(*pos), member); \ 65852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake &pos->member != (head); \ 66852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake pos = n, n = list_entry(n->member.next, typeof(*n), member)) 67852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 68852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define list_empty(entry) ((entry)->next == (entry)) 69852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 70852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakestatic inline void list_init(struct list_head *entry) 71852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake{ 72852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake entry->prev = entry->next = entry; 73852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake} 74852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 75852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakestatic inline void list_add(struct list_head *entry, struct list_head *head) 76852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake{ 77852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake entry->next = head->next; 78852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake entry->prev = head; 79852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 80852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake head->next->prev = entry; 81852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake head->next = entry; 82852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake} 83852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 84852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakestatic inline void list_add_tail(struct list_head *entry, 85852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake struct list_head *head) 86852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake{ 87852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake entry->next = head; 88852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake entry->prev = head->prev; 89852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 90852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake head->prev->next = entry; 91852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake head->prev = entry; 92852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake} 93852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 94852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakestatic inline void list_del(struct list_head *entry) 95852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake{ 96852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake entry->next->prev = entry->prev; 97852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake entry->prev->next = entry->next; 98852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake} 99852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 100852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define container_of(ptr, type, member) ({ \ 101852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake const typeof( ((type *)0)->member ) *__mptr = (ptr); \ 102852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake (type *)( (char *)__mptr - offsetof(type,member) );}) 103852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 104852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define bswap16(x) (((x & 0xff) << 8) | (x >> 8)) 105852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#if __BYTE_ORDER == __LITTLE_ENDIAN 106852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define cpu_to_le16(x) (x) 107852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define le16_to_cpu(x) (x) 108852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#elif __BYTE_ORDER == __BIG_ENDIAN 109852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define le16_to_cpu(x) bswap16(x) 110852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define cpu_to_le16(x) bswap16(x) 111852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#else 112852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#error "Unrecognized endianness" 113852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#endif 114852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 115852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define MIN(a, b) ((a) < (b) ? (a) : (b)) 116852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define MAX(a, b) ((a) > (b) ? (a) : (b)) 117852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 118852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define TIMESPEC_IS_SET(ts) ((ts)->tv_sec != 0 || (ts)->tv_nsec != 0) 119852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 120dbb3fd871e3972b4e670f3161e7cd2f58f357600Daniel Drakeenum usbi_log_level { 121852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake LOG_LEVEL_DEBUG, 122852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake LOG_LEVEL_INFO, 123852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake LOG_LEVEL_WARNING, 124852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake LOG_LEVEL_ERROR, 125852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake}; 126852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 127dbb3fd871e3972b4e670f3161e7cd2f58f357600Daniel Drakevoid usbi_log(enum usbi_log_level, const char *function, const char *format, ...); 128852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 129852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#ifdef ENABLE_LOGGING 130dbb3fd871e3972b4e670f3161e7cd2f58f357600Daniel Drake#define _usbi_log(level, fmt...) usbi_log(level, __FUNCTION__, fmt) 131852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#else 132dbb3fd871e3972b4e670f3161e7cd2f58f357600Daniel Drake#define _usbi_log(level, fmt...) 133852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#endif 134852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 135852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#ifdef ENABLE_DEBUG_LOGGING 136e3a09ca0b9cb6f46d54a0130f678c6097240a2bdDaniel Drake#define usbi_dbg(fmt...) _usbi_log(LOG_LEVEL_DEBUG, fmt) 137852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#else 138e3a09ca0b9cb6f46d54a0130f678c6097240a2bdDaniel Drake#define usbi_dbg(fmt...) 139852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#endif 140852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 141e3a09ca0b9cb6f46d54a0130f678c6097240a2bdDaniel Drake#define usbi_info(fmt...) _usbi_log(LOG_LEVEL_INFO, fmt) 142e3a09ca0b9cb6f46d54a0130f678c6097240a2bdDaniel Drake#define usbi_warn(fmt...) _usbi_log(LOG_LEVEL_WARNING, fmt) 143e3a09ca0b9cb6f46d54a0130f678c6097240a2bdDaniel Drake#define usbi_err(fmt...) _usbi_log(LOG_LEVEL_ERROR, fmt) 144852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 1459cfdb494fccac53a4277da7c8b6d15f1a72a4959Daniel Drakestruct libusb_device { 1461fcdb0678b759569db7cd530457dbc0a5f86fb1dDaniel Drake /* lock protects refcnt, everything else is finalized at initialization 1471fcdb0678b759569db7cd530457dbc0a5f86fb1dDaniel Drake * time */ 1481fcdb0678b759569db7cd530457dbc0a5f86fb1dDaniel Drake pthread_mutex_t lock; 1499cfdb494fccac53a4277da7c8b6d15f1a72a4959Daniel Drake int refcnt; 1501fcdb0678b759569db7cd530457dbc0a5f86fb1dDaniel Drake 1513675e978fb7a1042f8601931255658bcd14a2298Daniel Drake uint8_t bus_number; 1523675e978fb7a1042f8601931255658bcd14a2298Daniel Drake uint8_t device_address; 153c3844f7aeb2176636ce6e6ef697659fdb0b30048Daniel Drake uint8_t num_configurations; 1543675e978fb7a1042f8601931255658bcd14a2298Daniel Drake 1551fcdb0678b759569db7cd530457dbc0a5f86fb1dDaniel Drake struct list_head list; 156f3fdf447916289cd92b7190377681894e8ab611aDaniel Drake unsigned long session_data; 157c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake unsigned char os_priv[0]; 158852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake}; 159852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 160ebad1c79688ba603ad017ed0fe2f3c0dc8edd1adDaniel Drakestruct libusb_device_handle { 161e20f8281fb7da32587f81b5eea5818af1eab0fe0Daniel Drake /* lock protects claimed_interfaces */ 162e20f8281fb7da32587f81b5eea5818af1eab0fe0Daniel Drake pthread_mutex_t lock; 163e20f8281fb7da32587f81b5eea5818af1eab0fe0Daniel Drake unsigned long claimed_interfaces; 164e20f8281fb7da32587f81b5eea5818af1eab0fe0Daniel Drake 165852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake struct list_head list; 1669cfdb494fccac53a4277da7c8b6d15f1a72a4959Daniel Drake struct libusb_device *dev; 167c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake unsigned char os_priv[0]; 168852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake}; 169852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 1707ac0a405b4c57db42e88cbcba5f135697f03b646Daniel Drake#define USBI_TRANSFER_TIMED_OUT (1<<0) 171852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 172211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake/* in-memory transfer layout: 173211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake * 174211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake * 1. struct usbi_transfer 175211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake * 2. struct libusb_transfer (which includes iso packets) [variable size] 176211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake * 3. os private data [variable size] 177211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake * 178211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake * from a libusb_transfer, you can get the usbi_transfer by rewinding the 179211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake * appropriate number of bytes. 180211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake * the usbi_transfer includes the number of allocated packets, so you can 181211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake * determine the size of the transfer and hence the start and length of the 182211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake * OS-private data. 183211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake */ 184852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 185211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drakestruct usbi_transfer { 186211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake int num_iso_packets; 187852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake struct list_head list; 188637a8d7ff8a11a23588925d9d3003a609bda8075Daniel Drake struct timeval timeout; 189852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake int transferred; 190852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake uint8_t flags; 191852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake}; 192852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 193211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake#define __USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer) \ 194211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake ((struct libusb_transfer *)(((void *)(transfer)) \ 195211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake + sizeof(struct usbi_transfer))) 196211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake#define __LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer) \ 197211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake ((struct usbi_transfer *)(((void *)(transfer)) \ 198211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake - sizeof(struct usbi_transfer))) 199211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake 200211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drakestatic inline void *usbi_transfer_get_os_priv(struct usbi_transfer *transfer) 201211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake{ 202211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake return ((void *)transfer) + sizeof(struct usbi_transfer) 203211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake + sizeof(struct libusb_transfer) 204211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake + (transfer->num_iso_packets 205211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake * sizeof(struct libusb_iso_packet_descriptor)); 206211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake} 207211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake 208852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake/* bus structures */ 209852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 210a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake/* All standard descriptors have these 2 fields in common */ 211a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drakestruct usb_descriptor_header { 212a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake uint8_t bLength; 213a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake uint8_t bDescriptorType; 214a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake}; 215a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake 216852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake/* shared data and functions */ 217852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 218c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakeextern struct list_head usbi_open_devs; 2190efd2efa65d5513e5754d717d522b2c5c45332e2Daniel Drakeextern pthread_mutex_t usbi_open_devs_lock; 220852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 221637a8d7ff8a11a23588925d9d3003a609bda8075Daniel Drakevoid usbi_io_init(void); 222c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 223c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakestruct libusb_device *usbi_alloc_device(unsigned long session_id); 224c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakestruct libusb_device *usbi_get_device_by_session_id(unsigned long session_id); 225fe4adcc99e30115204ab832ad3e0170c9aca7629Daniel Drakeint usbi_sanitize_device(struct libusb_device *dev); 226c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 227c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakevoid usbi_handle_transfer_completion(struct usbi_transfer *itransfer, 228c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake enum libusb_transfer_status status); 229c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakevoid usbi_handle_transfer_cancellation(struct usbi_transfer *transfer); 230852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 231dbb3fd871e3972b4e670f3161e7cd2f58f357600Daniel Drakeint usbi_parse_descriptor(unsigned char *source, char *descriptor, void *dest); 232a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake 233c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake/* polling */ 234c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 235c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakestruct usbi_pollfd { 236c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake /* must come first */ 237c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake struct libusb_pollfd pollfd; 238c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 239c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake struct list_head list; 240c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake}; 241c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 242c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakeint usbi_add_pollfd(int fd, short events); 243c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakevoid usbi_remove_pollfd(int fd); 244c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 245c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake/* device discovery */ 246c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 247c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake/* we traverse usbfs without knowing how many devices we are going to find. 248c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake * so we create this discovered_devs model which is similar to a linked-list 249c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake * which grows when required. it can be freed once discovery has completed, 250c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake * eliminating the need for a list node in the libusb_device structure 251c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake * itself. */ 252c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakestruct discovered_devs { 253c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake size_t len; 254c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake size_t capacity; 255c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake struct libusb_device *devices[0]; 256c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake}; 257c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 258c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakestruct discovered_devs *discovered_devs_append( 259c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake struct discovered_devs *discdevs, struct libusb_device *dev); 260c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 261c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake/* OS abstraction */ 262c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 263c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakestruct usbi_os_backend { 264c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake const char *name; 265c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake int (*init)(void); 266c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake void (*exit)(void); 267c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 268285724cc14ea5f993e2c4c92fe0aaf6c335bc139Vasily Khoruzhick int (*get_device_list)(struct discovered_devs **discdevs); 269c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 270c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake int (*open)(struct libusb_device_handle *handle); 271c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake void (*close)(struct libusb_device_handle *handle); 272c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 273b27fff633843824744df7d334cb89ece329cafa6Daniel Drake int (*get_device_descriptor)(struct libusb_device *device, 274fe4adcc99e30115204ab832ad3e0170c9aca7629Daniel Drake unsigned char *buffer); 275fe4adcc99e30115204ab832ad3e0170c9aca7629Daniel Drake int (*get_active_config_descriptor)(struct libusb_device *device, 276fe4adcc99e30115204ab832ad3e0170c9aca7629Daniel Drake unsigned char *buffer, size_t len); 277c3844f7aeb2176636ce6e6ef697659fdb0b30048Daniel Drake int (*get_config_descriptor)(struct libusb_device *device, 278c3844f7aeb2176636ce6e6ef697659fdb0b30048Daniel Drake uint8_t config_index, unsigned char *buffer, size_t len); 279b27fff633843824744df7d334cb89ece329cafa6Daniel Drake 2800f463fe671455670efcf4a93e526b2a9082b0afeDaniel Drake int (*set_configuration)(struct libusb_device_handle *handle, int config); 2810f463fe671455670efcf4a93e526b2a9082b0afeDaniel Drake 282c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake int (*claim_interface)(struct libusb_device_handle *handle, int iface); 283c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake int (*release_interface)(struct libusb_device_handle *handle, int iface); 284c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 28562077b7fa5b222e1bb9dea3467585aed69d596e2Daniel Drake int (*set_interface_altsetting)(struct libusb_device_handle *handle, 28662077b7fa5b222e1bb9dea3467585aed69d596e2Daniel Drake int iface, int altsetting); 287c01f744ce07bbeccbe353e956479f0cc5a811a6fDaniel Drake int (*clear_halt)(struct libusb_device_handle *handle, 288c01f744ce07bbeccbe353e956479f0cc5a811a6fDaniel Drake unsigned char endpoint); 289bfe74e9cd9c17a40fff042ea0647326f51cfecaeDaniel Drake int (*reset_device)(struct libusb_device_handle *handle); 29062077b7fa5b222e1bb9dea3467585aed69d596e2Daniel Drake 291470b1bc42bf53373ce678fc76bab9160a54d6881Daniel Drake /* optional */ 292470b1bc42bf53373ce678fc76bab9160a54d6881Daniel Drake int (*kernel_driver_active)(struct libusb_device_handle *handle, 293470b1bc42bf53373ce678fc76bab9160a54d6881Daniel Drake int interface); 294470b1bc42bf53373ce678fc76bab9160a54d6881Daniel Drake int (*detach_kernel_driver)(struct libusb_device_handle *handle, 295470b1bc42bf53373ce678fc76bab9160a54d6881Daniel Drake int interface); 296470b1bc42bf53373ce678fc76bab9160a54d6881Daniel Drake 297c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake void (*destroy_device)(struct libusb_device *dev); 298c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 299c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake int (*submit_transfer)(struct usbi_transfer *itransfer); 300c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake int (*cancel_transfer)(struct usbi_transfer *itransfer); 301c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 302c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake int (*handle_events)(fd_set *readfds, fd_set *writefds); 303c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 304c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake /* number of bytes to reserve for libusb_device.os_priv */ 305c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake size_t device_priv_size; 306c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 307c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake /* number of bytes to reserve for libusb_device_handle.os_priv */ 308c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake size_t device_handle_priv_size; 309c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 310c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake /* number of bytes to reserve for usbi_transfer.os_priv */ 311c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake size_t transfer_priv_size; 312211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake 313211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake /* number of additional bytes for os_priv for each iso packet */ 314ad6e2b712c5b54af44424e58a2776686314e26b7Daniel Drake /* FIXME: linux can't use this any more. if other OS's cannot either, 315ad6e2b712c5b54af44424e58a2776686314e26b7Daniel Drake * then remove this */ 316211f80c9f2a4a58cd2bbf5b7751f45089c8961e7Daniel Drake size_t add_iso_packet_size; 317c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake}; 318c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 319c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakeextern const struct usbi_os_backend * const usbi_backend; 320c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 321c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakeextern const struct usbi_os_backend linux_usbfs_backend; 322c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 323852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#endif 324852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 325