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