[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