[Pcsclite-cvs-commit] r4987 - in /trunk/Drivers/ccid: configure.in contrib/Kobil_mIDentity_switch/Kobil_mIDentity_switch.c src/ccid_usb.c src/ccid_usb.h src/ifdhandler.c src/parse.c

rousseau at users.alioth.debian.org rousseau at users.alioth.debian.org
Thu Jun 10 14:48:25 UTC 2010


Author: rousseau
Date: Thu Jun 10 14:48:17 2010
New Revision: 4987

URL: http://svn.debian.org/wsvn/pcsclite/?sc=1&rev=4987
Log:
Use libusb-1.0 instead of libusb-0.1

Modified:
    trunk/Drivers/ccid/configure.in
    trunk/Drivers/ccid/contrib/Kobil_mIDentity_switch/Kobil_mIDentity_switch.c
    trunk/Drivers/ccid/src/ccid_usb.c
    trunk/Drivers/ccid/src/ccid_usb.h
    trunk/Drivers/ccid/src/ifdhandler.c
    trunk/Drivers/ccid/src/parse.c

Modified: trunk/Drivers/ccid/configure.in
URL: http://svn.debian.org/wsvn/pcsclite/trunk/Drivers/ccid/configure.in?rev=4987&op=diff
==============================================================================
--- trunk/Drivers/ccid/configure.in (original)
+++ trunk/Drivers/ccid/configure.in Thu Jun 10 14:48:17 2010
@@ -51,8 +51,6 @@
 CPPFLAGS="$CPPFLAGS $PCSC_CFLAGS"
 PCSC_ERROR_MSG="install pcsc-lite $PCSC_NEEDED_VERSION or later, or use ./configure PCSC_CFLAGS=..."
 AC_CHECK_HEADER(ifdhandler.h,, [AC_MSG_ERROR([$PCSC_ERROR_MSG])])
-AC_CHECK_DECLS([IFD_NO_SUCH_DEVICE, TAG_IFD_POLLING_THREAD, IFD_ERROR_INSUFFICIENT_BUFFER],,
-	[AC_MSG_ERROR([$PCSC_ERROR_MSG])], [#include <ifdhandler.h>])
 AC_CHECK_HEADER(reader.h,, [AC_MSG_ERROR([$PCSC_ERROR_MSG])])
 CPPFLAGS="$saved_CPPFLAGS"
 
@@ -115,8 +113,8 @@
 
 # check if libusb is used
 if test "x$use_libusb" != xno ; then
-	PKG_CHECK_EXISTS([libusb], [
-	PKG_CHECK_MODULES(LIBUSB, libusb, [],
+	PKG_CHECK_EXISTS([libusb-1.0], [
+	PKG_CHECK_MODULES(LIBUSB, libusb-1.0, [],
 		[
 			AC_CHECK_PROG([LIBUSBCONFIG], [libusb-config], [yes])
 
@@ -135,50 +133,21 @@
 	CPPFLAGS="$CPPFLAGS $LIBUSB_CFLAGS"
 	LIBS="$LDFLAGS $LIBUSB_LIBS"
 
-	AC_CHECK_HEADERS(usb.h, [],
-		[ AC_MSG_ERROR([usb.h not found, install libusb or use ./configure LIBUSB_CFLAGS=...]) ])
-
-	AC_MSG_CHECKING([for usb_init])
-	AC_TRY_LINK_FUNC(usb_init, [ AC_MSG_RESULT([yes]) ],
+	AC_CHECK_HEADERS(libusb-1.0/libusb.h, [],
+		[ AC_MSG_ERROR([libusb.h not found, install libusb or use ./configure LIBUSB_CFLAGS=...]) ])
+
+	AC_MSG_CHECKING([for libusb_init])
+	AC_TRY_LINK_FUNC(libusb_init, [ AC_MSG_RESULT([yes]) ],
 		[ AC_MSG_ERROR([libusb not found, use ./configure LIBUSB_LIBS=...]) ])
-
-	AC_MSG_CHECKING([for usb_interrupt_read])
-	AC_TRY_LINK_FUNC(usb_interrupt_read, [ AC_MSG_RESULT([yes]) ],
-		[ AC_MSG_ERROR([your libusb is too old. install version 0.1.12 or above]) ])
-
-	AC_CHECK_FUNC(usb_detach_kernel_driver_np,
-		[ AC_DEFINE(HAVE_USB_DETACH_KERNEL_DRIVER_NP, 1, [Define if usb_detach_kernel_driver_np() is available]) ])
 
 	CPPFLAGS="$saved_CPPFLAGS"
 	LIBS="$saved_LIBS"
 
 	use_libusb=yes
-
-	AC_MSG_CHECKING([if libusb is emulated by libusb-compat])
-	a=`$PKG_CONFIG --variable=emulated libusb`
-	if test "x$a" = "x1";
-	then
-		AC_MSG_RESULT([yes])
-		use_usb_interrupt=yes
-	else
-		AC_MSG_RESULT([no])
-	fi
-
 fi
 AC_SUBST(LIBUSB_CFLAGS)
 AC_SUBST(LIBUSB_LIBS)
 AM_CONDITIONAL(WITH_LIBUSB, test "${use_libusb}" != "no")
-
-# --enable-usb-interrupt
-AC_ARG_ENABLE(usb-interrupt,
-	AC_HELP_STRING([--enable-usb-interrupt], [force the use of USB
-	interrupt even with an old libusb]),
-	[ use_usb_interrupt="${enableval}" ] )
-
-if test "x$use_usb_interrupt" = xyes; then
-	AC_DEFINE(USE_USB_INTERRUPT, 1, [use libusb usb_interrupt_read()
-	instead of polling])
-fi
 
 # --enable-composite-as-multislot
 use_composite_as_multislot=no

Modified: trunk/Drivers/ccid/contrib/Kobil_mIDentity_switch/Kobil_mIDentity_switch.c
URL: http://svn.debian.org/wsvn/pcsclite/trunk/Drivers/ccid/contrib/Kobil_mIDentity_switch/Kobil_mIDentity_switch.c?rev=4987&op=diff
==============================================================================
--- trunk/Drivers/ccid/contrib/Kobil_mIDentity_switch/Kobil_mIDentity_switch.c (original)
+++ trunk/Drivers/ccid/contrib/Kobil_mIDentity_switch/Kobil_mIDentity_switch.c Thu Jun 10 14:48:17 2010
@@ -26,7 +26,7 @@
 usb device (vendor 0x04D6 id 0x4081)
 
 Kobil's own implementation was a kernel usb driver which did just send a
-usb_control_msg in the probe routine.
+libusb_control_transfer in the probe routine.
 
 We do the same via libusb and call this program from our /sbin/hotblug script
 if the mIDentity gets added.
@@ -39,7 +39,7 @@
 
         if (dev->descriptor.idVendor == KOBIL_VENDOR_ID){
                 printk("!!!!! DEVICE FOUND !!! !\n");
-		ret = usb_control_msg(dev,
+		ret = libusb_control_transfer(dev,
 		send_pipe,
 		0x09,
 		0x22,
@@ -58,7 +58,9 @@
 
 #include <stdio.h>
 #include <string.h>
-#include <usb.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <libusb-1.0/libusb.h>
 #include <errno.h>
 
 #include "config.h"
@@ -78,102 +80,114 @@
 #define wIndex                  0x0002  /* this was originally 0x0001 */
 
 
-static int kobil_midentity_control_msg(usb_dev_handle *usb)
+static int kobil_midentity_control_msg(libusb_device_handle *usb)
 {
-    int ret;
-
-    char switchCmd[10];
-
-    unsigned char Sleep = 1;
-    unsigned char hardDisk = 1;
-
-    unsigned char param = ((hardDisk)<<4) | (Sleep);
-
-    memset(switchCmd, 0x0, sizeof(switchCmd));
-    switchCmd[0] = HIDCMD_SWITCH_DEVICE>>8;
-    switchCmd[1] = HIDCMD_SWITCH_DEVICE;
-    switchCmd[5] = VAL_STARTUP_4000;
-    switchCmd[9] = param;
-
-	ret = usb_control_msg(usb, bmRequestType, bRequest, wValue, wIndex,
-		switchCmd, sizeof(switchCmd), KOBIL_TIMEOUT);
-
-    return(!(ret==sizeof(switchCmd)));
+	int ret;
+
+	unsigned char switchCmd[10];
+
+	unsigned char Sleep = 1;
+	unsigned char hardDisk = 1;
+
+	unsigned char param = ((hardDisk) << 4) | (Sleep);
+
+	memset(switchCmd, 0x0, sizeof(switchCmd));
+	switchCmd[0] = HIDCMD_SWITCH_DEVICE >> 8;
+	switchCmd[1] = HIDCMD_SWITCH_DEVICE;
+	switchCmd[5] = VAL_STARTUP_4000;
+	switchCmd[9] = param;
+
+	ret = libusb_control_transfer(usb, bmRequestType, bRequest, wValue, wIndex,
+			switchCmd, sizeof(switchCmd), KOBIL_TIMEOUT);
+
+	return(!(ret==sizeof(switchCmd)));
 }
 
 
-static int kobil_midentity_claim_interface(usb_dev_handle *usb, int ifnum)
+static int kobil_midentity_claim_interface(libusb_device_handle *usb, int ifnum)
 {
-    int rv;
-
-    printf("claiming interface #%d ...\n", ifnum);
-    rv = usb_claim_interface(usb, ifnum);
-    if (rv == 0)
+	int rv;
+
+	printf("claiming interface #%d ...\n", ifnum);
+	rv = libusb_claim_interface(usb, ifnum);
+	if (rv == 0)
 	{
 		printf("success\n");
-		return(rv);
-    }
+		return rv;
+	}
 
 #ifdef HAVE_USB_DETACH_KERNEL_DRIVER_NP
-    printf("failed with error %d, trying to detach kernel driver ....\n", rv);
-    rv = usb_detach_kernel_driver_np(usb, ifnum);
-    if (rv == 0)
-    {
+	printf("failed with error %d, trying to detach kernel driver ....\n", rv);
+	rv = libusb_detach_kernel_driver_np(usb, ifnum);
+	if (rv == 0)
+	{
 		printf("success, claiming interface again ...");
-		rv = usb_claim_interface(usb, ifnum);
+		rv = libusb_claim_interface(usb, ifnum);
 		if (rv == 0)
 		{
 			printf("success\n");
-			return(rv);
+			return rv;
 		}
-    }
+	}
 #endif
-    printf("failed with error %d, giving up.\n", rv);
-    return(rv);
+	printf("failed with error %d, giving up.\n", rv);
+	return rv;
 }
 
 
 int main(int argc, char *argv[])
 {
-    struct usb_bus *bus;
-    struct usb_device *dev = NULL;
-    struct usb_device *found_dev = NULL;
-    usb_dev_handle *usb = NULL;
-    int rv;
+	libusb_device **devs, *dev;
+	libusb_device *found_dev = NULL;
+	struct libusb_device_handle *usb = NULL;
+	int rv, i;
+	ssize_t cnt;
 
 	(void)argc;
 	(void)argv;
 
-    usb_init();
-
-    usb_find_busses();
-    usb_find_devices();
-
-	for (bus = usb_busses; bus; bus = bus->next)
-	{
-		for (dev = bus->devices; dev; dev = dev->next)
-		{
-			printf("vendor/product: %04X %04X\n",
-				dev->descriptor.idVendor, dev->descriptor.idProduct);
-			if (dev->descriptor.idVendor == KOBIL_VENDOR_ID
-				&& dev->descriptor.idProduct ==MID_DEVICE_ID)
-			{
-				found_dev = dev;
-			}
+	rv = libusb_init(NULL);
+	if (rv < 0)
+	{
+		(void)printf("libusb_init() failed\n");
+		return rv;
+	}
+
+	cnt = libusb_get_device_list(NULL, &devs);
+	if (cnt < 0)
+	{
+		(void)printf("libusb_get_device_list() failed\n");
+		return (int)cnt;
+	}
+
+	/* for every device */
+	i = 0;
+	while ((dev = devs[i++]) != NULL)
+	{
+		struct libusb_device_descriptor desc;
+
+		rv = libusb_get_device_descriptor(dev, &desc);
+		if (rv < 0) {
+			(void)printf("failed to get device descriptor\n");
+			continue;
 		}
-	}
-
-    if (found_dev == NULL)
+
+		printf("vendor/product: %04X %04X\n", desc.idVendor, desc.idProduct);
+		if (desc.idVendor == KOBIL_VENDOR_ID && desc.idProduct ==MID_DEVICE_ID)
+			found_dev = dev;
+	}
+
+	if (found_dev == NULL)
 	{
 		printf("device not found. aborting.\n");
 		if (0 != geteuid())
 			printf("Try to rerun this program as root.\n");
 		exit(1);
-    }
+	}
 
 	printf("Device found, opening ... ");
-	usb = usb_open(found_dev);
-	if (!usb)
+	rv = libusb_open(found_dev, &usb);
+	if (rv < 0)
 	{
 		printf("failed, aborting.\n");
 		exit(2);
@@ -183,13 +197,13 @@
 	rv = kobil_midentity_claim_interface(usb, 0);
 	if (rv < 0)
 	{
-		usb_close(usb);
+		libusb_close(usb);
 		exit(3);
 	}
 	rv = kobil_midentity_claim_interface(usb, 1);
 	if (rv < 0)
 	{
-		usb_close(usb);
+		libusb_close(usb);
 		exit(3);
 	}
 
@@ -200,8 +214,8 @@
 	else
 		printf("failed with error %d, giving up.\n", rv);
 
-    usb_close(usb);
-
-    return 0;
+	libusb_close(usb);
+
+	return 0;
 }
 

Modified: trunk/Drivers/ccid/src/ccid_usb.c
URL: http://svn.debian.org/wsvn/pcsclite/trunk/Drivers/ccid/src/ccid_usb.c?rev=4987&op=diff
==============================================================================
--- trunk/Drivers/ccid/src/ccid_usb.c (original)
+++ trunk/Drivers/ccid/src/ccid_usb.c Thu Jun 10 14:48:17 2010
@@ -58,9 +58,9 @@
 
 typedef struct
 {
-	usb_dev_handle *handle;
-	char *dirname;
-	char *filename;
+	libusb_device_handle *dev_handle;
+	uint8_t bus_number;
+	uint8_t device_address;
 	int interface;
 
 	/*
@@ -84,10 +84,11 @@
 /* The _usbDevice structure must be defined before including ccid_usb.h */
 #include "ccid_usb.h"
 
-static int get_end_points(struct usb_device *dev, _usbDevice *usbdevice, int num);
-int ccid_check_firmware(struct usb_device *dev);
+static int get_end_points(struct libusb_config_descriptor *desc,
+	_usbDevice *usbdevice, int num);
+int ccid_check_firmware(struct libusb_device_descriptor *desc);
 static unsigned int *get_data_rates(unsigned int reader_index,
-	struct usb_device *dev, int num);
+	struct libusb_config_descriptor *desc, int num);
 
 /* ne need to initialize to 0 since it is static */
 static _usbDevice usbDevice[CCID_DRIVER_MAX_READERS];
@@ -150,19 +151,19 @@
  ****************************************************************************/
 status_t OpenUSBByName(unsigned int reader_index, /*@null@*/ char *device)
 {
-	static struct usb_bus *busses = NULL;
 	int alias = 0;
-	struct usb_bus *bus;
-	struct usb_dev_handle *dev_handle;
+	struct libusb_device_handle *dev_handle;
 	char keyValue[TOKEN_MAX_VALUE_SIZE];
 	unsigned int vendorID, productID;
 	char infofile[FILENAME_MAX];
 #ifndef __APPLE__
 	unsigned int device_vendor, device_product;
 #endif
-	char *dirname = NULL, *filename = NULL;
 	int interface_number = -1;
+	int i;
 	static int previous_reader_index = -1;
+	libusb_device **devs, *dev;
+	ssize_t cnt;
 
 	DEBUG_COMM3("Reader index: %X, Device: %s", reader_index, device);
 
@@ -170,6 +171,8 @@
 	/* device name specified */
 	if (device)
 	{
+		char *dirname;
+
 		/* format: usb:%04x/%04x, vendor, product */
 		if (strncmp("usb:", device, 4) != 0)
 		{
@@ -182,33 +185,6 @@
 		{
 			DEBUG_CRITICAL2("device name can't be parsed: %s", device);
 			return STATUS_UNSUCCESSFUL;
-		}
-
-		/* format usb:%04x/%04x:libusb:%s
-		 * with %s set to %s:%s, dirname, filename */
-		if ((dirname = strstr(device, "libusb:")) != NULL)
-		{
-			/* dirname points to the first char after libusb: */
-			dirname += strlen("libusb:");
-
-			/* search the : (separation) char */
-			filename = strchr(dirname, ':');
-
-			if (filename)
-			{
-				/* end the dirname string */
-				*filename = '\0';
-
-				/* filename points to the first char after : */
-				filename++;
-			}
-			else
-			{
-				/* parse failed */
-				dirname = NULL;
-
-				DEBUG_CRITICAL2("can't parse using libusb scheme: %s", device);
-			}
 		}
 
 		/* format usb:%04x/%04x:libhal:%s
@@ -245,29 +221,14 @@
 			}
 			else
 				DEBUG_CRITICAL2("can't parse using libhal scheme: %s", device);
-
-			/* dirname was just a temporary variable */
-			dirname = NULL;
 		}
 	}
 #endif
 
-	if (busses == NULL)
-		usb_init();
-
-	(void)usb_find_busses();
-	(void)usb_find_devices();
-
-	busses = usb_get_busses();
-
-	if (busses == NULL)
-	{
-		DEBUG_CRITICAL("No USB busses found");
-		return STATUS_UNSUCCESSFUL;
-	}
+	libusb_init(NULL);
 
 	/* is the reader_index already used? */
-	if (usbDevice[reader_index].handle != NULL)
+	if (usbDevice[reader_index].dev_handle != NULL)
 	{
 		DEBUG_CRITICAL2("USB driver with index %X already in use",
 			reader_index);
@@ -305,6 +266,13 @@
 	alias = 0x1C;
 	for (; vendorID--;)
 		alias ^= keyValue[vendorID];
+
+	cnt = libusb_get_device_list(NULL, &devs);
+	if (cnt < 0)
+	{
+		(void)printf("libusb_get_device_list() failed\n");
+		return STATUS_UNSUCCESSFUL;
+	}
 
 	/* for any supported reader */
 	while (LTPBundleFindValueWithKey(infofile, PCSCLITE_MANUKEY_NAME, keyValue, alias) == 0)
@@ -332,38 +300,41 @@
 			continue;
 #endif
 
-		/* on any USB buses */
-		for (bus = busses; bus; bus = bus->next)
+		/* for every device */
+		i = 0;
+		while ((dev = devs[i++]) != NULL)
 		{
-			struct usb_device *dev;
-
-			/* any device on this bus */
-			for (dev = bus->devices; dev; dev = dev->next)
+			struct libusb_device_descriptor desc;
+			struct libusb_config_descriptor *config_desc;
+			uint8_t bus_number = libusb_get_bus_number(dev);
+			uint8_t device_address = libusb_get_device_address(dev);
+
+			int r = libusb_get_device_descriptor(dev, &desc);
+			if (r < 0)
 			{
-				/* device defined by name? */
-				if (dirname && (strcmp(dirname, bus->dirname)
-					|| strcmp(filename, dev->filename)))
-					continue;
-
-				if (dev->descriptor.idVendor == vendorID
-					&& dev->descriptor.idProduct == productID)
-				{
-					int r, already_used;
-					struct usb_interface *usb_interface = NULL;
-					int interface;
-					int num = 0;
+				DEBUG_INFO3("failed to get device descriptor for %d/%d",
+					bus_number, device_address);
+				continue;
+			}
+
+			if (desc.idVendor == vendorID && desc.idProduct == productID)
+			{
+				int already_used;
+				const struct libusb_interface *usb_interface = NULL;
+				int interface;
+				int num = 0;
 
 #ifdef USE_COMPOSITE_AS_MULTISLOT
-					static int static_interface = 1;
-
+				static int static_interface = 1;
+
+				{
+					/* simulate a composite device as when libhal is
+					 * used */
+					int readerID = (vendorID << 16) + productID;
+
+					if ((GEMALTOPROXDU == readerID)
+						|| (GEMALTOPROXSU == readerID))
 					{
-						/* simulate a composite device as when libhal is
-						 * used */
-						int readerID = (vendorID << 16) + productID;
-
-						if ((GEMALTOPROXDU == readerID)
-							|| (GEMALTOPROXSU == readerID))
-						{
 							/*
 							 * We can't talk to the two CCID interfaces
 							 * at the same time (the reader enters a
@@ -384,207 +355,208 @@
 		* 1: Gemalto Prox-DU [Prox-DU Contactless_09A00795] (09A00795) 01 00
 							 */
 
-							/* the CCID interfaces are 1 and 2 */
-							interface_number = static_interface;
+						/* the CCID interfaces are 1 and 2 */
+						interface_number = static_interface;
+					}
+				}
+#endif
+				/* is it already opened? */
+				already_used = FALSE;
+
+				DEBUG_COMM3("Checking device: %d/%d",
+					bus_number, device_address);
+				for (r=0; r<CCID_DRIVER_MAX_READERS; r++)
+				{
+					if (usbDevice[r].dev_handle)
+					{
+						/* same bus, same address */
+						if (usbDevice[r].bus_number == bus_number
+							&& usbDevice[r].device_address == device_address)
+							already_used = TRUE;
+					}
+				}
+
+				/* this reader is already managed by us */
+				if (already_used)
+				{
+					if ((previous_reader_index != -1)
+						&& usbDevice[previous_reader_index].dev_handle
+						&& (usbDevice[previous_reader_index].bus_number == bus_number)
+						&& (usbDevice[previous_reader_index].device_address == device_address)
+						&& usbDevice[previous_reader_index].ccid.bCurrentSlotIndex < usbDevice[previous_reader_index].ccid.bMaxSlotIndex)
+					{
+						/* we reuse the same device
+						 * and the reader is multi-slot */
+						usbDevice[reader_index] = usbDevice[previous_reader_index];
+						/* the other slots do not have the same data rates */
+						if ((GEMCOREPOSPRO == usbDevice[reader_index].ccid.readerID)
+							|| (GEMCORESIMPRO == usbDevice[reader_index].ccid.readerID))
+						{
+							usbDevice[reader_index].ccid.arrayOfSupportedDataRates = SerialCustomDataRates;
+							usbDevice[reader_index].ccid.dwMaxDataRate = 125000;
+						}
+
+						*usbDevice[reader_index].nb_opened_slots += 1;
+						usbDevice[reader_index].ccid.bCurrentSlotIndex++;
+						usbDevice[reader_index].ccid.dwSlotStatus =
+							IFD_ICC_PRESENT;
+						DEBUG_INFO2("Opening slot: %d",
+							usbDevice[reader_index].ccid.bCurrentSlotIndex);
+						goto end;
+					}
+					else
+					{
+						/* if an interface number is given by HAL we
+						 * continue with this device. */
+						if (-1 == interface_number)
+						{
+							DEBUG_INFO3("USB device %d/%d already in use."
+								" Checking next one.",
+								bus_number, device_address);
+							continue;
 						}
 					}
+				}
+
+				DEBUG_COMM3("Trying to open USB bus/device: %d/%d",
+					bus_number, device_address);
+
+				r = libusb_open(dev, &dev_handle);
+				if (r < 0)
+				{
+					DEBUG_CRITICAL4("Can't libusb_open(%d/%d): %d",
+						bus_number, device_address, r);
+
+					continue;
+				}
+
+again:
+				r = libusb_get_active_config_descriptor(dev, &config_desc);
+				if (r < 0)
+				{
+					(void)libusb_close(dev_handle);
+					DEBUG_CRITICAL3("Can't get config descriptor on %d/%d",
+						bus_number, device_address);
+					continue;
+				}
+
+				usb_interface = get_ccid_usb_interface(config_desc, &num);
+				if (usb_interface == NULL)
+				{
+					(void)libusb_close(dev_handle);
+					if (0 == num)
+						DEBUG_CRITICAL3("Can't find a CCID interface on %d/%d",
+							bus_number, device_address);
+					interface_number = -1;
+					continue;
+				}
+
+				if (usb_interface->altsetting->extra_length != 54)
+				{
+					(void)libusb_close(dev_handle);
+					DEBUG_CRITICAL4("Extra field for %d/%d has a wrong length: %d",
+						bus_number, device_address,
+						usb_interface->altsetting->extra_length);
+					return STATUS_UNSUCCESSFUL;
+				}
+
+				interface = usb_interface->altsetting->bInterfaceNumber;
+				if (interface_number >= 0 && interface != interface_number)
+				{
+					/* an interface was specified and it is not the
+					 * current one */
+					DEBUG_INFO3("Wrong interface for USB device %d/%d."
+						" Checking next one.", bus_number, device_address);
+
+					/* check for another CCID interface on the same device */
+					num++;
+
+					goto again;
+				}
+
+				r = libusb_claim_interface(dev_handle, interface);
+				if (r < 0)
+				{
+					(void)libusb_close(dev_handle);
+					DEBUG_CRITICAL4("Can't claim interface %d/%d: %d",
+						bus_number, device_address, r);
+					interface_number = -1;
+					continue;
+				}
+
+				DEBUG_INFO4("Found Vendor/Product: %04X/%04X (%s)",
+					desc.idVendor, desc.idProduct, keyValue);
+				DEBUG_INFO3("Using USB bus/device: %d/%d",
+					bus_number, device_address);
+
+				/* check for firmware bugs */
+				if (ccid_check_firmware(&desc))
+				{
+					(void)libusb_close(dev_handle);
+					return STATUS_UNSUCCESSFUL;
+				}
+
+#ifdef USE_COMPOSITE_AS_MULTISLOT
+				/* use the next interface for the next "slot" */
+				static_interface++;
+
+				/* reset for a next reader */
+				if (static_interface > 2)
+					static_interface = 1;
 #endif
-					/* is it already opened? */
-					already_used = FALSE;
-
-					DEBUG_COMM3("Checking device: %s/%s",
-						bus->dirname, dev->filename);
-					for (r=0; r<CCID_DRIVER_MAX_READERS; r++)
-					{
-						if (usbDevice[r].handle)
-						{
-							/* same busname, same filename */
-							if (strcmp(usbDevice[r].dirname, bus->dirname) == 0 && strcmp(usbDevice[r].filename, dev->filename) == 0)
-								already_used = TRUE;
-						}
-					}
-
-					/* this reader is already managed by us */
-					if (already_used)
-					{
-						if ((previous_reader_index != -1)
-							&& usbDevice[previous_reader_index].handle
-							&& (strcmp(usbDevice[previous_reader_index].dirname, bus->dirname)  == 0)
-							&& (strcmp(usbDevice[previous_reader_index].filename, dev->filename) == 0)
-							&& usbDevice[previous_reader_index].ccid.bCurrentSlotIndex < usbDevice[previous_reader_index].ccid.bMaxSlotIndex)
-						{
-							/* we reuse the same device
-							 * and the reader is multi-slot */
-							usbDevice[reader_index] = usbDevice[previous_reader_index];
-							/* the other slots do not have the same data rates */
-							if ((GEMCOREPOSPRO == usbDevice[reader_index].ccid.readerID)
-								|| (GEMCORESIMPRO == usbDevice[reader_index].ccid.readerID))
-							{
-								usbDevice[reader_index].ccid.arrayOfSupportedDataRates = SerialCustomDataRates;
-								usbDevice[reader_index].ccid.dwMaxDataRate = 125000;
-							}
-
-							*usbDevice[reader_index].nb_opened_slots += 1;
-							usbDevice[reader_index].ccid.bCurrentSlotIndex++;
-							usbDevice[reader_index].ccid.dwSlotStatus =
-								IFD_ICC_PRESENT;
-							DEBUG_INFO2("Opening slot: %d",
-								usbDevice[reader_index].ccid.bCurrentSlotIndex);
-							goto end;
-						}
-						else
-						{
-							/* if an interface number is given by HAL we
-							 * continue with this device. */
-							if (-1 == interface_number)
-							{
-								DEBUG_INFO3("USB device %s/%s already in use."
-									" Checking next one.",
-									bus->dirname, dev->filename);
-								continue;
-							}
-						}
-					}
-
-					DEBUG_COMM3("Trying to open USB bus/device: %s/%s",
-						 bus->dirname, dev->filename);
-
-					dev_handle = usb_open(dev);
-					if (dev_handle == NULL)
-					{
-						DEBUG_CRITICAL4("Can't usb_open(%s/%s): %s",
-							bus->dirname, dev->filename, usb_strerror());
-
-						continue;
-					}
-
-					/* now we found a free reader and we try to use it */
-					if (dev->config == NULL)
-					{
-						(void)usb_close(dev_handle);
-						DEBUG_CRITICAL3("No dev->config found for %s/%s",
-							 bus->dirname, dev->filename);
-						return STATUS_UNSUCCESSFUL;
-					}
-
-again:
-					usb_interface = get_ccid_usb_interface(dev, &num);
-					if (usb_interface == NULL)
-					{
-						(void)usb_close(dev_handle);
-						if (0 == num)
-							DEBUG_CRITICAL3("Can't find a CCID interface on %s/%s",
-								bus->dirname, dev->filename);
-						interface_number = -1;
-						continue;
-					}
-
-					if (usb_interface->altsetting->extralen != 54)
-					{
-						(void)usb_close(dev_handle);
-						DEBUG_CRITICAL4("Extra field for %s/%s has a wrong length: %d", bus->dirname, dev->filename, usb_interface->altsetting->extralen);
-						return STATUS_UNSUCCESSFUL;
-					}
-
-					interface = usb_interface->altsetting->bInterfaceNumber;
-					if (interface_number >= 0 && interface != interface_number)
-					{
-						/* an interface was specified and it is not the
-						 * current one */
-						DEBUG_INFO3("Wrong interface for USB device %s/%s."
-							" Checking next one.", bus->dirname, dev->filename);
-
-						/* check for another CCID interface on the same device */
-						num++;
-
-						goto again;
-					}
-
-					if (usb_claim_interface(dev_handle, interface) < 0)
-					{
-						(void)usb_close(dev_handle);
-						DEBUG_CRITICAL4("Can't claim interface %s/%s: %s",
-							bus->dirname, dev->filename, usb_strerror());
-						interface_number = -1;
-						continue;
-					}
-
-					DEBUG_INFO4("Found Vendor/Product: %04X/%04X (%s)",
-						dev->descriptor.idVendor,
-						dev->descriptor.idProduct, keyValue);
-					DEBUG_INFO3("Using USB bus/device: %s/%s",
-						 bus->dirname, dev->filename);
-
-					/* check for firmware bugs */
-					if (ccid_check_firmware(dev))
-					{
-						(void)usb_close(dev_handle);
-						return STATUS_UNSUCCESSFUL;
-					}
-
-#ifdef USE_COMPOSITE_AS_MULTISLOT
-					/* use the next interface for the next "slot" */
-					static_interface++;
-
-					/* reset for a next reader */
-					if (static_interface > 2)
-						static_interface = 1;
-#endif
-
-					/* Get Endpoints values*/
-					(void)get_end_points(dev, &usbDevice[reader_index], num);
-
-					/* store device information */
-					usbDevice[reader_index].handle = dev_handle;
-					usbDevice[reader_index].dirname = strdup(bus->dirname);
-					usbDevice[reader_index].filename = strdup(dev->filename);
-					usbDevice[reader_index].interface = interface;
-					usbDevice[reader_index].real_nb_opened_slots = 1;
-					usbDevice[reader_index].nb_opened_slots = &usbDevice[reader_index].real_nb_opened_slots;
-
-					/* CCID common informations */
-					usbDevice[reader_index].ccid.real_bSeq = 0;
-					usbDevice[reader_index].ccid.pbSeq = &usbDevice[reader_index].ccid.real_bSeq;
-					usbDevice[reader_index].ccid.readerID =
-						(dev->descriptor.idVendor << 16) +
-						dev->descriptor.idProduct;
-					usbDevice[reader_index].ccid.dwFeatures = dw2i(usb_interface->altsetting->extra, 40);
-					usbDevice[reader_index].ccid.wLcdLayout =
-						(usb_interface->altsetting->extra[51] << 8) +
-						usb_interface->altsetting->extra[50];
-					usbDevice[reader_index].ccid.bPINSupport = usb_interface->altsetting->extra[52];
-					usbDevice[reader_index].ccid.dwMaxCCIDMessageLength = dw2i(usb_interface->altsetting->extra, 44);
-					usbDevice[reader_index].ccid.dwMaxIFSD = dw2i(usb_interface->altsetting->extra, 28);
-					usbDevice[reader_index].ccid.dwDefaultClock = dw2i(usb_interface->altsetting->extra, 10);
-					usbDevice[reader_index].ccid.dwMaxDataRate = dw2i(usb_interface->altsetting->extra, 23);
-					usbDevice[reader_index].ccid.bMaxSlotIndex = usb_interface->altsetting->extra[4];
-					usbDevice[reader_index].ccid.bCurrentSlotIndex = 0;
-					usbDevice[reader_index].ccid.readTimeout = DEFAULT_COM_READ_TIMEOUT;
-					usbDevice[reader_index].ccid.arrayOfSupportedDataRates = get_data_rates(reader_index, dev, num);
-					usbDevice[reader_index].ccid.bInterfaceProtocol = usb_interface->altsetting->bInterfaceProtocol;
-					usbDevice[reader_index].ccid.bNumEndpoints = usb_interface->altsetting->bNumEndpoints;
-					usbDevice[reader_index].ccid.dwSlotStatus = IFD_ICC_PRESENT;
-					usbDevice[reader_index].ccid.bVoltageSupport = usb_interface->altsetting->extra[5];
-					usbDevice[reader_index].ccid.sIFD_serial_number = NULL;
-					if (dev->descriptor.iSerialNumber)
-					{
-						char serial[128];
-						int ret;
-
-						ret = usb_get_string_simple(dev_handle,
-							dev->descriptor.iSerialNumber, serial,
+
+				/* Get Endpoints values*/
+				(void)get_end_points(config_desc, &usbDevice[reader_index], num);
+
+				/* store device information */
+				usbDevice[reader_index].dev_handle = dev_handle;
+				usbDevice[reader_index].bus_number = bus_number;
+				usbDevice[reader_index].device_address = device_address;
+				usbDevice[reader_index].interface = interface;
+				usbDevice[reader_index].real_nb_opened_slots = 1;
+				usbDevice[reader_index].nb_opened_slots = &usbDevice[reader_index].real_nb_opened_slots;
+
+				/* CCID common informations */
+				usbDevice[reader_index].ccid.real_bSeq = 0;
+				usbDevice[reader_index].ccid.pbSeq = &usbDevice[reader_index].ccid.real_bSeq;
+				usbDevice[reader_index].ccid.readerID =
+					(desc.idVendor << 16) + desc.idProduct;
+				usbDevice[reader_index].ccid.dwFeatures = dw2i(usb_interface->altsetting->extra, 40);
+				usbDevice[reader_index].ccid.wLcdLayout =
+					(usb_interface->altsetting->extra[51] << 8) +
+					usb_interface->altsetting->extra[50];
+				usbDevice[reader_index].ccid.bPINSupport = usb_interface->altsetting->extra[52];
+				usbDevice[reader_index].ccid.dwMaxCCIDMessageLength = dw2i(usb_interface->altsetting->extra, 44);
+				usbDevice[reader_index].ccid.dwMaxIFSD = dw2i(usb_interface->altsetting->extra, 28);
+				usbDevice[reader_index].ccid.dwDefaultClock = dw2i(usb_interface->altsetting->extra, 10);
+				usbDevice[reader_index].ccid.dwMaxDataRate = dw2i(usb_interface->altsetting->extra, 23);
+				usbDevice[reader_index].ccid.bMaxSlotIndex = usb_interface->altsetting->extra[4];
+				usbDevice[reader_index].ccid.bCurrentSlotIndex = 0;
+				usbDevice[reader_index].ccid.readTimeout = DEFAULT_COM_READ_TIMEOUT;
+				usbDevice[reader_index].ccid.arrayOfSupportedDataRates = get_data_rates(reader_index, config_desc, num);
+				usbDevice[reader_index].ccid.bInterfaceProtocol = usb_interface->altsetting->bInterfaceProtocol;
+				usbDevice[reader_index].ccid.bNumEndpoints = usb_interface->altsetting->bNumEndpoints;
+				usbDevice[reader_index].ccid.dwSlotStatus = IFD_ICC_PRESENT;
+				usbDevice[reader_index].ccid.bVoltageSupport = usb_interface->altsetting->extra[5];
+				usbDevice[reader_index].ccid.sIFD_serial_number = NULL;
+				if (desc.iSerialNumber)
+				{
+					unsigned char serial[128];
+					int ret;
+
+					ret = libusb_get_string_descriptor_ascii(dev_handle,
+							desc.iSerialNumber, serial,
 							sizeof(serial));
-						if (ret > 0)
-							usbDevice[reader_index].ccid.sIFD_serial_number
-								= strdup(serial);
-					}
-					goto end;
-				}
+					if (ret > 0)
+						usbDevice[reader_index].ccid.sIFD_serial_number
+							= strdup((char *)serial);
+				}
+				goto end;
 			}
 		}
 	}
 end:
-	if (usbDevice[reader_index].handle == NULL)
+	if (usbDevice[reader_index].dev_handle == NULL)
 		return STATUS_NO_SUCH_DEVICE;
 
 	/* memorise the current reader_index so we can detect
@@ -604,6 +576,7 @@
 	unsigned char *buffer)
 {
 	int rv;
+	int actual_length;
 	char debug_header[] = "-> 121234 ";
 
 	(void)snprintf(debug_header, sizeof(debug_header), "-> %06X ",
@@ -611,15 +584,15 @@
 
 	DEBUG_XXD(debug_header, buffer, length);
 
-	rv = usb_bulk_write(usbDevice[reader_index].handle,
-		usbDevice[reader_index].bulk_out, (char *)buffer, length,
-		USB_WRITE_TIMEOUT);
+	rv = libusb_bulk_transfer(usbDevice[reader_index].dev_handle,
+		usbDevice[reader_index].bulk_out, buffer, length,
+		&actual_length, USB_WRITE_TIMEOUT);
 
 	if (rv < 0)
 	{
-		DEBUG_CRITICAL4("usb_bulk_write(%s/%s): %s",
-			usbDevice[reader_index].dirname, usbDevice[reader_index].filename,
-			usb_strerror());
+		DEBUG_CRITICAL4("libusb_bulk_write(%d/%d): %d",
+			usbDevice[reader_index].bus_number,
+			usbDevice[reader_index].device_address, rv);
 
 		if (ENODEV == errno)
 			return STATUS_NO_SUCH_DEVICE;
@@ -640,6 +613,7 @@
 	unsigned char *buffer)
 {
 	int rv;
+	int actual_length;
 	char debug_header[] = "<- 121234 ";
 	_ccid_descriptor *ccid_descriptor = get_ccid_descriptor(reader_index);
 	int duplicate_frame = 0;
@@ -648,16 +622,16 @@
 	(void)snprintf(debug_header, sizeof(debug_header), "<- %06X ",
 		(int)reader_index);
 
-	rv = usb_bulk_read(usbDevice[reader_index].handle,
-		usbDevice[reader_index].bulk_in, (char *)buffer, *length,
-		usbDevice[reader_index].ccid.readTimeout);
+	rv = libusb_bulk_transfer(usbDevice[reader_index].dev_handle,
+		usbDevice[reader_index].bulk_in, buffer, *length,
+		&actual_length, usbDevice[reader_index].ccid.readTimeout);
 
 	if (rv < 0)
 	{
 		*length = 0;
-		DEBUG_CRITICAL4("usb_bulk_read(%s/%s): %s",
-			usbDevice[reader_index].dirname, usbDevice[reader_index].filename,
-			usb_strerror());
+		DEBUG_CRITICAL4("libusb_bulk_read(%d/%d): %d",
+			usbDevice[reader_index].bus_number,
+			usbDevice[reader_index].device_address, rv);
 
 		if (ENODEV == errno)
 			return STATUS_NO_SUCH_DEVICE;
@@ -665,7 +639,7 @@
 		return STATUS_UNSUCCESSFUL;
 	}
 
-	*length = rv;
+	*length = actual_length;
 
 	DEBUG_XXD(debug_header, buffer, *length);
 
@@ -695,12 +669,12 @@
 status_t CloseUSB(unsigned int reader_index)
 {
 	/* device not opened */
-	if (usbDevice[reader_index].handle == NULL)
+	if (usbDevice[reader_index].dev_handle == NULL)
 		return STATUS_UNSUCCESSFUL;
 
-	DEBUG_COMM3("Closing USB device: %s/%s",
-		usbDevice[reader_index].dirname,
-		usbDevice[reader_index].filename);
+	DEBUG_COMM3("Closing USB device: %d/%d",
+		usbDevice[reader_index].bus_number,
+		usbDevice[reader_index].device_address);
 
 	if (usbDevice[reader_index].ccid.arrayOfSupportedDataRates
 		&& (usbDevice[reader_index].ccid.bCurrentSlotIndex == 0))
@@ -719,20 +693,15 @@
 
 		/* reset so that bSeq starts at 0 again */
 		if (DriverOptions & DRIVER_OPTION_RESET_ON_CLOSE)
-			(void)usb_reset(usbDevice[reader_index].handle);
-
-		(void)usb_release_interface(usbDevice[reader_index].handle,
+			(void)libusb_reset_device(usbDevice[reader_index].dev_handle);
+
+		(void)libusb_release_interface(usbDevice[reader_index].dev_handle,
 			usbDevice[reader_index].interface);
-		(void)usb_close(usbDevice[reader_index].handle);
-
-		free(usbDevice[reader_index].dirname);
-		free(usbDevice[reader_index].filename);
+		(void)libusb_close(usbDevice[reader_index].dev_handle);
 	}
 
 	/* mark the resource unused */
-	usbDevice[reader_index].handle = NULL;
-	usbDevice[reader_index].dirname = NULL;
-	usbDevice[reader_index].filename = NULL;
+	usbDevice[reader_index].dev_handle = NULL;
 	usbDevice[reader_index].interface = 0;
 
 	if (usbDevice[reader_index].ccid.sIFD_serial_number)
@@ -758,12 +727,14 @@
  *					get_end_points
  *
  ****************************************************************************/
-static int get_end_points(struct usb_device *dev, _usbDevice *usbdevice,
-	int num)
+static int get_end_points(struct libusb_config_descriptor *desc,
+	_usbDevice *usbdevice, int num)
 {
 	int i;
 	int bEndpointAddress;
-	struct usb_interface *usb_interface = get_ccid_usb_interface(dev, &num);
+	const struct libusb_interface *usb_interface;
+
+	usb_interface = get_ccid_usb_interface(desc, &num);
 
 	/*
 	 * 3 Endpoints maximum: Interrupt In, Bulk In, Bulk Out
@@ -798,26 +769,26 @@
  *					get_ccid_usb_interface
  *
  ****************************************************************************/
-/*@null@*/ EXTERNAL struct usb_interface * get_ccid_usb_interface(
-	struct usb_device *dev, int *num)
-{
-	struct usb_interface *usb_interface = NULL;
+/*@null@*/ EXTERNAL const struct libusb_interface * get_ccid_usb_interface(
+	struct libusb_config_descriptor *desc, int *num)
+{
+	const struct libusb_interface *usb_interface = NULL;
 	int i;
 #ifdef O2MICRO_OZ776_PATCH
 	int readerID;
 #endif
 
 	/* if multiple interfaces use the first one with CCID class type */
-	for (i = *num; dev->config && i<dev->config->bNumInterfaces; i++)
+	for (i = *num; i < desc->bNumInterfaces; i++)
 	{
 		/* CCID Class? */
-		if (dev->config->interface[i].altsetting->bInterfaceClass == 0xb
+		if (desc->interface[i].altsetting->bInterfaceClass == 0xb
 #ifdef ALLOW_PROPRIETARY_CLASS
-			|| dev->config->interface[i].altsetting->bInterfaceClass == 0xff
+			|| desc->interface[i].altsetting->bInterfaceClass == 0xff
 #endif
 			)
 		{
-			usb_interface = &dev->config->interface[i];
+			usb_interface = &desc->interface[i];
 			/* store the interface number for further reference */
 			*num = i;
 			break;
@@ -829,21 +800,21 @@
 	if (usb_interface != NULL
 		&& ((OZ776 == readerID) || (OZ776_7772 == readerID)
 		|| (REINER_SCT == readerID) || (BLUDRIVEII_CCID == readerID))
-		&& (0 == usb_interface->altsetting->extralen)) /* this is the bug */
+		&& (0 == usb_interface->altsetting->extra_length)) /* this is the bug */
 	{
 		int j;
 		for (j=0; j<usb_interface->altsetting->bNumEndpoints; j++)
 		{
 			/* find the extra[] array */
-			if (54 == usb_interface->altsetting->endpoint[j].extralen)
+			if (54 == usb_interface->altsetting->endpoint[j].extra_length)
 			{
 				/* get the extra[] from the endpoint */
-				usb_interface->altsetting->extralen = 54;
+				usb_interface->altsetting->extra_length = 54;
 				usb_interface->altsetting->extra =
 					usb_interface->altsetting->endpoint[j].extra;
 				/* avoid double free on close */
 				usb_interface->altsetting->endpoint[j].extra = NULL;
-				usb_interface->altsetting->endpoint[j].extralen = 0;
+				usb_interface->altsetting->endpoint[j].extra_length = 0;
 				break;
 			}
 		}
@@ -859,33 +830,31 @@
  *					ccid_check_firmware
  *
  ****************************************************************************/
-int ccid_check_firmware(struct usb_device *dev)
+int ccid_check_firmware(struct libusb_device_descriptor *desc)
 {
 	unsigned int i;
 
 	for (i=0; i<sizeof(Bogus_firmwares)/sizeof(Bogus_firmwares[0]); i++)
 	{
-		if (dev->descriptor.idVendor != Bogus_firmwares[i].vendor)
+		if (desc->idVendor != Bogus_firmwares[i].vendor)
 			continue;
 
-		if (dev->descriptor.idProduct != Bogus_firmwares[i].product)
+		if (desc->idProduct != Bogus_firmwares[i].product)
 			continue;
 
 		/* firmware too old and buggy */
-		if (dev->descriptor.bcdDevice < Bogus_firmwares[i].firmware)
+		if (desc->bcdDevice < Bogus_firmwares[i].firmware)
 		{
 			if (DriverOptions & DRIVER_OPTION_USE_BOGUS_FIRMWARE)
 			{
 				DEBUG_INFO3("Firmware (%X.%02X) is bogus! but you choosed to use it",
-					dev->descriptor.bcdDevice >> 8,
-					dev->descriptor.bcdDevice & 0xFF);
+					desc->bcdDevice >> 8, desc->bcdDevice & 0xFF);
 				return FALSE;
 			}
 			else
 			{
 				DEBUG_CRITICAL3("Firmware (%X.%02X) is bogus! Upgrade the reader firmware or get a new reader.",
-					dev->descriptor.bcdDevice >> 8,
-					dev->descriptor.bcdDevice & 0xFF);
+					desc->bcdDevice >> 8, desc->bcdDevice & 0xFF);
 				return TRUE;
 			}
 		}
@@ -902,7 +871,7 @@
  *
  ****************************************************************************/
 static unsigned int *get_data_rates(unsigned int reader_index,
-	struct usb_device *dev, int num)
+	struct libusb_config_descriptor *desc, int num)
 {
 	int n, i, len;
 	unsigned char buffer[256*sizeof(int)];	/* maximum is 256 records */
@@ -918,8 +887,7 @@
 	/* we got an error? */
 	if (n <= 0)
 	{
-		DEBUG_INFO2("IFD does not support GET_DATA_RATES request: %s",
-			usb_strerror());
+		DEBUG_INFO2("IFD does not support GET_DATA_RATES request: %d", n);
 		return NULL;
 	}
 
@@ -934,7 +902,7 @@
 	n /= sizeof(int);
 
 	/* we do not get the expected number of data rates */
-	len = get_ccid_usb_interface(dev, &num)->altsetting->extra[27]; /* bNumDataRatesSupported */
+	len = get_ccid_usb_interface(desc, &num)->altsetting->extra[27]; /* bNumDataRatesSupported */
 	if ((n != len) && len)
 	{
 		DEBUG_INFO3("Got %d data rates but was expecting %d", n, len);
@@ -980,9 +948,9 @@
 	if (0 == (requesttype & 0x80))
 		DEBUG_XXD("send: ", bytes, size);
 
-	ret = usb_control_msg(usbDevice[reader_index].handle, requesttype,
-		request, value, usbDevice[reader_index].interface, (char *)bytes, size,
-		usbDevice[reader_index].ccid.readTimeout);
+	ret = libusb_control_transfer(usbDevice[reader_index].dev_handle,
+		requesttype, request, value, usbDevice[reader_index].interface,
+		bytes, size, usbDevice[reader_index].ccid.readTimeout);
 
 	if (requesttype & 0x80)
 		DEBUG_XXD("receive: ", bytes, ret);
@@ -997,24 +965,25 @@
  ****************************************************************************/
 int InterruptRead(int reader_index, int timeout /* in ms */)
 {
-	int ret;
-	char buffer[8];
+	int ret, actual_length;
+	unsigned char buffer[8];
 
 	DEBUG_PERIODIC2("before (%d)", reader_index);
-	ret = usb_interrupt_read(usbDevice[reader_index].handle,
-		usbDevice[reader_index].interrupt, buffer, sizeof(buffer), timeout);
-	DEBUG_PERIODIC3("after (%d) (%s)", reader_index, usb_strerror());
+	ret = libusb_interrupt_transfer(usbDevice[reader_index].dev_handle,
+		usbDevice[reader_index].interrupt, buffer, sizeof(buffer),
+		&actual_length, timeout);
+	DEBUG_PERIODIC3("after (%d) (%d)", reader_index, ret);
 
 	if (ret < 0)
 	{
-		/* if usb_interrupt_read() times out we get EILSEQ or EAGAIN */
+		/* if libusb_interrupt_transfer() times out we get EILSEQ or EAGAIN */
 		if ((errno != EILSEQ) && (errno != EAGAIN) && (errno != ENODEV) && (errno != 0))
-			DEBUG_COMM4("usb_interrupt_read(%s/%s): %s",
-					usbDevice[reader_index].dirname,
-					usbDevice[reader_index].filename, usb_strerror());
+			DEBUG_COMM4("libusb_interrupt_transfer(%d/%d): %d",
+				usbDevice[reader_index].bus_number,
+				usbDevice[reader_index].device_address, ret);
 	}
 	else
-		DEBUG_XXD("NotifySlotChange: ", (const unsigned char *)buffer, ret);
+		DEBUG_XXD("NotifySlotChange: ", (const unsigned char *)buffer, actual_length);
 
 	return ret;
 } /* InterruptRead */

Modified: trunk/Drivers/ccid/src/ccid_usb.h
URL: http://svn.debian.org/wsvn/pcsclite/trunk/Drivers/ccid/src/ccid_usb.h?rev=4987&op=diff
==============================================================================
--- trunk/Drivers/ccid/src/ccid_usb.h (original)
+++ trunk/Drivers/ccid/src/ccid_usb.h Thu Jun 10 14:48:17 2010
@@ -35,9 +35,9 @@
 
 status_t CloseUSB(unsigned int reader_index);
 
-#include <usb.h>
-/*@null@*/ struct usb_interface *get_ccid_usb_interface(
-	struct usb_device *dev, int *num);
+#include <libusb-1.0/libusb.h>
+/*@null@*/ const struct libusb_interface *get_ccid_usb_interface(
+	struct libusb_config_descriptor *desc, int *num);
 
 int ControlUSB(int reader_index, int requesttype, int request, int value,
 	unsigned char *bytes, unsigned int size);

Modified: trunk/Drivers/ccid/src/ifdhandler.c
URL: http://svn.debian.org/wsvn/pcsclite/trunk/Drivers/ccid/src/ifdhandler.c?rev=4987&op=diff
==============================================================================
--- trunk/Drivers/ccid/src/ifdhandler.c (original)
+++ trunk/Drivers/ccid/src/ifdhandler.c Thu Jun 10 14:48:17 2010
@@ -57,7 +57,7 @@
 static int DebugInitialized = FALSE;
 
 /* local functions */
-#if HAVE_DECL_TAG_IFD_POLLING_THREAD && !defined(TWIN_SERIAL) && defined(USE_USB_INTERRUPT)
+#if !defined(TWIN_SERIAL)
 static RESPONSECODE IFDHPolling(DWORD Lun);
 static RESPONSECODE IFDHSleep(DWORD Lun);
 #endif
@@ -320,7 +320,7 @@
 } /* IFDHCloseChannel */
 
 
-#if HAVE_DECL_TAG_IFD_POLLING_THREAD && !defined(TWIN_SERIAL) && defined(USE_USB_INTERRUPT)
+#if !defined(TWIN_SERIAL)
 static RESPONSECODE IFDHPolling(DWORD Lun)
 {
 	int reader_index;
@@ -523,7 +523,7 @@
 				*(uint32_t *)Value = get_ccid_descriptor(reader_index) -> dwMaxCCIDMessageLength -10;
 			break;
 
-#if HAVE_DECL_TAG_IFD_POLLING_THREAD && !defined(TWIN_SERIAL) && defined(USE_USB_INTERRUPT)
+#if !defined(TWIN_SERIAL)
 		case TAG_IFD_POLLING_THREAD:
 			{
 				_ccid_descriptor *ccid_desc;

Modified: trunk/Drivers/ccid/src/parse.c
URL: http://svn.debian.org/wsvn/pcsclite/trunk/Drivers/ccid/src/parse.c?rev=4987&op=diff
==============================================================================
--- trunk/Drivers/ccid/src/parse.c (original)
+++ trunk/Drivers/ccid/src/parse.c Thu Jun 10 14:48:17 2010
@@ -43,8 +43,10 @@
 #define MAGENTA "\33[35m"
 #define NORMAL "\33[0m"
 
-static int ccid_parse_interface_descriptor(usb_dev_handle *handle,
-	struct usb_device *dev, int num);
+static int ccid_parse_interface_descriptor(libusb_device_handle *handle,
+	struct libusb_device_descriptor desc,
+	struct libusb_config_descriptor *config_desc,
+	int num);
 
 
 /*****************************************************************************
@@ -54,136 +56,163 @@
  ****************************************************************************/
 int main(int argc, char *argv[])
 {
-	static struct usb_bus *busses = NULL;
-	struct usb_bus *bus;
-	struct usb_dev_handle *dev_handle;
-	int nb = 0;
-	char buffer[256];
+	libusb_device **devs, *dev;
+	int nb = 0, r, i;
+	unsigned char buffer[256];
 	char class_ff = FALSE;
+	ssize_t cnt;
 
 	if ((argc > 1) && (0 == strcmp(argv[1], "-p")))
 		class_ff = TRUE;
 
-	usb_init();
-	(void)usb_find_busses();
-	(void)usb_find_devices();
-
-	busses = usb_get_busses();
-	if (busses == NULL)
-	{
-		(void)printf("No USB buses found\n");
-		return -1;
-	}
-
-	/* on any USB buses */
-	for (bus = busses; bus; bus = bus->next)
-	{
-		struct usb_device *dev;
-
-		/* any device on this bus */
-		for (dev = bus->devices; dev; dev = dev->next)
-		{
-			struct usb_interface *usb_interface = NULL;
-			int interface;
-			int num = 0;
-
-			dev_handle = usb_open(dev);
-			if (NULL == dev_handle)
+	r = libusb_init(NULL);
+	if (r < 0)
+	{
+		(void)printf("libusb_init() failed\n");
+        return r;
+	}
+
+	cnt = libusb_get_device_list(NULL, &devs);
+    if (cnt < 0)
+	{
+		(void)printf("libusb_get_device_list() failed\n");
+        return (int)cnt;
+	}
+
+	/* for every device */
+	i = 0;
+	while ((dev = devs[i++]) != NULL)
+	{
+		struct libusb_device_descriptor desc;
+		struct libusb_config_descriptor *config_desc;
+		struct libusb_device_handle *handle;
+		const struct libusb_interface *usb_interface = NULL;
+		int interface;
+		int num = 0;
+
+		r = libusb_open(dev, &handle);
+		if (r < 0)
+		{
+			(void)fprintf(stderr, "Can't libusb_open(): %s\n", strerror(errno));
+			if (getuid())
 			{
-				(void)fprintf(stderr, "Can't usb_open(%s/%s): %s\n",
-					bus->dirname, dev->filename, strerror(errno));
-				if (getuid())
-				{
-					(void)fprintf(stderr, BRIGHT_RED "Please, restart the command as root\n" NORMAL);
-					return 1;
-				}
-				continue;
+				(void)fprintf(stderr,
+					BRIGHT_RED "Please, restart the command as root\n" NORMAL);
+				return 1;
 			}
-
-			(void)fprintf(stderr, "Parsing USB bus/device: %s/%s\n",
-				bus->dirname, dev->filename);
-
-			(void)fprintf(stderr, " idVendor:  0x%04X", dev->descriptor.idVendor);
-			if (usb_get_string_simple(dev_handle, dev->descriptor.iManufacturer,
-				buffer, sizeof(buffer)) < 0)
+			continue;
+		}
+
+		r = libusb_get_device_descriptor(dev, &desc);
+        if (r < 0)
+		{
+            (void)fprintf(stderr,
+				BRIGHT_RED "failed to get device descriptor" NORMAL);
+            return 1;
+        }
+
+		(void)fprintf(stderr,
+			"Parsing USB bus/device: %04X:%04X (bus %d, device %d)\n",
+			desc.idVendor, desc.idProduct,
+            libusb_get_bus_number(dev), libusb_get_device_address(dev));
+
+		(void)fprintf(stderr, " idVendor:  0x%04X", desc.idVendor);
+		r = libusb_get_string_descriptor_ascii(handle, desc.iManufacturer,
+			buffer, sizeof(buffer));
+		if (r < 0)
+		{
+			(void)fprintf(stderr, "  Can't get iManufacturer string\n");
+			if (getuid())
 			{
-				(void)fprintf(stderr, "  Can't get iManufacturer string\n");
-				if (getuid())
-				{
-					(void)fprintf(stderr, BRIGHT_RED "Please, restart the command as root\n" NORMAL);
-					return 1;
-				}
+				(void)fprintf(stderr,
+					BRIGHT_RED "Please, restart the command as root\n" NORMAL);
+				return 1;
 			}
-			else
-				(void)fprintf(stderr, "  iManufacturer: " BLUE "%s\n" NORMAL, buffer);
-
-			(void)fprintf(stderr, " idProduct: 0x%04X", dev->descriptor.idProduct);
-			if (usb_get_string_simple(dev_handle, dev->descriptor.iProduct,
-				buffer, sizeof(buffer)) < 0)
-				(void)fprintf(stderr, "  Can't get iProduct string\n");
-			else
-				(void)fprintf(stderr, "  iProduct: " BLUE "%s\n" NORMAL, buffer);
+		}
+		else
+			(void)fprintf(stderr,
+				"  iManufacturer: " BLUE "%s\n" NORMAL, buffer);
+
+		(void)fprintf(stderr, " idProduct: 0x%04X", desc.idProduct);
+		r = libusb_get_string_descriptor_ascii(handle, desc.iProduct,
+			buffer, sizeof(buffer));
+		if (r < 0)
+			(void)fprintf(stderr, "  Can't get iProduct string\n");
+		else
+			(void)fprintf(stderr, "  iProduct: " BLUE "%s\n" NORMAL, buffer);
 
 again:
-			/* check if the device has bInterfaceClass == 11 */
-			usb_interface = get_ccid_usb_interface(dev, &num);
-			if (NULL == usb_interface)
+		/* check if the device has bInterfaceClass == 11 */
+		r = libusb_get_active_config_descriptor(dev, &config_desc);
+
+		usb_interface = get_ccid_usb_interface(config_desc, &num);
+		if (NULL == usb_interface)
+		{
+			(void)libusb_close(handle);
+			/* only if we found no CCID interface */
+			if (0 == num)
+				(void)fprintf(stderr, RED "  NOT a CCID/ICCD device\n" NORMAL);
+			continue;
+		}
+		if (!class_ff && (0xFF == usb_interface->altsetting->bInterfaceClass))
+		{
+			(void)fprintf(stderr, MAGENTA "  Found a possibly CCID/ICCD device (bInterfaceClass = 0xFF). Use -p\n" NORMAL);
+			continue;
+		}
+		(void)fprintf(stderr,
+			GREEN "  Found a CCID/ICCD device at interface %d\n" NORMAL, num);
+
+		/* now we found a free reader and we try to use it */
+#if 0
+		if (NULL == dev->config)
+		{
+			(void)libusb_close(handle);
+			(void)fprintf(stderr, "No dev->config found for %s/%s\n",
+					bus->dirname, dev->filename);
+			continue;
+		}
+#endif
+
+		interface = usb_interface->altsetting->bInterfaceNumber;
+#ifndef __APPLE__
+		r = libusb_claim_interface(handle, interface);
+		if (r < 0)
+		{
+			(void)fprintf(stderr,
+				"Can't claim interface (bus %d, device %d): %s\n",
+				libusb_get_bus_number(dev), libusb_get_device_address(dev),
+				strerror(errno));
+			(void)libusb_close(handle);
+
+			if (EBUSY == errno)
 			{
-				(void)usb_close(dev_handle);
-				/* only if we found no CCID interface */
-				if (0 == num)
-					(void)fprintf(stderr, RED "  NOT a CCID/ICCD device\n" NORMAL);
-				continue;
+				(void)fprintf(stderr,
+					BRIGHT_RED " Please, stop pcscd and retry\n\n" NORMAL);
+				return TRUE;
 			}
-			if (!class_ff && (0xFF == usb_interface->altsetting->bInterfaceClass))
-			{
-				(void)fprintf(stderr, MAGENTA "  Found a possibly CCID/ICCD device (bInterfaceClass = 0xFF). Use -p\n" NORMAL);
-				continue;
-			}
-			(void)fprintf(stderr, GREEN "  Found a CCID/ICCD device at interface %d\n" NORMAL, num);
-
-			/* now we found a free reader and we try to use it */
-			if (NULL == dev->config)
-			{
-				(void)usb_close(dev_handle);
-				(void)fprintf(stderr, "No dev->config found for %s/%s\n",
-					 bus->dirname, dev->filename);
-				continue;
-			}
-
-			interface = usb_interface->altsetting->bInterfaceNumber;
+			continue;
+		}
+#endif
+
+		(void)ccid_parse_interface_descriptor(handle, desc, config_desc, num);
+
 #ifndef __APPLE__
-			if (usb_claim_interface(dev_handle, interface) < 0)
-			{
-				(void)usb_close(dev_handle);
-				(void)fprintf(stderr, "Can't claim interface %s/%s: %s\n",
-						bus->dirname, dev->filename, strerror(errno));
-				if (EBUSY == errno)
-				{
-					(void)fprintf(stderr,
-						BRIGHT_RED " Please, stop pcscd and retry\n\n" NORMAL);
-					return TRUE;
-				}
-				continue;
-			}
+		(void)libusb_release_interface(handle, interface);
 #endif
-
-			(void)ccid_parse_interface_descriptor(dev_handle, dev, num);
-
-#ifndef __APPLE__
-			(void)usb_release_interface(dev_handle, interface);
-#endif
-			/* check for another CCID interface on the same device */
-			num++;
-			goto again;
-
-			(void)usb_close(dev_handle);
-			nb++;
-		}
+		/* check for another CCID interface on the same device */
+		num++;
+		goto again;
+
+		(void)libusb_close(handle);
+		nb++;
 	}
 
 	if ((0 == nb) && (0 != geteuid()))
-		(void)fprintf(stderr, "Can't find any CCID device.\nMaybe you must run parse as root?\n");
+		(void)fprintf(stderr,
+			"Can't find any CCID device.\nMaybe you must run parse as root?\n");
+
+	libusb_exit(NULL);
+
 	return 0;
 } /* main */
 
@@ -193,21 +222,23 @@
  *					Parse a CCID USB Descriptor
  *
  ****************************************************************************/
-static int ccid_parse_interface_descriptor(usb_dev_handle *handle,
-	struct usb_device *dev, int num)
+static int ccid_parse_interface_descriptor(libusb_device_handle *handle,
+	struct libusb_device_descriptor desc, 
+	struct libusb_config_descriptor *config_desc,
+	int num)
 {
-	struct usb_interface_descriptor *usb_interface;
-	unsigned char *extra;
-	char buffer[256*sizeof(int)];  /* maximum is 256 records */
-	/* unsigned version of buffer[] used for multi-bytes conversions */
-	unsigned char *ubuffer = (unsigned char *)buffer;
+	const struct libusb_interface_descriptor *usb_interface;
+	const unsigned char *extra;
+	unsigned char buffer[256*sizeof(int)];  /* maximum is 256 records */
+	int r;
 
 	/*
 	 * Vendor/model name
 	 */
-	(void)printf(" idVendor: 0x%04X\n", dev->descriptor.idVendor);
-	if (usb_get_string_simple(handle, dev->descriptor.iManufacturer,
-		buffer, sizeof(buffer)) < 0)
+	(void)printf(" idVendor: 0x%04X\n", desc.idVendor);
+	r = libusb_get_string_descriptor_ascii(handle, desc.iManufacturer,
+		buffer, sizeof(buffer));
+	if (r < 0)
 	{
 		(void)printf("  Can't get iManufacturer string\n");
 		if (getuid())
@@ -220,17 +251,18 @@
 	else
 		(void)printf("  iManufacturer: %s\n", buffer);
 
-	(void)printf(" idProduct: 0x%04X\n", dev->descriptor.idProduct);
-	if (usb_get_string_simple(handle, dev->descriptor.iProduct,
-		buffer, sizeof(buffer)) < 0)
+	(void)printf(" idProduct: 0x%04X\n", desc.idProduct);
+	r =  libusb_get_string_descriptor_ascii(handle, desc.iProduct,
+		buffer, sizeof(buffer));
+	if (r < 0)
 		(void)printf("  Can't get iProduct string\n");
 	else
 		(void)printf("  iProduct: %s\n", buffer);
 
 	(void)printf(" bcdDevice: %X.%02X (firmware release?)\n",
-		dev->descriptor.bcdDevice >> 8, dev->descriptor.bcdDevice & 0xFF);
-
-	usb_interface = get_ccid_usb_interface(dev, &num)->altsetting;
+		desc.bcdDevice >> 8, desc.bcdDevice & 0xFF);
+
+	usb_interface = get_ccid_usb_interface(config_desc, &num)->altsetting;
 
 	(void)printf(" bLength: %d\n", usb_interface->bLength);
 
@@ -271,11 +303,13 @@
 			(void)printf("  Class is 0xFF (proprietary)\n");
 	}
 
-	(void)printf(" bInterfaceSubClass: %d\n", usb_interface->bInterfaceSubClass);
+	(void)printf(" bInterfaceSubClass: %d\n",
+		usb_interface->bInterfaceSubClass);
 	if (usb_interface->bInterfaceSubClass)
 		(void)printf("  UNSUPPORTED SubClass\n");
 
-	(void)printf(" bInterfaceProtocol: %d\n", usb_interface->bInterfaceProtocol);
+	(void)printf(" bInterfaceProtocol: %d\n",
+		usb_interface->bInterfaceProtocol);
 	switch (usb_interface->bInterfaceProtocol)
 	{
 		case 0:
@@ -291,15 +325,17 @@
 			(void)printf("  UNSUPPORTED InterfaceProtocol\n");
 	}
 
-	if (usb_get_string_simple(handle, usb_interface->iInterface,
-		buffer, sizeof(buffer)) < 0)
+	r = libusb_get_string_descriptor_ascii(handle, usb_interface->iInterface,
+		buffer, sizeof(buffer));
+	if (r < 0)
 		(void)printf(" Can't get iInterface string\n");
 	else
 		(void)printf(" iInterface: %s\n", buffer);
 
-	if (usb_interface->extralen < 54)
-	{
-		(void)printf("USB extra length is too short: %d\n", usb_interface->extralen);
+	if (usb_interface->extra_length < 54)
+	{
+		(void)printf("USB extra length is too short: %d\n",
+			usb_interface->extra_length);
 		(void)printf("\n  NOT A CCID DEVICE\n");
 		return TRUE;
 	}
@@ -354,7 +390,7 @@
 		int n;
 
 		/* See CCID 3.7.2 page 25 */
-		n = usb_control_msg(handle,
+		n = libusb_control_transfer(handle,
 			0xA1, /* request type */
 			0x02, /* GET CLOCK FREQUENCIES */
 			0x00, /* value */
@@ -393,7 +429,7 @@
 				}
 
 				for (i=0; i<n; i+=4)
-					(void)printf("   Support %d kHz\n", dw2i(ubuffer, i));
+					(void)printf("   Support %d kHz\n", dw2i(buffer, i));
 			}
 	}
 	(void)printf("  dwDataRate: %d bps\n", dw2i(extra, 19));
@@ -404,7 +440,7 @@
 		int n;
 
 		/* See CCID 3.7.3 page 25 */
-		n = usb_control_msg(handle,
+		n = libusb_control_transfer(handle,
 			0xA1, /* request type */
 			0x03, /* GET DATA RATES */
 			0x00, /* value */
@@ -436,7 +472,7 @@
 				}
 
 				for (i=0; i<n; i+=4)
-					(void)printf("   Support %d bps\n", dw2i(ubuffer, i));
+					(void)printf("   Support %d bps\n", dw2i(buffer, i));
 			}
 	}
 	(void)printf("  dwMaxIFSD: %d\n", dw2i(extra, 28));




More information about the Pcsclite-cvs-commit mailing list