[Pcsclite-cvs-commit] r3348 - in /trunk/Drivers/ccid/src: ccid_usb.c ccid_usb.h parse.c

rousseau at users.alioth.debian.org rousseau at users.alioth.debian.org
Tue Mar 17 09:42:40 UTC 2009


Author: rousseau
Date: Tue Mar 17 09:42:40 2009
New Revision: 3348

URL: http://svn.debian.org/wsvn/pcsclite/?sc=1&rev=3348
Log:
allow to list more than one CCID interface per USB device

Modified:
    trunk/Drivers/ccid/src/ccid_usb.c
    trunk/Drivers/ccid/src/ccid_usb.h
    trunk/Drivers/ccid/src/parse.c

Modified: trunk/Drivers/ccid/src/ccid_usb.c
URL: http://svn.debian.org/wsvn/pcsclite/trunk/Drivers/ccid/src/ccid_usb.c?rev=3348&op=diff
==============================================================================
--- trunk/Drivers/ccid/src/ccid_usb.c (original)
+++ trunk/Drivers/ccid/src/ccid_usb.c Tue Mar 17 09:42:40 2009
@@ -84,10 +84,10 @@
 /* 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);
+static int get_end_points(struct usb_device *dev, _usbDevice *usbdevice, int num);
 int ccid_check_firmware(struct usb_device *dev);
 static unsigned int *get_data_rates(unsigned int reader_index,
-	struct usb_device *dev);
+	struct usb_device *dev, int num);
 
 /* ne need to initialize to 0 since it is static */
 static _usbDevice usbDevice[CCID_DRIVER_MAX_READERS];
@@ -305,6 +305,7 @@
 					int r, already_used;
 					struct usb_interface *usb_interface = NULL;
 					int interface;
+					int num = 0;
 
 					/* is it already opened? */
 					already_used = FALSE;
@@ -380,7 +381,7 @@
 						return STATUS_UNSUCCESSFUL;
 					}
 
-					usb_interface = get_ccid_usb_interface(dev);
+					usb_interface = get_ccid_usb_interface(dev, &num);
 					if (usb_interface == NULL)
 					{
 						(void)usb_close(dev_handle);
@@ -419,7 +420,7 @@
 					}
 
 					/* Get Endpoints values*/
-					(void)get_end_points(dev, &usbDevice[reader_index]);
+					(void)get_end_points(dev, &usbDevice[reader_index], num);
 
 					/* store device information */
 					usbDevice[reader_index].handle = dev_handle;
@@ -444,7 +445,7 @@
 					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);
+					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;
@@ -625,11 +626,12 @@
  *					get_end_points
  *
  ****************************************************************************/
-static int get_end_points(struct usb_device *dev, _usbDevice *usbdevice)
+static int get_end_points(struct usb_device *dev, _usbDevice *usbdevice,
+	int num)
 {
 	int i;
 	int bEndpointAddress;
-	struct usb_interface *usb_interface = get_ccid_usb_interface(dev);
+	struct usb_interface *usb_interface = get_ccid_usb_interface(dev, &num);
 
 	/*
 	 * 3 Endpoints maximum: Interrupt In, Bulk In, Bulk Out
@@ -664,7 +666,8 @@
  *					get_ccid_usb_interface
  *
  ****************************************************************************/
-/*@null@*/ EXTERNAL struct usb_interface * get_ccid_usb_interface(struct usb_device *dev)
+/*@null@*/ EXTERNAL struct usb_interface * get_ccid_usb_interface(
+	struct usb_device *dev, int *num)
 {
 	struct usb_interface *usb_interface = NULL;
 	int i;
@@ -673,7 +676,7 @@
 #endif
 
 	/* if multiple interfaces use the first one with CCID class type */
-	for (i=0; dev->config && i<dev->config->bNumInterfaces; i++)
+	for (i = *num; dev->config && i<dev->config->bNumInterfaces; i++)
 	{
 		/* CCID Class? */
 		if (dev->config->interface[i].altsetting->bInterfaceClass == 0xb
@@ -683,6 +686,8 @@
 			)
 		{
 			usb_interface = &dev->config->interface[i];
+			/* store the interface number for further reference */
+			*num = i;
 			break;
 		}
 	}
@@ -694,18 +699,19 @@
 		|| (REINER_SCT == readerID) || (BLUDRIVEII_CCID == readerID))
 		&& (0 == usb_interface->altsetting->extralen)) /* this is the bug */
 	{
-		for (i=0; i<usb_interface->altsetting->bNumEndpoints; i++)
+		int j;
+		for (j=0; j<usb_interface->altsetting->bNumEndpoints; j++)
 		{
 			/* find the extra[] array */
-			if (54 == usb_interface->altsetting->endpoint[i].extralen)
+			if (54 == usb_interface->altsetting->endpoint[j].extralen)
 			{
 				/* get the extra[] from the endpoint */
 				usb_interface->altsetting->extralen = 54;
 				usb_interface->altsetting->extra =
-					usb_interface->altsetting->endpoint[i].extra;
+					usb_interface->altsetting->endpoint[j].extra;
 				/* avoid double free on close */
-				usb_interface->altsetting->endpoint[i].extra = NULL;
-				usb_interface->altsetting->endpoint[i].extralen = 0;
+				usb_interface->altsetting->endpoint[j].extra = NULL;
+				usb_interface->altsetting->endpoint[j].extralen = 0;
 				break;
 			}
 		}
@@ -764,7 +770,7 @@
  *
  ****************************************************************************/
 static unsigned int *get_data_rates(unsigned int reader_index,
-	struct usb_device *dev)
+	struct usb_device *dev, int num)
 {
 	int n, i, len;
 	unsigned char buffer[256*sizeof(int)];	/* maximum is 256 records */
@@ -796,7 +802,7 @@
 	n /= sizeof(int);
 
 	/* we do not get the expected number of data rates */
-	len = get_ccid_usb_interface(dev)->altsetting->extra[27]; /* bNumDataRatesSupported */
+	len = get_ccid_usb_interface(dev, &num)->altsetting->extra[27]; /* bNumDataRatesSupported */
 	if ((n != len) && len)
 	{
 		DEBUG_INFO3("Got %d data rates but was expecting %d", n, len);

Modified: trunk/Drivers/ccid/src/ccid_usb.h
URL: http://svn.debian.org/wsvn/pcsclite/trunk/Drivers/ccid/src/ccid_usb.h?rev=3348&op=diff
==============================================================================
--- trunk/Drivers/ccid/src/ccid_usb.h (original)
+++ trunk/Drivers/ccid/src/ccid_usb.h Tue Mar 17 09:42:40 2009
@@ -36,7 +36,8 @@
 status_t CloseUSB(unsigned int reader_index);
 
 #if defined (__USB_H__) || defined (_SYS_USB_LIBUSB_USB_H)
-/*@null@*/ struct usb_interface *get_ccid_usb_interface(struct usb_device *dev);
+/*@null@*/ struct usb_interface *get_ccid_usb_interface(
+	struct usb_device *dev, int *num);
 #endif
 
 int ControlUSB(int reader_index, int requesttype, int request, int value,

Modified: trunk/Drivers/ccid/src/parse.c
URL: http://svn.debian.org/wsvn/pcsclite/trunk/Drivers/ccid/src/parse.c?rev=3348&op=diff
==============================================================================
--- trunk/Drivers/ccid/src/parse.c (original)
+++ trunk/Drivers/ccid/src/parse.c Tue Mar 17 09:42:40 2009
@@ -45,7 +45,7 @@
 #define NORMAL "\33[0m"
 
 static int ccid_parse_interface_descriptor(usb_dev_handle *handle,
-	struct usb_device *dev);
+	struct usb_device *dev, int num);
 
 
 /*****************************************************************************
@@ -86,6 +86,7 @@
 		{
 			struct usb_interface *usb_interface = NULL;
 			int interface;
+			int num = 0;
 
 			dev_handle = usb_open(dev);
 			if (NULL == dev_handle)
@@ -124,12 +125,15 @@
 			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);
+			usb_interface = get_ccid_usb_interface(dev, &num);
 			if (NULL == usb_interface)
 			{
 				(void)usb_close(dev_handle);
-				(void)fprintf(stderr, RED "  NOT a CCID/ICCD device\n" NORMAL);
+				/* 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))
@@ -137,7 +141,7 @@
 				(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\n" NORMAL);
+			(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)
@@ -165,11 +169,15 @@
 			}
 #endif
 
-			(void)ccid_parse_interface_descriptor(dev_handle, dev);
+			(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++;
 		}
@@ -187,7 +195,7 @@
  *
  ****************************************************************************/
 static int ccid_parse_interface_descriptor(usb_dev_handle *handle,
-	struct usb_device *dev)
+	struct usb_device *dev, int num)
 {
 	struct usb_interface_descriptor *usb_interface;
 	unsigned char *extra;
@@ -223,7 +231,7 @@
 	(void)printf(" bcdDevice: %X.%02X (firmware release?)\n",
 		dev->descriptor.bcdDevice >> 8, dev->descriptor.bcdDevice & 0xFF);
 
-	usb_interface = get_ccid_usb_interface(dev)->altsetting;
+	usb_interface = get_ccid_usb_interface(dev, &num)->altsetting;
 
 	(void)printf(" bLength: %d\n", usb_interface->bLength);
 




More information about the Pcsclite-cvs-commit mailing list