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