Store and use the libusb_context
authorUwe Bonnes <bon@elektron.ikp.physik.tu-darmstadt.de>
Mon, 21 Jun 2010 08:44:10 +0000 (10:44 +0200)
committerThomas Jarosch <thomas.jarosch@intra2net.com>
Mon, 21 Jun 2010 10:50:44 +0000 (12:50 +0200)
src/ftdi.c
src/ftdi.h
src/ftdi_stream.c

index 7f7e5a0..167810b 100644 (file)
@@ -78,6 +78,7 @@ static void ftdi_usb_close_internal (struct ftdi_context *ftdi)
 */
 int ftdi_init(struct ftdi_context *ftdi)
 {
+    ftdi->usb_ctx = NULL;
     ftdi->usb_dev = NULL;
     ftdi->usb_read_timeout = 5000;
     ftdi->usb_write_timeout = 5000;
@@ -191,7 +192,7 @@ void ftdi_deinit(struct ftdi_context *ftdi)
         free(ftdi->readbuffer);
         ftdi->readbuffer = NULL;
     }
-    libusb_exit(NULL);
+    libusb_exit(ftdi->usb_ctx);
 }
 
 /**
@@ -243,10 +244,10 @@ int ftdi_usb_find_all(struct ftdi_context *ftdi, struct ftdi_device_list **devli
     int count = 0;
     int i = 0;
 
-    if (libusb_init(NULL) < 0)
+    if (libusb_init(&ftdi->usb_ctx) < 0)
         ftdi_error_return(-4, "libusb_init() failed");
 
-    if (libusb_get_device_list(NULL, &devs) < 0)
+    if (libusb_get_device_list(ftdi->usb_ctx, &devs) < 0)
         ftdi_error_return(-5, "libusb_get_device_list() failed");
 
     curdev = devlist;
@@ -629,13 +630,13 @@ int ftdi_usb_open_desc_index(struct ftdi_context *ftdi, int vendor, int product,
     char string[256];
     int i = 0;
 
-    if (libusb_init(NULL) < 0)
+    if (libusb_init(&ftdi->usb_ctx) < 0)
         ftdi_error_return(-11, "libusb_init() failed");
 
     if (ftdi == NULL)
         ftdi_error_return(-11, "ftdi context invalid");
 
-    if (libusb_get_device_list(NULL, &devs) < 0)
+    if (libusb_get_device_list(ftdi->usb_ctx, &devs) < 0)
         ftdi_error_return(-12, "libusb_get_device_list() failed");
 
     while ((dev = devs[i++]) != NULL)
@@ -738,10 +739,10 @@ int ftdi_usb_open_string(struct ftdi_context *ftdi, const char* description)
        unsigned int bus_number, device_address;
        int i = 0;
 
-        if (libusb_init (NULL) < 0)
+        if (libusb_init (&ftdi->usb_ctx) < 0)
            ftdi_error_return(-1, "libusb_init() failed");
 
-       if (libusb_get_device_list(NULL, &devs) < 0)
+       if (libusb_get_device_list(ftdi->usb_ctx, &devs) < 0)
            ftdi_error_return(-2, "libusb_get_device_list() failed");
 
         /* XXX: This doesn't handle symlinks/odd paths/etc... */
@@ -1509,14 +1510,14 @@ int ftdi_transfer_data_done(struct ftdi_transfer_control *tc)
 
     while (!tc->completed)
     {
-        ret = libusb_handle_events(NULL);
+        ret = libusb_handle_events(ftdi->usb_ctx);
         if (ret < 0)
         {
             if (ret == LIBUSB_ERROR_INTERRUPTED)
                 continue;
             libusb_cancel_transfer(tc->transfer);
             while (!tc->completed)
-                if (libusb_handle_events(NULL) < 0)
+                if (libusb_handle_events(ftdi->usb_ctx) < 0)
                     break;
             libusb_free_transfer(tc->transfer);
             free (tc);
index aaa7744..324d07b 100644 (file)
@@ -175,6 +175,8 @@ struct ftdi_transfer_control
 struct ftdi_context
 {
     /* USB specific */
+    /** libusb's context */
+    struct libusb_context *usb_ctx;
     /** libusb's usb_dev_handle */
     struct libusb_device_handle *usb_dev;
     /** usb read timeout */
index 076ebd4..c3eb465 100644 (file)
@@ -216,10 +216,10 @@ ftdi_readstream(struct ftdi_context *ftdi,
         struct timeval timeout = { 0, ftdi->usb_read_timeout };
         struct timeval now;
         
-        int err = libusb_handle_events_timeout(NULL, &timeout);
+        int err = libusb_handle_events_timeout(ftdi->usb_ctx, &timeout);
         if (err ==  LIBUSB_ERROR_INTERRUPTED)
             /* restart interrupted events */
-            err = libusb_handle_events_timeout(NULL, &timeout);  
+            err = libusb_handle_events_timeout(ftdi->usb_ctx, &timeout);  
         if (!state.result)
         {
             state.result = err;