[Pcsclite-cvs-commit] r5621 - /trunk/PCSC/src/hotplug_libusb.c

rousseau at users.alioth.debian.org rousseau at users.alioth.debian.org
Mon Feb 21 15:05:40 UTC 2011


Author: rousseau
Date: Mon Feb 21 15:05:38 2011
New Revision: 5621

URL: http://svn.debian.org/wsvn/pcsclite/?sc=1&rev=5621
Log:
If a device has more than one CCID interface the "libhal:" naming scheme
(with the interface number included) is used instead of "libusb:".

The new mechanism allows to use multi-interfaces devices like the
Gemalto ProxDU also with hotplug_libusb. libhal is deprecated and may
not be available everywhere.

Thanks to Diego Elio Pettenò for the patch (for Gentoo)

Modified:
    trunk/PCSC/src/hotplug_libusb.c

Modified: trunk/PCSC/src/hotplug_libusb.c
URL: http://svn.debian.org/wsvn/pcsclite/trunk/PCSC/src/hotplug_libusb.c?rev=5621&op=diff
==============================================================================
--- trunk/PCSC/src/hotplug_libusb.c (original)
+++ trunk/PCSC/src/hotplug_libusb.c Mon Feb 21 15:05:38 2011
@@ -47,8 +47,8 @@
 #undef DEBUG_HOTPLUG
 #define ADD_SERIAL_NUMBER
 
-/* format is "%d:%d", bus_number, device_address */
-#define BUS_DEVICE_STRSIZE	10+1+10+1
+/* format is "%d:%d:%d", bus_number, device_address, interface */
+#define BUS_DEVICE_STRSIZE	10+1+10+1+10+1
 
 #define READER_ABSENT		0
 #define READER_PRESENT		1
@@ -98,7 +98,8 @@
 
 static LONG HPAddHotPluggable(struct libusb_device *dev,
 	struct libusb_device_descriptor desc,
-	const char bus_device[], struct _driverTracker *driver);
+	const char bus_device[], int interface,
+	struct _driverTracker *driver);
 static LONG HPRemoveHotPluggable(int reader_index);
 
 static LONG HPReadBundleValues(void)
@@ -276,6 +277,7 @@
 	while ((dev = devs[cnt++]) != NULL)
 	{
 		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);
 
@@ -283,6 +285,14 @@
 		if (r < 0)
 		{
 			Log3(PCSC_LOG_ERROR, "failed to get device descriptor for %d/%d",
+				bus_number, device_address);
+			continue;
+		}
+
+		r = libusb_get_active_config_descriptor(dev, &config_desc);
+		if (r < 0)
+		{
+			Log3(PCSC_LOG_ERROR, "failed to get device config for %d/%d",
 				bus_number, device_address);
 			continue;
 		}
@@ -294,38 +304,53 @@
 				desc.idVendor == driverTracker[i].manuID &&
 				desc.idProduct == driverTracker[i].productID)
 			{
-				int newreader;
-
-				/* A known device has been found */
-				snprintf(bus_device, BUS_DEVICE_STRSIZE, "%d:%d",
+				int interface;
+
+#ifdef DEBUG_HOTPLUG
+				Log3(PCSC_LOG_DEBUG, "Found matching USB device: %d:%d",
 					bus_number, device_address);
-				bus_device[BUS_DEVICE_STRSIZE - 1] = '\0';
+#endif
+
+				for (interface = 0; interface < config_desc->bNumInterfaces;
+					interface++)
+				{
+					int newreader;
+
+					/* A known device has been found */
+					snprintf(bus_device, BUS_DEVICE_STRSIZE, "%d:%d:%d",
+						 bus_number, device_address, interface);
+					bus_device[BUS_DEVICE_STRSIZE - 1] = '\0';
+					newreader = TRUE;
+
+					/* Check if the reader is a new one */
+					for (j=0; j<PCSCLITE_MAX_READERS_CONTEXTS; j++)
+					{
+						if (strncmp(readerTracker[j].bus_device,
+							bus_device, BUS_DEVICE_STRSIZE) == 0)
+						{
+							/* The reader is already known */
+							readerTracker[j].status = READER_PRESENT;
+							newreader = FALSE;
 #ifdef DEBUG_HOTPLUG
-				Log2(PCSC_LOG_DEBUG, "Found matching USB device: %s",
-					bus_device);
-#endif
-				newreader = TRUE;
-
-				/* Check if the reader is a new one */
-				for (j=0; j<PCSCLITE_MAX_READERS_CONTEXTS; j++)
-				{
-					if (strncmp(readerTracker[j].bus_device,
-						bus_device, BUS_DEVICE_STRSIZE) == 0)
+							Log2(PCSC_LOG_DEBUG, "Refresh USB device: %s",
+								bus_device);
+#endif
+							break;
+						}
+					}
+
+					/* New reader found */
+					if (newreader)
 					{
-						/* The reader is already known */
-						readerTracker[j].status = READER_PRESENT;
-						newreader = FALSE;
-#ifdef DEBUG_HOTPLUG
-						Log2(PCSC_LOG_DEBUG, "Refresh USB device: %s",
-							bus_device);
-#endif
-						break;
+						printf("POUET %d\n", config_desc->bNumInterfaces);
+						if (config_desc->bNumInterfaces > 1)
+							HPAddHotPluggable(dev, desc, bus_device,
+								interface, &driverTracker[i]);
+							else
+							HPAddHotPluggable(dev, desc, bus_device,
+								-1, &driverTracker[i]);
 					}
 				}
-
-				/* New reader found */
-				if (newreader)
-					HPAddHotPluggable(dev, desc, bus_device, &driverTracker[i]);
 			}
 		}
 	}
@@ -470,15 +495,22 @@
 
 static LONG HPAddHotPluggable(struct libusb_device *dev,
 	struct libusb_device_descriptor desc,
-	const char bus_device[], struct _driverTracker *driver)
+	const char bus_device[], int interface,
+	struct _driverTracker *driver)
 {
 	int i;
 	char deviceName[MAX_DEVICENAME];
 
 	Log2(PCSC_LOG_INFO, "Adding USB device: %s", bus_device);
 
-	snprintf(deviceName, sizeof(deviceName), "usb:%04x/%04x:libusb-1.0:%s",
-		desc.idVendor, desc.idProduct, bus_device);
+	if (interface >= 0)
+		snprintf(deviceName, sizeof(deviceName), "usb:%04x/%04x:libhal:/org/freedesktop/Hal/devices/usb_device_%04x_%04x_serialnotneeded_if%d",
+			 desc.idVendor, desc.idProduct, desc.idVendor, desc.idProduct,
+			 interface);
+	else
+		snprintf(deviceName, sizeof(deviceName), "usb:%04x/%04x:libusb-1.0:%s",
+			desc.idVendor, desc.idProduct, bus_device);
+
 	deviceName[sizeof(deviceName) -1] = '\0';
 
 	pthread_mutex_lock(&usbNotifierMutex);




More information about the Pcsclite-cvs-commit mailing list