From 8743a58e737672b85f7502267bb48dfd82298e8f Mon Sep 17 00:00:00 2001 From: Baptiste MORAINE Date: Fri, 20 Oct 2023 13:37:25 +0200 Subject: [PATCH] COMPOSITE_AS_MULTISLOT : Add Kapelse readers --- src/ccid.h | 3 +++ src/ccid_usb.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/src/ccid.h b/src/ccid.h index a705a17c..f99a631f 100644 --- a/src/ccid.h +++ b/src/ccid.h @@ -261,7 +261,10 @@ typedef struct #define ACS_ACR1252 0x072F223B #define ACS_ACR1252IMP 0x072F2259 #define ACS_ACR1552 0x072F2303 +#define KAPELSE_KAPLIN2 0x29470105 +#define KAPELSE_KAPECV 0x29470112 +#define VENDOR_KAPELSE 0x2947 #define VENDOR_GEMALTO 0x08E6 #define GET_VENDOR(readerID) ((readerID >> 16) & 0xFFFF) diff --git a/src/ccid_usb.c b/src/ccid_usb.c index f0a9b226..81c3d2a1 100644 --- a/src/ccid_usb.c +++ b/src/ccid_usb.c @@ -644,6 +644,39 @@ status_t OpenUSBByName(unsigned int reader_index, /*@null@*/ char *device) } #endif +#ifdef USE_COMPOSITE_AS_MULTISLOT + if (VENDOR_KAPELSE == GET_VENDOR(readerID)) + { + switch (readerID) + { + case KAPELSE_KAPECV : + /* KAP-eCV : only first interface is a ccid one */ + max_interface_number=0; + DEBUG_INFO1("Kapelse reader forced as monoslot!"); + break; + + case KAPELSE_KAPLIN2 : + /* KAP&LINK2 : only 3 first interfaces are ccid ones */ + if(config_desc->bNumInterfaces > 3) + { + max_interface_number=2; + DEBUG_INFO1("Kapelse reader restricted as multislot with 3 slots!"); + } + else + { + max_interface_number=config_desc->bNumInterfaces-1; + DEBUG_INFO2("Kapelse reader forced as multislot with %d slots!",max_interface_number+1); + } + break; + + default : + /* Kapelse : all interfaces are ccid ones */ + max_interface_number=config_desc->bNumInterfaces-1; + DEBUG_INFO2("Kapelse reader forced as multislot with %d slots!",max_interface_number+1); + break; + } + } +#endif usb_interface = get_ccid_usb_interface(config_desc, &num); if (usb_interface == NULL) @@ -723,6 +756,7 @@ status_t OpenUSBByName(unsigned int reader_index, /*@null@*/ char *device) || (ACS_ACR1252 == readerID) || (ACS_ACR1252IMP == readerID) || (ACS_ACR1552 == readerID) + || (VENDOR_KAPELSE == GET_VENDOR(readerID)) || (FEITIANR502DUAL == readerID)) { /* use the next interface for the next "slot" */