📄 paypass_tcl.lst
字号:
unsigned char l_iRetryCount;
unsigned char l_iRetryCount2;
unsigned short l_wStatus;
unsigned char l_ePCBType;
unsigned char l_eTransmitStep;
unsigned char l_bWTX;
unsigned short l_iTCLFrameInLength;
unsigned short l_iTCLFrameOutLength;
unsigned char l_bRFReceiveEOF;
// Initialize retry count to TCL_RETRY_COUNT
l_iRetryCount = TCL_RETRY_COUNT;
l_iRetryCount2 = TCL_RETRY_COUNT;
//INITIALIZE STEP
l_eTransmitStep = CST_tcltsDESELECT;
l_iTCLFrameInLength = 0;
l_iTCLFrameOutLength = 0;
//LOOP UNTIL EXCHANGE DONE
while ( l_eTransmitStep != CST_tcltsEnd )
{
// CASE STEP
switch (l_eTransmitStep)
{
case CST_tcltsDESELECT:
//BUILD S(DESELECT) TCL FRAME
v_fnTCLFrameBuild(CST_pcbtDESELECT, NULL, NULL, 0, l_abTCLFrame, &l_iTCLFrameInLength, &l_iTCLFrameOu
-tLength);
//RECEIVE THE SAME LENGTH AS INPUT S(DESELECT)
l_iTCLFrameOutLength = l_iTCLFrameInLength;
break;
case CST_tcltsRNACK:
//BUILD RNACK TCL FRAME
v_fnTCLFrameBuild(CST_pcbtRNACK, NULL, NULL, 0, l_abTCLFrame, &l_iTCLFrameInLength, &l_iTCLFrameOutLe
-ngth);
//UNKNOWN FRAME OUT LENGTH
l_iTCLFrameOutLength = -1;
break;
case CST_tcltsSWTX:
//BUILD RNACK TCL FRAME
v_fnTCLFrameBuild(CST_pcbtSWTX, NULL, l_abDataIn, 1, l_abTCLFrame, &l_iTCLFrameInLength, &l_iTCLFrame
-OutLength);
ARM COMPILER V2.40e, Paypass_TCL 12/12/07 14:35:11 PAGE 9
//UNKNOWN FRAME OUT LENGTH
l_iTCLFrameOutLength = -1;
break;
}
//PROTOCOL CHOICE
if(g_TCLCard.f_eCardType == CST_tclctISO_14443_A_4)
{
l_bRFReceiveEOF = g_bRFReceiveEOFA;
}
else
{
l_bRFReceiveEOF = g_bRFReceiveEOFB;
}
// INITIALIZE THE TIME OUT + PICOREAD OFFSET
p_pStructReader->s_bRTimeoutUsed = _FWT_DEACTIVATION;
if (p_pStructReader->s_bRProtocol == ISOA_PROTOCOL)
{
p_pStructReader->s_bRTimeoutUsed +=_PICOREAD_TIMEOUT_OFFSET_A;
}
if (p_pStructReader->s_bRProtocol == ISOB_PROTOCOL)
{
p_pStructReader->s_bRTimeoutUsed +=_PICOREAD_TIMEOUT_OFFSET_B;
}
// Execute TRANSMIT command
if (l_iTCLFrameOutLength != -1)
{
v_fnSendBuffer(_SENDCRC,l_iTCLFrameInLength,0,&l_abTCLFrame[0],p_pStructReader);
l_wStatus = b_fnReceiveBuffer(_CHECKCRC,&l_abTCLFrame[0],p_pStructReader,&l_iTCLFrameOutLength,&g_bDat
-aBitsReceived,&g_bPicoReadStatus,&l_bRFReceiveEOF,&g_bBitsToReceive);
}
else
{
//THE MAXIMUM FRAME LENGHT IS PCB(1) + WTX(1) + CRC(2) = 4
l_iTCLFrameOutLength = 4;
v_fnSendBuffer(_SENDCRC,l_iTCLFrameInLength,0,&l_abTCLFrame[0],p_pStructReader);
l_wStatus = b_fnReceiveBuffer(_CHECKCRC,&l_abTCLFrame[0],p_pStructReader,&l_iTCLFrameOutLength,&g_bDat
-aBitsReceived,&g_bPicoReadStatus,&l_bRFReceiveEOF,&g_bBitsToReceive);
}
//printf("\nERROR DESELECT : %d",l_wStatus);
// IF FRAME > FSD=256 bytes --> PROTOCOL ERROR (Requirements 10.1)
if (l_iTCLFrameOutLength > 256)
{
return PROTOCOL_ERROR;
}
// Test TA 416.2 & 416.3 & 416.5 (TB)
if ( ( l_eTransmitStep == CST_tcltsDESELECT )
&& ( l_abTCLFrame[0] != 0xC2 ) )
{
return PROTOCOL_ERROR;
}
//CHECK IF DATA RECEIVED
if (l_wStatus == ERR_NO_ERROR)
{
l_ePCBType = b_fnTCLFrameExtract(&l_iTCLFrameOutLength, &l_abTCLFrame[0], l_abDataOut, &l_wStatus);
// IF PROTOCOL ERROR IN DATA RECEIVED(Requirements 10.2)
if (l_ePCBType == CST_pcbPROTOCOL_ERROR)
{
return PROTOCOL_ERROR;
}
ARM COMPILER V2.40e, Paypass_TCL 12/12/07 14:35:11 PAGE 10
if (l_ePCBType == CST_pcbtError)
{
// DECREMENT RETRY COUNT
l_iRetryCount--;
}
}
else
{
// TIMEOUT ERROR
if (l_wStatus == ERR_NOCARD)
{
l_ePCBType = CST_pcbtError;
// DECREMENT RETRY COUNT
l_iRetryCount2--;
}
// TRANSMISSION ERROR
else
{
l_ePCBType = CST_pcbtError;
// DECREMENT RETRY COUNT
l_iRetryCount--;
}
}
// CASE PCB TYPE
switch (l_ePCBType)
{
case CST_pcbtDESELECT:
#ifdef MODE_DEBUG_TCL
printf("Deselect\n");
#endif
// CARD DESELECTED
l_eTransmitStep = CST_tcltsEnd;
// SET RESULT
return TRUE;
break;
case CST_pcbtRNACK:
// R(NAK) RECEIVED CONSIDERED AS PROTOCOL ERROR (Requirements 10.9)
return PROTOCOL_ERROR;
break;
case CST_pcbtSWTX:
// GET SWTX
l_bWTX = l_abDataOut[0];
// SET WTX VALUE (THE 2 UPPER BITS SHOULD BE RESET TO ZERO)
l_abDataIn[0] = l_bWTX & 0x3F ;
// PROTOCOL ERROR IF WTXM = 0 (Requirements 10.4)
if ( l_abDataIn[0] == 0 )
{
return PROTOCOL_ERROR;
}
// IF WTXM > 59 (60 to 63) --> WTXM = 59 =(0x3B) (Requirements 10.4)
if ( l_abDataIn[0] > 0x3B )
{
l_abDataIn[0] = 0x3B;
}
// TRANSMIT SWTX
l_eTransmitStep = CST_tcltsSWTX;
ARM COMPILER V2.40e, Paypass_TCL 12/12/07 14:35:11 PAGE 11
break;
case CST_pcbtError:
// CHECK IF RETRY COUNT ELLAPSED
if (l_iRetryCount == 0)
{
return TRANSMISSION_ERROR;
}
if (l_iRetryCount2 == 0)
{
return TIME_OUT_ERROR;
}
else
{
l_eTransmitStep = CST_tcltsDESELECT;
}
break;
}
}
// Default path: return error
return FALSE;
}
//-----------------------------------------------------------------------------
// Function name : b_fnCardTransmit_PayPass
//-----------------------------------------------------------------------------
// Description : This function sends an APDU using the ISO-14443-4 T=CL protocol.
//
// IN : p_pStructReader Pointer to the used StructReader structure
// p_iDataInLength Size of data sent to the card
// p_pabCommand T=CL Command (Class,Instruction,Param1,Param2,Param3 = Lc)
// p_pabDataIn T=CL command's Data In (C-APDU)
//
// OUT : p_piDataOutLength Size of data returned by the chip
// p_pabDataOut Card's response (R-APDU)
//
// RETURN : Status word
//
// Notes : - none -
//-----------------------------------------------------------------------------
unsigned short b_fnCardTransmit_PayPass( unsigned short *p_piDataOutLength, //Length of data received
unsigned short p_iDataInLength, //Length of data to send
unsigned char *p_pabCommand,
unsigned char *p_pabDataIn,
unsigned char *p_pabDataOut,
StructReader *p_pStructReader)
{
unsigned char l_abTCLFrame[300];
unsigned short l_iTCLFrameInLength;
unsigned short l_iTCLFrameOutLength;
unsigned short l_iDataInLength;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -