1 /** 2 * \file libusb-glue.h 3 * Low-level USB interface glue towards libusb. 4 * 5 * Copyright (C) 2005-2007 Richard A. Low <richard (at) wentnet.com> 6 * Copyright (C) 2005-2012 Linus Walleij <triad (at) df.lth.se> 7 * Copyright (C) 2006-2011 Marcus Meissner 8 * Copyright (C) 2007 Ted Bullock 9 * Copyright (C) 2008 Chris Bagwell <chris (at) cnpbagwell.com> 10 * 11 * This library is free software; you can redistribute it and/or 12 * modify it under the terms of the GNU Lesser General Public 13 * License as published by the Free Software Foundation; either 14 * version 2 of the License, or (at your option) any later version. 15 * 16 * This library is distributed in the hope that it will be useful, 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 19 * Lesser General Public License for more details. 20 * 21 * You should have received a copy of the GNU Lesser General Public 22 * License along with this library; if not, write to the 23 * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 24 * Boston, MA 02111-1307, USA. 25 * 26 * Created by Richard Low on 24/12/2005. 27 * Modified by Linus Walleij 28 * 29 */ 30 #ifndef LIBUSB_GLUE_H 31 #define LIBUSB_GLUE_H 32 33 #include "ptp.h" 34 #ifdef HAVE_LIBUSB1 35 #include <libusb.h> 36 #endif 37 #ifdef HAVE_LIBUSB0 38 #include <usb.h> 39 #endif 40 #ifdef HAVE_LIBOPENUSB 41 #include <openusb.h> 42 #endif 43 #include "libmtp.h" 44 #include "device-flags.h" 45 46 /* Make functions available for C++ */ 47 #ifdef __cplusplus 48 extern "C" { 49 #endif /* __cplusplus */ 50 51 /** 52 * Debug macro 53 */ 54 #define LIBMTP_USB_DEBUG(format, args...) \ 55 do { \ 56 if ((LIBMTP_debug & LIBMTP_DEBUG_USB) != 0) \ 57 fprintf(stdout, "LIBMTP %s[%d]: " format, __FUNCTION__, __LINE__, ##args); \ 58 } while (0) 59 60 #define LIBMTP_USB_DATA(buffer, length, base) \ 61 do { \ 62 if ((LIBMTP_debug & LIBMTP_DEBUG_DATA) != 0) \ 63 data_dump_ascii (stdout, buffer, length, base); \ 64 } while (0) 65 66 #ifdef HAVE_LIBUSB1 67 #define USB_BULK_READ libusb_bulk_transfer 68 #define USB_BULK_WRITE libusb_bulk_transfer 69 #endif 70 #ifdef HAVE_LIBUSB0 71 #define USB_BULK_READ usb_bulk_read 72 #define USB_BULK_WRITE usb_bulk_write 73 #endif 74 #ifdef HAVE_LIBOPENUSB 75 #define USB_BULK_READ openusb_bulk_xfer 76 #define USB_BULK_WRITE openusb_bulk_xfer 77 #endif 78 79 /** 80 * Internal USB struct. 81 */ 82 typedef struct _PTP_USB PTP_USB; 83 struct _PTP_USB { 84 PTPParams *params; 85 #ifdef HAVE_LIBUSB1 86 libusb_device_handle* handle; 87 #endif 88 #ifdef HAVE_LIBUSB0 89 usb_dev_handle* handle; 90 #endif 91 #ifdef HAVE_LIBOPENUSB 92 openusb_dev_handle_t* handle; 93 #endif 94 uint8_t config; 95 uint8_t interface; 96 uint8_t altsetting; 97 int inep; 98 int inep_maxpacket; 99 int outep; 100 int outep_maxpacket; 101 int intep; 102 /** File transfer callbacks and counters */ 103 int callback_active; 104 int timeout; 105 uint16_t bcdusb; 106 uint64_t current_transfer_total; 107 uint64_t current_transfer_complete; 108 LIBMTP_progressfunc_t current_transfer_callback; 109 void const * current_transfer_callback_data; 110 /** Any special device flags, only used internally */ 111 LIBMTP_raw_device_t rawdevice; 112 }; 113 114 void dump_usbinfo(PTP_USB *ptp_usb); 115 const char *get_playlist_extension(PTP_USB *ptp_usb); 116 void close_device(PTP_USB *ptp_usb, PTPParams *params); 117 LIBMTP_error_number_t configure_usb_device(LIBMTP_raw_device_t *device, 118 PTPParams *params, 119 void **usbinfo); 120 void set_usb_device_timeout(PTP_USB *ptp_usb, int timeout); 121 void get_usb_device_timeout(PTP_USB *ptp_usb, int *timeout); 122 int guess_usb_speed(PTP_USB *ptp_usb); 123 124 /* Flag check macros */ 125 #define FLAG_BROKEN_MTPGETOBJPROPLIST_ALL(a) \ 126 ((a)->rawdevice.device_entry.device_flags & DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST_ALL) 127 #define FLAG_UNLOAD_DRIVER(a) \ 128 ((a)->rawdevice.device_entry.device_flags & DEVICE_FLAG_UNLOAD_DRIVER) 129 #define FLAG_BROKEN_MTPGETOBJPROPLIST(a) \ 130 ((a)->rawdevice.device_entry.device_flags & DEVICE_FLAG_BROKEN_MTPGETOBJPROPLIST) 131 #define FLAG_NO_ZERO_READS(a) \ 132 ((a)->rawdevice.device_entry.device_flags & DEVICE_FLAG_NO_ZERO_READS) 133 #define FLAG_IRIVER_OGG_ALZHEIMER(a) \ 134 ((a)->rawdevice.device_entry.device_flags & DEVICE_FLAG_IRIVER_OGG_ALZHEIMER) 135 #define FLAG_ONLY_7BIT_FILENAMES(a) \ 136 ((a)->rawdevice.device_entry.device_flags & DEVICE_FLAG_ONLY_7BIT_FILENAMES) 137 #define FLAG_NO_RELEASE_INTERFACE(a) \ 138 ((a)->rawdevice.device_entry.device_flags & DEVICE_FLAG_NO_RELEASE_INTERFACE) 139 #define FLAG_IGNORE_HEADER_ERRORS(a) \ 140 ((a)->rawdevice.device_entry.device_flags & DEVICE_FLAG_IGNORE_HEADER_ERRORS) 141 #define FLAG_BROKEN_SET_OBJECT_PROPLIST(a) \ 142 ((a)->rawdevice.device_entry.device_flags & DEVICE_FLAG_BROKEN_SET_OBJECT_PROPLIST) 143 #define FLAG_OGG_IS_UNKNOWN(a) \ 144 ((a)->rawdevice.device_entry.device_flags & DEVICE_FLAG_OGG_IS_UNKNOWN) 145 #define FLAG_BROKEN_SET_SAMPLE_DIMENSIONS(a) \ 146 ((a)->rawdevice.device_entry.device_flags & DEVICE_FLAG_BROKEN_SET_SAMPLE_DIMENSIONS) 147 #define FLAG_ALWAYS_PROBE_DESCRIPTOR(a) \ 148 ((a)->rawdevice.device_entry.device_flags & DEVICE_FLAG_ALWAYS_PROBE_DESCRIPTOR) 149 #define FLAG_PLAYLIST_SPL_V1(a) \ 150 ((a)->rawdevice.device_entry.device_flags & DEVICE_FLAG_PLAYLIST_SPL_V1) 151 #define FLAG_PLAYLIST_SPL_V2(a) \ 152 ((a)->rawdevice.device_entry.device_flags & DEVICE_FLAG_PLAYLIST_SPL_V2) 153 #define FLAG_PLAYLIST_SPL(a) \ 154 ((a)->rawdevice.device_entry.device_flags & (DEVICE_FLAG_PLAYLIST_SPL_V1 | DEVICE_FLAG_PLAYLIST_SPL_V2)) 155 #define FLAG_CANNOT_HANDLE_DATEMODIFIED(a) \ 156 ((a)->rawdevice.device_entry.device_flags & DEVICE_FLAG_CANNOT_HANDLE_DATEMODIFIED) 157 #define FLAG_BROKEN_SEND_OBJECT_PROPLIST(a) \ 158 ((a)->rawdevice.device_entry.device_flags & DEVICE_FLAG_BROKEN_SEND_OBJECT_PROPLIST) 159 #define FLAG_BROKEN_BATTERY_LEVEL(a) \ 160 ((a)->rawdevice.device_entry.device_flags & DEVICE_FLAG_BROKEN_BATTERY_LEVEL) 161 #define FLAG_FLAC_IS_UNKNOWN(a) \ 162 ((a)->rawdevice.device_entry.device_flags & DEVICE_FLAG_FLAC_IS_UNKNOWN) 163 #define FLAG_UNIQUE_FILENAMES(a) \ 164 ((a)->rawdevice.device_entry.device_flags & DEVICE_FLAG_UNIQUE_FILENAMES) 165 #define FLAG_SWITCH_MODE_BLACKBERRY(a) \ 166 ((a)->rawdevice.device_entry.device_flags & DEVICE_FLAG_SWITCH_MODE_BLACKBERRY) 167 #define FLAG_LONG_TIMEOUT(a) \ 168 ((a)->rawdevice.device_entry.device_flags & DEVICE_FLAG_LONG_TIMEOUT) 169 #define FLAG_FORCE_RESET_ON_CLOSE(a) \ 170 ((a)->rawdevice.device_entry.device_flags & DEVICE_FLAG_FORCE_RESET_ON_CLOSE) 171 #define FLAG_BROKEN_GET_OBJECT_PROPVAL(a) \ 172 ((a)->rawdevice.device_entry.device_flags & DEVICE_FLAG_BROKEN_GET_OBJECT_PROPVAL) 173 174 /* connect_first_device return codes */ 175 #define PTP_CD_RC_CONNECTED 0 176 #define PTP_CD_RC_NO_DEVICES 1 177 #define PTP_CD_RC_ERROR_CONNECTING 2 178 179 #ifdef __cplusplus 180 } 181 #endif /* __cplusplus */ 182 183 #endif // LIBUSB-GLUE_H 184