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