libusbi.h revision e9364d72151ae1de9cce4175f330fe1529f02511
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> 28852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#include <sys/ioctl.h> 29852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#include <time.h> 30852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 31e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drake#include <libusb.h> 32852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#include <usbfs.h> 33852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 34852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define USBFS_PATH "/dev/bus/usb" 35852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define DEVICE_DESC_LENGTH 18 36852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 37a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake#define USB_MAXENDPOINTS 32 38a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake#define USB_MAXINTERFACES 32 39a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake#define USB_MAXCONFIG 8 40a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake 41852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakestruct list_head { 42852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake struct list_head *prev, *next; 43852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake}; 44852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 45852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake/* Get an entry from the list 46852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * ptr - the address of this list_head element in "type" 47852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * type - the data type that contains "member" 48852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * member - the list_head element in "type" 49852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake */ 50852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define list_entry(ptr, type, member) \ 51852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake ((type *)((char *)(ptr) - (unsigned long)(&((type *)0L)->member))) 52852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 53852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake/* Get each entry from a list 54852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * pos - A structure pointer has a "member" element 55852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * head - list head 56852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake * member - the list_head element in "pos" 57852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake */ 58852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define list_for_each_entry(pos, head, member) \ 59852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake for (pos = list_entry((head)->next, typeof(*pos), member); \ 60852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake &pos->member != (head); \ 61852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake pos = list_entry(pos->member.next, typeof(*pos), member)) 62852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 63852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define list_for_each_entry_safe(pos, n, head, member) \ 64852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake for (pos = list_entry((head)->next, typeof(*pos), member), \ 65852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake n = list_entry(pos->member.next, typeof(*pos), member); \ 66852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake &pos->member != (head); \ 67852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake pos = n, n = list_entry(n->member.next, typeof(*n), member)) 68852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 69852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define list_empty(entry) ((entry)->next == (entry)) 70852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 71852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakestatic inline void list_init(struct list_head *entry) 72852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake{ 73852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake entry->prev = entry->next = entry; 74852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake} 75852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 76852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakestatic inline void list_add(struct list_head *entry, struct list_head *head) 77852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake{ 78852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake entry->next = head->next; 79852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake entry->prev = head; 80852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 81852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake head->next->prev = entry; 82852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake head->next = entry; 83852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake} 84852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 85852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakestatic inline void list_add_tail(struct list_head *entry, 86852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake struct list_head *head) 87852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake{ 88852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake entry->next = head; 89852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake entry->prev = head->prev; 90852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 91852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake head->prev->next = entry; 92852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake head->prev = entry; 93852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake} 94852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 95852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakestatic inline void list_del(struct list_head *entry) 96852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake{ 97852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake entry->next->prev = entry->prev; 98852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake entry->prev->next = entry->next; 99852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake} 100852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 101852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define container_of(ptr, type, member) ({ \ 102852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake const typeof( ((type *)0)->member ) *__mptr = (ptr); \ 103852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake (type *)( (char *)__mptr - offsetof(type,member) );}) 104852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 105852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define bswap16(x) (((x & 0xff) << 8) | (x >> 8)) 106852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#if __BYTE_ORDER == __LITTLE_ENDIAN 107852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define cpu_to_le16(x) (x) 108852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define le16_to_cpu(x) (x) 109852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#elif __BYTE_ORDER == __BIG_ENDIAN 110852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define le16_to_cpu(x) bswap16(x) 111852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define cpu_to_le16(x) bswap16(x) 112852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#else 113852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#error "Unrecognized endianness" 114852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#endif 115852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 116852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define MIN(a, b) ((a) < (b) ? (a) : (b)) 117852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define MAX(a, b) ((a) > (b) ? (a) : (b)) 118852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 119852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define TIMESPEC_IS_SET(ts) ((ts)->tv_sec != 0 || (ts)->tv_nsec != 0) 120852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 121852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakeenum fpi_log_level { 122852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake LOG_LEVEL_DEBUG, 123852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake LOG_LEVEL_INFO, 124852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake LOG_LEVEL_WARNING, 125852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake LOG_LEVEL_ERROR, 126852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake}; 127852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 128852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakevoid fpi_log(enum fpi_log_level, const char *function, const char *format, ...); 129852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 130852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#ifdef ENABLE_LOGGING 131852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define _fpi_log(level, fmt...) fpi_log(level, __FUNCTION__, fmt) 132852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#else 133852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define _fpi_log(level, fmt...) 134852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#endif 135852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 136852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#ifdef ENABLE_DEBUG_LOGGING 137852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define fp_dbg(fmt...) _fpi_log(LOG_LEVEL_DEBUG, fmt) 138852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#else 139852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define fp_dbg(fmt...) 140852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#endif 141852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 142852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define fp_info(fmt...) _fpi_log(LOG_LEVEL_INFO, fmt) 143852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define fp_warn(fmt...) _fpi_log(LOG_LEVEL_WARNING, fmt) 144852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#define fp_err(fmt...) _fpi_log(LOG_LEVEL_ERROR, fmt) 145852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 146e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drakestruct libusb_dev { 147852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake struct list_head list; 148852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake char *nodepath; 149852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake struct usb_dev_descriptor desc; 150a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake struct usb_config_descriptor *config; 151852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake}; 152852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 153e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drakestruct libusb_dev_handle { 154852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake struct list_head list; 155e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drake struct libusb_dev *dev; 156852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake int fd; 157852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake}; 158852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 159e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drakeenum libusb_urb_type { 160e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drake LIBUSB_URB_CONTROL, 161e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drake LIBUSB_URB_BULK, 162852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake}; 163852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 164e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drake#define LIBUSB_URBH_DATA_BELONGS_TO_USER (1<<0) 165e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drake#define LIBUSB_URBH_SYNC_CANCELLED (1<<1) 166e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drake#define LIBUSB_URBH_TIMED_OUT (1<<2) 167852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 168e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drakestruct libusb_urb_handle { 169e9364d72151ae1de9cce4175f330fe1529f02511Daniel Drake struct libusb_dev_handle *devh; 170852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake struct usb_urb urb; 171852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake struct list_head list; 172852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake struct timespec timeout; 173852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake timer_t timer; 174852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake unsigned char urb_type; 175852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake unsigned char endpoint; 176852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake int transfer_len; 177852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake int transferred; 178852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake unsigned char *buffer; 179852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake void *callback; 180852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake void *user_data; 181852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake uint8_t flags; 182852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake}; 183852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 184852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake/* bus structures */ 185852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 186a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake/* All standard descriptors have these 2 fields in common */ 187a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drakestruct usb_descriptor_header { 188a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake uint8_t bLength; 189a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake uint8_t bDescriptorType; 190a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake}; 191a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake 192852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake/* shared data and functions */ 193852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 194852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakeextern struct list_head open_devs; 195852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 196852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakeint fpi_io_init(int _signum); 197852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drakevoid fpi_io_exit(void); 198852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 199a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drakeint fpi_parse_descriptor(unsigned char *source, char *descriptor, void *dest); 200a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drakeint fpi_parse_configuration(struct usb_config_descriptor *config, 201a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake unsigned char *buffer); 202a8d2881eb7c273892acf2ff6e1f3f552631d1d11Daniel Drake 203852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake#endif 204852bba4754ec57679c823f33e8feba6e4a564cbDaniel Drake 205