[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