[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