[Pcsclite-cvs-commit] CVS Drivers/ccid/src

CVS User rousseau ludovic.rousseau@free.fr
Tue, 26 Apr 2005 14:30:39 +0000


Update of /cvsroot/pcsclite/Drivers/ccid/src
In directory haydn:/tmp/cvs-serv14779

Modified Files:
	ifdhandler.c 
Log Message:
add T0_card_timeout() and T1_card_timeout()


--- /cvsroot/pcsclite/Drivers/ccid/src/ifdhandler.c	2005/04/26 13:46:07	1.67
+++ /cvsroot/pcsclite/Drivers/ccid/src/ifdhandler.c	2005/04/26 14:30:38	1.68
@@ -17,7 +17,7 @@
     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
 */
 
-/* $Id: ifdhandler.c,v 1.67 2005/04/26 13:46:07 rousseau Exp $ */
+/* $Id: ifdhandler.c,v 1.68 2005/04/26 14:30:38 rousseau Exp $ */
 
 #include <stdio.h>
 #include <string.h>
@@ -56,6 +56,9 @@
 static void init_driver(void);
 static void extra_egt(ATR_t *atr, _ccid_descriptor *ccid_desc, DWORD Protocol);
 static char find_baud_rate(unsigned int baudrate, unsigned int *list);
+static unsigned int T0_card_timeout(double f, int TC2, int clock_frequency);
+static unsigned int T1_card_timeout(double f, double d, int BWI,
+	int clock_frequency);
 
 
 RESPONSECODE IFDHCreateChannelByName(DWORD Lun, LPTSTR lpcDevice)
@@ -1119,3 +1122,52 @@
 	return FALSE;
 } /* find_baud_rate */
 
+
+static unsigned int T0_card_timeout(double f, int TC2, int clock_frequency)
+{
+	unsigned int timeout = DEFAULT_COM_READ_TIMEOUT;
+	unsigned int t;
+
+	/* card WWT */
+	/* see ch. 8.2 Character level, page 15 of ISO 7816-3 */
+	t = 960 * TC2 * f / (clock_frequency * 1000);
+
+	/* use the bigest one */
+	if (t > timeout)
+		timeout = t;
+
+	/* default WWT (TC2=0x0A) */
+	t = 960 * 0x0A * f / (clock_frequency * 1000);
+
+	/* use the bigest one */
+	if (t > timeout)
+		timeout = t;
+
+	return timeout;
+} /* T0_card_timeout  */
+
+
+static unsigned int T1_card_timeout(double f, double d, int BWI,
+	int clock_frequency)
+{
+	unsigned int timeout = DEFAULT_COM_READ_TIMEOUT;
+	unsigned int t;
+
+	/* card BWT */
+	/* see ch. 9.5.3.2 Block waiting time, page 20 of ISO 7816-3 */
+	t = 11 * f / d / (clock_frequency * 1000) + (1<<BWI) * 960 * 372 / (clock_frequency * 1000);	/* seconds  */
+
+	/* use the bigest one */
+	if (t > timeout)
+		timeout = t;
+
+	/* default BWT (BWI=0x04) */
+	t = 11 * f / d / (clock_frequency * 1000) + (1<<4) * 960 * 372 / (clock_frequency * 1000);	/* seconds  */
+
+	/* use the bigest one */
+	if (t > timeout)
+		timeout = t;
+
+	return timeout;
+} /* T1_card_timeout  */
+