From: Uwe Bonnes Date: Mon, 21 Jun 2010 08:44:10 +0000 (+0200) Subject: Store and use the libusb_context X-Git-Tag: v1.0rc1~164 X-Git-Url: http://developer.intra2net.com/git/?p=libftdi;a=commitdiff_plain;h=02212d8e84cccd393a95612d4c4a5ec495fa3e2e Store and use the libusb_context --- diff --git a/src/ftdi.c b/src/ftdi.c index 7f7e5a0..167810b 100644 --- a/src/ftdi.c +++ b/src/ftdi.c @@ -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); 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;