fusb_darwin.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef _FUSB_DARWIN_H_
00024 #define _FUSB_DARWIN_H_
00025
00026 #include <usb.h>
00027 #include "fusb.h"
00028 #include <IOKit/IOCFBundle.h>
00029 #include <IOKit/IOCFPlugIn.h>
00030 #include <IOKit/usb/IOUSBLib.h>
00031 #include <IOKit/IOKitLib.h>
00032 #include "circular_linked_list.h"
00033 #include "circular_buffer.h"
00034
00035
00036 #define usb_interface_t IOUSBInterfaceInterface220
00037 #define InterfaceInterfaceID kIOUSBInterfaceInterfaceID220
00038 #define InterfaceVersion 220
00039
00040
00041 #define usb_device_t IOUSBDeviceInterface197
00042 #define DeviceInterfaceID kIOUSBDeviceInterfaceID197
00043 #define DeviceVersion 197
00044
00045 extern "C" {
00046 typedef struct usb_dev_handle {
00047 int fd;
00048
00049 struct usb_bus *bus;
00050 struct usb_device *device;
00051
00052 int config;
00053 int interface;
00054 int altsetting;
00055
00056
00057 void *impl_info;
00058 } usb_dev_handle;
00059
00060
00061 typedef struct darwin_dev_handle {
00062 usb_device_t** device;
00063 usb_interface_t** interface;
00064 int open;
00065 } darwin_dev_handle;
00066
00067 typedef IOReturn io_return_t;
00068 typedef IOCFPlugInInterface *io_cf_plugin_ref_t;
00069
00070 static int ep_to_pipeRef (darwin_dev_handle* device, int ep);
00071 extern int usb_debug;
00072 }
00073
00074 class s_buffer
00075 {
00076 private:
00077 char* d_buffer;
00078 UInt32 d_n_used, d_n_alloc;
00079
00080 public:
00081 inline s_buffer (UInt32 n_alloc = 0) {
00082 d_n_used = 0;
00083 d_n_alloc = n_alloc;
00084 if (n_alloc) {
00085 d_buffer = (char*) new char [n_alloc];
00086 } else {
00087 d_buffer = 0;
00088 }
00089 };
00090 inline ~s_buffer () {
00091 if (d_n_alloc) {
00092 delete [] d_buffer;
00093 }
00094 };
00095 inline UInt32 n_used () { return (d_n_used); };
00096 inline void n_used (UInt32 bufLen) {
00097 d_n_used = (bufLen > d_n_alloc) ? d_n_alloc : bufLen; };
00098 inline UInt32 n_alloc () { return (d_n_alloc); };
00099 void buffer (char* l_buffer, UInt32 bufLen) {
00100 if (bufLen > d_n_alloc) {
00101 fprintf (stderr, "s_buffer::set: Copying only allocated bytes.\n");
00102 bufLen = d_n_alloc;
00103 }
00104 if (!l_buffer) {
00105 fprintf (stderr, "s_buffer::set: NULL buffer.\n");
00106 return;
00107 }
00108 bcopy (l_buffer, d_buffer, bufLen);
00109 d_n_used = bufLen;
00110 };
00111 inline char* buffer () { return (d_buffer); };
00112 inline void reset () {
00113 bzero (d_buffer, d_n_alloc);
00114 d_n_used = 0;
00115 };
00116 };
00117
00118 typedef s_buffer* s_buffer_ptr;
00119 typedef s_node<s_buffer_ptr>* s_node_ptr;
00120 typedef circular_linked_list<s_buffer_ptr>* s_queue_ptr;
00121 typedef s_both<s_buffer_ptr>* s_both_ptr;
00122
00130 class fusb_devhandle_darwin : public fusb_devhandle
00131 {
00132 public:
00133
00134 fusb_devhandle_darwin (usb_dev_handle* udh);
00135 virtual ~fusb_devhandle_darwin ();
00136
00137
00138 virtual fusb_ephandle* make_ephandle (int endpoint, bool input_p,
00139 int block_size = 0, int nblocks = 0);
00140 };
00141
00149 class fusb_ephandle_darwin : public fusb_ephandle
00150 {
00151 private:
00152 fusb_devhandle_darwin* d_devhandle;
00153 mld_thread_ptr d_runThread;
00154 mld_mutex_ptr d_runThreadRunning;
00155
00156 CFRunLoopRef d_CFRunLoopRef;
00157
00158 static void write_completed (void* ret_io_size,
00159 io_return_t result,
00160 void* io_size);
00161 static void read_completed (void* ret_io_size,
00162 io_return_t result,
00163 void* io_size);
00164 static void run_thread (void* arg);
00165 static void read_thread (void* arg);
00166
00167 void read_issue (s_both_ptr l_both);
00168
00169 public:
00170
00171 UInt8 d_pipeRef, d_transferType;
00172 usb_interface_t** d_interfaceRef;
00173 usb_interface_t* d_interface;
00174 s_queue_ptr d_queue;
00175 circular_buffer<char>* d_buffer;
00176 UInt32 d_bufLenBytes;
00177 mld_mutex_ptr d_readRunning;
00178 mld_condition_ptr d_runBlock, d_readBlock;
00179
00180
00181
00182 fusb_ephandle_darwin (fusb_devhandle_darwin *dh, int endpoint, bool input_p,
00183 int block_size = 0, int nblocks = 0);
00184 virtual ~fusb_ephandle_darwin ();
00185
00186
00187
00188 virtual bool start ();
00189 virtual bool stop ();
00190
00195 virtual int write (const void* buffer, int nbytes);
00196
00202 virtual int read (void* buffer, int nbytes);
00203
00204
00205
00206
00207 void abort ();
00208
00209
00210
00211
00212 virtual void wait_for_completion ();
00213 };
00214
00215 #endif