Home | History | Annotate | Download | only in os
      1 /*
      2  * darwin backend for libusb 1.0
      3  * Copyright  2008-2015 Nathan Hjelm <hjelmn (at) 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/IOTypes.h>
     26 #include <IOKit/IOCFBundle.h>
     27 #include <IOKit/usb/IOUSBLib.h>
     28 #include <IOKit/IOCFPlugIn.h>
     29 
     30 /* IOUSBInterfaceInferface */
     31 #if defined (kIOUSBInterfaceInterfaceID700) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9
     32 
     33 #define usb_interface_t IOUSBInterfaceInterface700
     34 #define InterfaceInterfaceID kIOUSBInterfaceInterfaceID700
     35 #define InterfaceVersion 700
     36 
     37 #elif defined (kIOUSBInterfaceInterfaceID550) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9
     38 
     39 #define usb_interface_t IOUSBInterfaceInterface550
     40 #define InterfaceInterfaceID kIOUSBInterfaceInterfaceID550
     41 #define InterfaceVersion 550
     42 
     43 #elif defined (kIOUSBInterfaceInterfaceID500)
     44 
     45 #define usb_interface_t IOUSBInterfaceInterface500
     46 #define InterfaceInterfaceID kIOUSBInterfaceInterfaceID500
     47 #define InterfaceVersion 500
     48 
     49 #elif defined (kIOUSBInterfaceInterfaceID300)
     50 
     51 #define usb_interface_t IOUSBInterfaceInterface300
     52 #define InterfaceInterfaceID kIOUSBInterfaceInterfaceID300
     53 #define InterfaceVersion 300
     54 
     55 #elif defined (kIOUSBInterfaceInterfaceID245)
     56 
     57 #define usb_interface_t IOUSBInterfaceInterface245
     58 #define InterfaceInterfaceID kIOUSBInterfaceInterfaceID245
     59 #define InterfaceVersion 245
     60 
     61 #elif defined (kIOUSBInterfaceInterfaceID220)
     62 
     63 #define usb_interface_t IOUSBInterfaceInterface220
     64 #define InterfaceInterfaceID kIOUSBInterfaceInterfaceID220
     65 #define InterfaceVersion 220
     66 
     67 #else
     68 
     69 #error "IOUSBFamily is too old. Please upgrade your OS"
     70 
     71 #endif
     72 
     73 /* IOUSBDeviceInterface */
     74 #if defined (kIOUSBDeviceInterfaceID500) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9
     75 
     76 #define usb_device_t    IOUSBDeviceInterface500
     77 #define DeviceInterfaceID kIOUSBDeviceInterfaceID500
     78 #define DeviceVersion 500
     79 
     80 #elif defined (kIOUSBDeviceInterfaceID320)
     81 
     82 #define usb_device_t    IOUSBDeviceInterface320
     83 #define DeviceInterfaceID kIOUSBDeviceInterfaceID320
     84 #define DeviceVersion 320
     85 
     86 #elif defined (kIOUSBDeviceInterfaceID300)
     87 
     88 #define usb_device_t    IOUSBDeviceInterface300
     89 #define DeviceInterfaceID kIOUSBDeviceInterfaceID300
     90 #define DeviceVersion 300
     91 
     92 #elif defined (kIOUSBDeviceInterfaceID245)
     93 
     94 #define usb_device_t    IOUSBDeviceInterface245
     95 #define DeviceInterfaceID kIOUSBDeviceInterfaceID245
     96 #define DeviceVersion 245
     97 
     98 #elif defined (kIOUSBDeviceInterfaceID220)
     99 #define usb_device_t    IOUSBDeviceInterface197
    100 #define DeviceInterfaceID kIOUSBDeviceInterfaceID197
    101 #define DeviceVersion 197
    102 
    103 #else
    104 
    105 #error "IOUSBFamily is too old. Please upgrade your OS"
    106 
    107 #endif
    108 
    109 #if !defined(IO_OBJECT_NULL)
    110 #define IO_OBJECT_NULL ((io_object_t) 0)
    111 #endif
    112 
    113 typedef IOCFPlugInInterface *io_cf_plugin_ref_t;
    114 typedef IONotificationPortRef io_notification_port_t;
    115 
    116 /* private structures */
    117 struct darwin_cached_device {
    118   struct list_head      list;
    119   IOUSBDeviceDescriptor dev_descriptor;
    120   UInt32                location;
    121   UInt64                parent_session;
    122   UInt64                session;
    123   UInt16                address;
    124   char                  sys_path[21];
    125   usb_device_t        **device;
    126   int                   open_count;
    127   UInt8                 first_config, active_config, port;
    128   int                   can_enumerate;
    129   int                   refcount;
    130 };
    131 
    132 struct darwin_device_priv {
    133   struct darwin_cached_device *dev;
    134 };
    135 
    136 struct darwin_device_handle_priv {
    137   int                  is_open;
    138   CFRunLoopSourceRef   cfSource;
    139 
    140   struct darwin_interface {
    141     usb_interface_t    **interface;
    142     uint8_t              num_endpoints;
    143     CFRunLoopSourceRef   cfSource;
    144     uint64_t             frames[256];
    145     uint8_t              endpoint_addrs[USB_MAXENDPOINTS];
    146   } interfaces[USB_MAXINTERFACES];
    147 };
    148 
    149 struct darwin_transfer_priv {
    150   /* Isoc */
    151   IOUSBIsocFrame *isoc_framelist;
    152   int num_iso_packets;
    153 
    154   /* Control */
    155   IOUSBDevRequestTO req;
    156 
    157   /* Bulk */
    158 
    159   /* Completion status */
    160   IOReturn result;
    161   UInt32 size;
    162 };
    163 
    164 #endif
    165