libusbi.h revision 62077b7fa5b222e1bb9dea3467585aed69d596e2
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> 27852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#include <stddef.h> 28c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake#include <sys/select.h> 29852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#include <time.h> 30852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 31e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drake#include <libusb.h> 32852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 33852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define DEVICE_DESC_LENGTH 18 34852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 35a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake#define USB_MAXENDPOINTS 32 36a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake#define USB_MAXINTERFACES 32 37a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake#define USB_MAXCONFIG 8 38a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake 39852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakestruct list_head { 40852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake struct list_head *prev, *next; 41852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake}; 42852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 43852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake/* Get an entry from the list 44852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * ptr - the address of this list_head element in "type" 45852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * type - the data type that contains "member" 46852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * member - the list_head element in "type" 47852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake */ 48852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define list_entry(ptr, type, member) \ 49852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake ((type *)((char *)(ptr) - (unsigned long)(&((type *)0L)->member))) 50852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 51852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake/* Get each entry from a list 52852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * pos - A structure pointer has a "member" element 53852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * head - list head 54852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * member - the list_head element in "pos" 55852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake */ 56852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define list_for_each_entry(pos, head, member) \ 57852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake for (pos = list_entry((head)->next, typeof(*pos), member); \ 58852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake &pos->member != (head); \ 59852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake pos = list_entry(pos->member.next, typeof(*pos), member)) 60852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 61852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define list_for_each_entry_safe(pos, n, head, member) \ 62852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake for (pos = list_entry((head)->next, typeof(*pos), member), \ 63852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake n = list_entry(pos->member.next, typeof(*pos), member); \ 64852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake &pos->member != (head); \ 65852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake pos = n, n = list_entry(n->member.next, typeof(*n), member)) 66852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 67852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define list_empty(entry) ((entry)->next == (entry)) 68852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 69852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakestatic inline void list_init(struct list_head *entry) 70852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake{ 71852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake entry->prev = entry->next = entry; 72852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake} 73852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 74852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakestatic inline void list_add(struct list_head *entry, struct list_head *head) 75852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake{ 76852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake entry->next = head->next; 77852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake entry->prev = head; 78852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 79852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake head->next->prev = entry; 80852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake head->next = entry; 81852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake} 82852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 83852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakestatic inline void list_add_tail(struct list_head *entry, 84852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake struct list_head *head) 85852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake{ 86852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake entry->next = head; 87852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake entry->prev = head->prev; 88852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 89852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake head->prev->next = entry; 90852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake head->prev = entry; 91852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake} 92852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 93852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakestatic inline void list_del(struct list_head *entry) 94852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake{ 95852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake entry->next->prev = entry->prev; 96852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake entry->prev->next = entry->next; 97852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake} 98852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 99852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define container_of(ptr, type, member) ({ \ 100852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake const typeof( ((type *)0)->member ) *__mptr = (ptr); \ 101852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake (type *)( (char *)__mptr - offsetof(type,member) );}) 102852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 103852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define bswap16(x) (((x & 0xff) << 8) | (x >> 8)) 104852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#if __BYTE_ORDER == __LITTLE_ENDIAN 105852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define cpu_to_le16(x) (x) 106852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define le16_to_cpu(x) (x) 107852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#elif __BYTE_ORDER == __BIG_ENDIAN 108852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define le16_to_cpu(x) bswap16(x) 109852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define cpu_to_le16(x) bswap16(x) 110852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#else 111852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#error "Unrecognized endianness" 112852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#endif 113852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 114852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define MIN(a, b) ((a) < (b) ? (a) : (b)) 115852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define MAX(a, b) ((a) > (b) ? (a) : (b)) 116852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 117852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define TIMESPEC_IS_SET(ts) ((ts)->tv_sec != 0 || (ts)->tv_nsec != 0) 118852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 119dbb3fd871e3972b4e670f3161e7cd2f58f357600Daniel Drakeenum usbi_log_level { 120852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake LOG_LEVEL_DEBUG, 121852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake LOG_LEVEL_INFO, 122852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake LOG_LEVEL_WARNING, 123852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake LOG_LEVEL_ERROR, 124852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake}; 125852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 126dbb3fd871e3972b4e670f3161e7cd2f58f357600Daniel Drakevoid usbi_log(enum usbi_log_level, const char *function, const char *format, ...); 127852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 128852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#ifdef ENABLE_LOGGING 129dbb3fd871e3972b4e670f3161e7cd2f58f357600Daniel Drake#define _usbi_log(level, fmt...) usbi_log(level, __FUNCTION__, fmt) 130852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#else 131dbb3fd871e3972b4e670f3161e7cd2f58f357600Daniel Drake#define _usbi_log(level, fmt...) 132852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#endif 133852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 134852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#ifdef ENABLE_DEBUG_LOGGING 135e3a09ca0b9cb6f46d54a0130f678c6097240a2bdDaniel Drake#define usbi_dbg(fmt...) _usbi_log(LOG_LEVEL_DEBUG, fmt) 136852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#else 137e3a09ca0b9cb6f46d54a0130f678c6097240a2bdDaniel Drake#define usbi_dbg(fmt...) 138852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#endif 139852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 140e3a09ca0b9cb6f46d54a0130f678c6097240a2bdDaniel Drake#define usbi_info(fmt...) _usbi_log(LOG_LEVEL_INFO, fmt) 141e3a09ca0b9cb6f46d54a0130f678c6097240a2bdDaniel Drake#define usbi_warn(fmt...) _usbi_log(LOG_LEVEL_WARNING, fmt) 142e3a09ca0b9cb6f46d54a0130f678c6097240a2bdDaniel Drake#define usbi_err(fmt...) _usbi_log(LOG_LEVEL_ERROR, fmt) 143852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 1449cfdb494fccac53a4277da7c8b6d15f1a72a4959Daniel Drakestruct libusb_device { 145f3fdf447916289cd92b7190377681894e8ab611aDaniel Drake struct list_head list; 1469cfdb494fccac53a4277da7c8b6d15f1a72a4959Daniel Drake int refcnt; 147f3fdf447916289cd92b7190377681894e8ab611aDaniel Drake unsigned long session_data; 1489e89d1aa82cbe7e21672ee3e2e545238fffc5318Daniel Drake struct libusb_device_descriptor desc; 149dbb3fd871e3972b4e670f3161e7cd2f58f357600Daniel Drake struct libusb_config_descriptor *config; 150c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake unsigned char os_priv[0]; 151852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake}; 152852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 153ebad1c79688ba603ad017ed0fe2f3c0dc8edd1adDaniel Drakestruct libusb_device_handle { 154852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake struct list_head list; 1559cfdb494fccac53a4277da7c8b6d15f1a72a4959Daniel Drake struct libusb_device *dev; 156c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake unsigned char os_priv[0]; 157852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake}; 158852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 15966348c90ea4570bf999ac301089e006d0cce1926Daniel Drake#define USBI_TRANSFER_SYNC_CANCELLED (1<<0) 16066348c90ea4570bf999ac301089e006d0cce1926Daniel Drake#define USBI_TRANSFER_TIMED_OUT (1<<1) 161852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 16266348c90ea4570bf999ac301089e006d0cce1926Daniel Drakestruct usbi_transfer { 16366348c90ea4570bf999ac301089e006d0cce1926Daniel Drake /* must come first */ 16466348c90ea4570bf999ac301089e006d0cce1926Daniel Drake struct libusb_transfer pub; 165852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 166852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake struct list_head list; 167637a8d7ff8a11a23588925d9d3003a609bda8075Daniel Drake struct timeval timeout; 168852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake int transferred; 169852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake uint8_t flags; 170c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 171c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake unsigned char os_priv[0]; 172852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake}; 173852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 174852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake/* bus structures */ 175852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 176a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake/* All standard descriptors have these 2 fields in common */ 177a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drakestruct usb_descriptor_header { 178a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake uint8_t bLength; 179a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake uint8_t bDescriptorType; 180a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake}; 181a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake 182852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake/* shared data and functions */ 183852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 184c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakeextern struct list_head usbi_open_devs; 185852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 186637a8d7ff8a11a23588925d9d3003a609bda8075Daniel Drakevoid usbi_io_init(void); 187c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 188c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakestruct libusb_device *usbi_alloc_device(unsigned long session_id); 189c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakestruct libusb_device *usbi_get_device_by_session_id(unsigned long session_id); 190c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 191c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakevoid usbi_handle_transfer_completion(struct usbi_transfer *itransfer, 192c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake enum libusb_transfer_status status); 193c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakevoid usbi_handle_transfer_cancellation(struct usbi_transfer *transfer); 194852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 195dbb3fd871e3972b4e670f3161e7cd2f58f357600Daniel Drakeint usbi_parse_descriptor(unsigned char *source, char *descriptor, void *dest); 196dbb3fd871e3972b4e670f3161e7cd2f58f357600Daniel Drakeint usbi_parse_configuration(struct libusb_config_descriptor *config, 197a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake unsigned char *buffer); 198a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake 199c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake/* polling */ 200c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 201c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakestruct usbi_pollfd { 202c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake /* must come first */ 203c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake struct libusb_pollfd pollfd; 204c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 205c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake struct list_head list; 206c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake}; 207c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 208c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakeint usbi_add_pollfd(int fd, short events); 209c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakevoid usbi_remove_pollfd(int fd); 210c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 211c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake/* device discovery */ 212c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 213c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake/* we traverse usbfs without knowing how many devices we are going to find. 214c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake * so we create this discovered_devs model which is similar to a linked-list 215c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake * which grows when required. it can be freed once discovery has completed, 216c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake * eliminating the need for a list node in the libusb_device structure 217c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake * itself. */ 218c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakestruct discovered_devs { 219c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake size_t len; 220c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake size_t capacity; 221c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake struct libusb_device *devices[0]; 222c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake}; 223c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 224c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakestruct discovered_devs *discovered_devs_append( 225c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake struct discovered_devs *discdevs, struct libusb_device *dev); 226c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 227c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake/* OS abstraction */ 228c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 229c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakestruct usbi_os_backend { 230c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake const char *name; 231c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake int (*init)(void); 232c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake void (*exit)(void); 233c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 234285724cc14ea5f993e2c4c92fe0aaf6c335bc139Vasily Khoruzhick int (*get_device_list)(struct discovered_devs **discdevs); 235c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 236c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake int (*open)(struct libusb_device_handle *handle); 237c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake void (*close)(struct libusb_device_handle *handle); 238c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 239c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake int (*claim_interface)(struct libusb_device_handle *handle, int iface); 240c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake int (*release_interface)(struct libusb_device_handle *handle, int iface); 241c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 24262077b7fa5b222e1bb9dea3467585aed69d596e2Daniel Drake int (*set_interface_altsetting)(struct libusb_device_handle *handle, 24362077b7fa5b222e1bb9dea3467585aed69d596e2Daniel Drake int iface, int altsetting); 24462077b7fa5b222e1bb9dea3467585aed69d596e2Daniel Drake 245c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake void (*destroy_device)(struct libusb_device *dev); 246c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 247c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake int (*submit_transfer)(struct usbi_transfer *itransfer); 248c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake int (*cancel_transfer)(struct usbi_transfer *itransfer); 249c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 250c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake int (*handle_events)(fd_set *readfds, fd_set *writefds); 251c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 252c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake /* number of bytes to reserve for libusb_device.os_priv */ 253c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake size_t device_priv_size; 254c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 255c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake /* number of bytes to reserve for libusb_device_handle.os_priv */ 256c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake size_t device_handle_priv_size; 257c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 258c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake /* number of bytes to reserve for usbi_transfer.os_priv */ 259c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake size_t transfer_priv_size; 260c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake}; 261c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 262c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakeextern const struct usbi_os_backend * const usbi_backend; 263c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 264c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drakeextern const struct usbi_os_backend linux_usbfs_backend; 265c0c9432d38b22784070dce3a7874c62c31786a27Daniel Drake 266852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#endif 267852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 268