appended patch stores and uses the libusb context.
--
Uwe Bonnes bon@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Institut fuer Kernphysik Schlossgartenstrasse 9 64289 Darmstadt
--------- Tel. 06151 162516 -------- Fax. 06151 164321 ----------
>From 287f21e33391fe866bca391cd713573039317bff Mon Sep 17 00:00:00 2001
From: Uwe Bonnes <bon@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx>
Date: Thu, 17 Jun 2010 19:15:27 +0200
Subject: Store and use the libusb_context
---
src/ftdi.c | 18 +++++++++---------
src/ftdi.h | 2 ++
src/ftdi_stream.c | 4 ++--
3 files changed, 13 insertions(+), 11 deletions(-)
diff --git a/src/ftdi.c b/src/ftdi.c
index 7f7e5a0..e2acb1f 100644
--- a/src/ftdi.c
+++ b/src/ftdi.c
@@ -191,7 +191,7 @@ void ftdi_deinit(struct ftdi_context *ftdi)
free(ftdi->readbuffer);
ftdi->readbuffer = NULL;
}
- libusb_exit(NULL);
+ libusb_exit(ftdi->usb_ctx);
}
/**
@@ -243,10 +243,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 +629,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 +738,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 +1509,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);
diff --git a/src/ftdi.h b/src/ftdi.h
index aaa7744..324d07b 100644
--- a/src/ftdi.h
+++ b/src/ftdi.h
@@ -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 */
diff --git a/src/ftdi_stream.c b/src/ftdi_stream.c
index 076ebd4..c3eb465 100644
--- a/src/ftdi_stream.c
+++ b/src/ftdi_stream.c
@@ -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;
--
1.6.4.2
--
libftdi - see http://www.intra2net.com/en/developer/libftdi for details.
To unsubscribe send a mail to libftdi+unsubscribe@xxxxxxxxxxxxxxxxxxxxxxx
|