[Pcsclite-cvs-commit] r6964 - in trunk/Drivers/ccid/src: . towitoko

ludovic.rousseau at free.fr ludovic.rousseau at free.fr
Tue Aug 26 09:21:53 UTC 2014


Author: rousseau
Date: 2014-08-26 09:21:53 +0000 (Tue, 26 Aug 2014)
New Revision: 6964

Modified:
   trunk/Drivers/ccid/src/ifdhandler.c
   trunk/Drivers/ccid/src/towitoko/atr.c
   trunk/Drivers/ccid/src/towitoko/atr.h
Log:
ATR_GetDefaultProtocol() also returns the available protocols

Add a new parameter int *availableProtocols to return the available
protocols as defined in the ATR.

This is needed for the UEFI driver. Getting the available protocols is
done by pcsc-lite but pcsc-lite is not used on UEFI.


Modified: trunk/Drivers/ccid/src/ifdhandler.c
===================================================================
--- trunk/Drivers/ccid/src/ifdhandler.c	2014-08-26 09:16:51 UTC (rev 6963)
+++ trunk/Drivers/ccid/src/ifdhandler.c	2014-08-26 09:21:53 UTC (rev 6964)
@@ -884,7 +884,7 @@
 	{
 		int default_protocol;
 
-		ATR_GetDefaultProtocol(&atr, &default_protocol);
+		ATR_GetDefaultProtocol(&atr, &default_protocol, NULL);
 
 		/* if the requested protocol is not the default one
 		 * or a TA1/PPS1 is present */

Modified: trunk/Drivers/ccid/src/towitoko/atr.c
===================================================================
--- trunk/Drivers/ccid/src/towitoko/atr.c	2014-08-26 09:16:51 UTC (rev 6963)
+++ trunk/Drivers/ccid/src/towitoko/atr.c	2014-08-26 09:21:53 UTC (rev 6964)
@@ -317,25 +317,38 @@
  * It was rewritten by Ludovic Rousseau, 2004
  */
 #define PROTOCOL_UNSET -1
-int ATR_GetDefaultProtocol(ATR_t * atr, int *protocol)
+int ATR_GetDefaultProtocol(ATR_t * atr, int *protocol, int *availableProtocols)
 {
 	int i;
 
 	/* default value */
 	*protocol = PROTOCOL_UNSET;
+	if (availableProtocols)
+		*availableProtocols = 0;
 
 	for (i=0; i<ATR_MAX_PROTOCOLS; i++)
-		if (atr->ib[i][ATR_INTERFACE_BYTE_TD].present && (PROTOCOL_UNSET == *protocol))
+		if (atr->ib[i][ATR_INTERFACE_BYTE_TD].present)
 		{
-			/* set to the first protocol byte found */
-			*protocol = atr->ib[i][ATR_INTERFACE_BYTE_TD].value & 0x0F;
-			DEBUG_COMM2("default protocol: T=%d", *protocol);
+			int T = atr->ib[i][ATR_INTERFACE_BYTE_TD].value & 0x0F;
+
+			DEBUG_COMM2("T=%d Protocol Found", T);
+			if (availableProtocols)
+				*availableProtocols |= 1 << T;
+
+			if (PROTOCOL_UNSET == *protocol)
+			{
+				/* set to the first protocol byte found */
+				*protocol = T;
+				DEBUG_COMM2("default protocol: T=%d", *protocol);
+			}
 		}
 
 	/* specific mode if TA2 present */
 	if (atr->ib[1][ATR_INTERFACE_BYTE_TA].present)
 	{
 		*protocol = atr->ib[1][ATR_INTERFACE_BYTE_TA].value & 0x0F;
+		if (availableProtocols)
+			*availableProtocols = 1 << *protocol;
 		DEBUG_COMM2("specific mode found: T=%d", *protocol);
 	}
 
@@ -343,6 +356,8 @@
 	{
 		DEBUG_INFO1("no default protocol found in ATR. Using T=0");
 		*protocol = ATR_PROTOCOL_TYPE_T0;
+		if (availableProtocols)
+			*availableProtocols = 1 << *protocol;
 	}
 
 	return ATR_OK;

Modified: trunk/Drivers/ccid/src/towitoko/atr.h
===================================================================
--- trunk/Drivers/ccid/src/towitoko/atr.h	2014-08-26 09:16:51 UTC (rev 6963)
+++ trunk/Drivers/ccid/src/towitoko/atr.h	2014-08-26 09:21:53 UTC (rev 6964)
@@ -101,7 +101,7 @@
 
 /* General smartcard characteristics */
 extern int ATR_GetConvention(ATR_t * atr, /*@out@*/ int *convention);
-extern int ATR_GetDefaultProtocol(ATR_t * atr, /*@out@*/ int *protocol);
+extern int ATR_GetDefaultProtocol(ATR_t * atr, /*@out@*/ int *protocol, int *availableProtocols);
 
 /* ATR parameters and integer values */
 extern int ATR_GetIntegerValue(ATR_t * atr, int name, BYTE * value);




More information about the Pcsclite-cvs-commit mailing list