1/* 2 * darwin backend for libusb 1.0 3 * Copyright (C) 2008-2009 Nathan Hjelm <hjelmn@users.sourceforge.net> 4 * 5 * This library is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Lesser General Public 7 * License as published by the Free Software Foundation; either 8 * version 2.1 of the License, or (at your option) any later version. 9 * 10 * This library is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * Lesser General Public License for more details. 14 * 15 * You should have received a copy of the GNU Lesser General Public 16 * License along with this library; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 18 */ 19 20#if !defined(LIBUSB_DARWIN_H) 21#define LIBUSB_DARWIN_H 22 23#include "libusbi.h" 24 25#include <IOKit/IOCFBundle.h> 26#include <IOKit/usb/IOUSBLib.h> 27#include <IOKit/IOCFPlugIn.h> 28 29/* IOUSBInterfaceInferface */ 30#if defined (kIOUSBInterfaceInterfaceID300) 31 32#define usb_interface_t IOUSBInterfaceInterface300 33#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID300 34#define InterfaceVersion 300 35 36#elif defined (kIOUSBInterfaceInterfaceID245) 37 38#define usb_interface_t IOUSBInterfaceInterface245 39#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID245 40#define InterfaceVersion 245 41 42#elif defined (kIOUSBInterfaceInterfaceID220) 43 44#define usb_interface_t IOUSBInterfaceInterface220 45#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID220 46#define InterfaceVersion 220 47 48#elif defined (kIOUSBInterfaceInterfaceID197) 49 50#define usb_interface_t IOUSBInterfaceInterface197 51#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID197 52#define InterfaceVersion 197 53 54#elif defined (kIOUSBInterfaceInterfaceID190) 55 56#define usb_interface_t IOUSBInterfaceInterface190 57#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID190 58#define InterfaceVersion 190 59 60#elif defined (kIOUSBInterfaceInterfaceID182) 61 62#define usb_interface_t IOUSBInterfaceInterface182 63#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID182 64#define InterfaceVersion 182 65 66#else 67 68#error "IOUSBFamily is too old. Please upgrade your OS" 69 70#endif 71 72/* IOUSBDeviceInterface */ 73#if defined (kIOUSBDeviceInterfaceID320) 74 75#define usb_device_t IOUSBDeviceInterface320 76#define DeviceInterfaceID kIOUSBDeviceInterfaceID320 77#define DeviceVersion 320 78 79#elif defined (kIOUSBDeviceInterfaceID300) 80 81#define usb_device_t IOUSBDeviceInterface300 82#define DeviceInterfaceID kIOUSBDeviceInterfaceID300 83#define DeviceVersion 300 84 85#elif defined (kIOUSBDeviceInterfaceID245) 86 87#define usb_device_t IOUSBDeviceInterface245 88#define DeviceInterfaceID kIOUSBDeviceInterfaceID245 89#define DeviceVersion 245 90 91#elif defined (kIOUSBDeviceInterfaceID197) 92 93#define usb_device_t IOUSBDeviceInterface197 94#define DeviceInterfaceID kIOUSBDeviceInterfaceID197 95#define DeviceVersion 197 96 97#elif defined (kIOUSBDeviceInterfaceID187) 98 99#define usb_device_t IOUSBDeviceInterface187 100#define DeviceInterfaceID kIOUSBDeviceInterfaceID187 101#define DeviceVersion 187 102 103#elif defined (kIOUSBDeviceInterfaceID182) 104 105#define usb_device_t IOUSBDeviceInterface182 106#define DeviceInterfaceID kIOUSBDeviceInterfaceID182 107#define DeviceVersion 182 108 109#else 110 111#error "IOUSBFamily is too old. Please upgrade your OS" 112 113#endif 114 115typedef IOCFPlugInInterface *io_cf_plugin_ref_t; 116typedef IONotificationPortRef io_notification_port_t; 117 118/* private structures */ 119struct darwin_device_priv { 120 IOUSBDeviceDescriptor dev_descriptor; 121 UInt32 location; 122 char sys_path[21]; 123 usb_device_t **device; 124 int open_count; 125}; 126 127struct darwin_device_handle_priv { 128 int is_open; 129 CFRunLoopSourceRef cfSource; 130 int fds[2]; 131 132 struct __darwin_interface { 133 usb_interface_t **interface; 134 uint8_t num_endpoints; 135 CFRunLoopSourceRef cfSource; 136 uint8_t endpoint_addrs[USB_MAXENDPOINTS]; 137 } interfaces[USB_MAXINTERFACES]; 138}; 139 140struct darwin_transfer_priv { 141 /* Isoc */ 142 IOUSBIsocFrame *isoc_framelist; 143 144 /* Control */ 145#if !defined (LIBUSB_NO_TIMEOUT_DEVICE) 146 IOUSBDevRequestTO req; 147#else 148 IOUSBDevRequest req; 149#endif 150 151 /* Bulk */ 152}; 153 154enum { 155 MESSAGE_DEVICE_GONE, 156 MESSAGE_ASYNC_IO_COMPLETE 157}; 158 159 160 161#endif 162