/* * darwin backend for libusb 1.0 * Copyright (C) 2008-2009 Nathan Hjelm <hjelmn@users.sourceforge.net> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #if !defined(LIBUSB_DARWIN_H) #define LIBUSB_DARWIN_H #include "libusbi.h" #include <IOKit/IOTypes.h> #include <IOKit/IOCFBundle.h> #include <IOKit/usb/IOUSBLib.h> #include <IOKit/IOCFPlugIn.h> /* IOUSBInterfaceInferface */ #if defined (kIOUSBInterfaceInterfaceID300) #define usb_interface_t IOUSBInterfaceInterface300 #define InterfaceInterfaceID kIOUSBInterfaceInterfaceID300 #define InterfaceVersion 300 #elif defined (kIOUSBInterfaceInterfaceID245) #define usb_interface_t IOUSBInterfaceInterface245 #define InterfaceInterfaceID kIOUSBInterfaceInterfaceID245 #define InterfaceVersion 245 #elif defined (kIOUSBInterfaceInterfaceID220) #define usb_interface_t IOUSBInterfaceInterface220 #define InterfaceInterfaceID kIOUSBInterfaceInterfaceID220 #define InterfaceVersion 220 #elif defined (kIOUSBInterfaceInterfaceID197) #define usb_interface_t IOUSBInterfaceInterface197 #define InterfaceInterfaceID kIOUSBInterfaceInterfaceID197 #define InterfaceVersion 197 #elif defined (kIOUSBInterfaceInterfaceID190) #define usb_interface_t IOUSBInterfaceInterface190 #define InterfaceInterfaceID kIOUSBInterfaceInterfaceID190 #define InterfaceVersion 190 #elif defined (kIOUSBInterfaceInterfaceID182) #define usb_interface_t IOUSBInterfaceInterface182 #define InterfaceInterfaceID kIOUSBInterfaceInterfaceID182 #define InterfaceVersion 182 #else #error "IOUSBFamily is too old. Please upgrade your OS" #endif /* IOUSBDeviceInterface */ #if defined (kIOUSBDeviceInterfaceID320) #define usb_device_t IOUSBDeviceInterface320 #define DeviceInterfaceID kIOUSBDeviceInterfaceID320 #define DeviceVersion 320 #elif defined (kIOUSBDeviceInterfaceID300) #define usb_device_t IOUSBDeviceInterface300 #define DeviceInterfaceID kIOUSBDeviceInterfaceID300 #define DeviceVersion 300 #elif defined (kIOUSBDeviceInterfaceID245) #define usb_device_t IOUSBDeviceInterface245 #define DeviceInterfaceID kIOUSBDeviceInterfaceID245 #define DeviceVersion 245 #elif defined (kIOUSBDeviceInterfaceID197) #define usb_device_t IOUSBDeviceInterface197 #define DeviceInterfaceID kIOUSBDeviceInterfaceID197 #define DeviceVersion 197 #elif defined (kIOUSBDeviceInterfaceID187) #define usb_device_t IOUSBDeviceInterface187 #define DeviceInterfaceID kIOUSBDeviceInterfaceID187 #define DeviceVersion 187 #elif defined (kIOUSBDeviceInterfaceID182) #define usb_device_t IOUSBDeviceInterface182 #define DeviceInterfaceID kIOUSBDeviceInterfaceID182 #define DeviceVersion 182 #else #error "IOUSBFamily is too old. Please upgrade your OS" #endif #if !defined(IO_OBJECT_NULL) #define IO_OBJECT_NULL ((io_object_t) 0) #endif typedef IOCFPlugInInterface *io_cf_plugin_ref_t; typedef IONotificationPortRef io_notification_port_t; /* private structures */ struct darwin_device_priv { IOUSBDeviceDescriptor dev_descriptor; UInt32 location; char sys_path[21]; usb_device_t **device; int open_count; UInt8 first_config, active_config; }; struct darwin_device_handle_priv { int is_open; CFRunLoopSourceRef cfSource; int fds[2]; struct darwin_interface { usb_interface_t **interface; uint8_t num_endpoints; CFRunLoopSourceRef cfSource; uint64_t frames[256]; uint8_t endpoint_addrs[USB_MAXENDPOINTS]; } interfaces[USB_MAXINTERFACES]; }; struct darwin_transfer_priv { /* Isoc */ IOUSBIsocFrame *isoc_framelist; size_t num_iso_packets; /* Control */ #if !defined (LIBUSB_NO_TIMEOUT_DEVICE) IOUSBDevRequestTO req; #else IOUSBDevRequest req; #endif /* Bulk */ }; enum { MESSAGE_DEVICE_GONE, MESSAGE_ASYNC_IO_COMPLETE }; #endif