📄 paypass_anticollision.c
字号:
v_fnSendHALTA(p_pStructReader);
// no response waiting from the PICC
// WAIT DURING tH = 100etu = 0,94ms = 2*472祍
for(l_bDelay=2;l_bDelay>0;l_bDelay--)
{
delay_us(472);
}
// SEND REQ A
l_bStatus = b_fnSendReceiveREQAWUPA(_ISOA_REQA,&l_abBuffer[0],p_pStructReader,&g_lDataBytesReceived);
// IF A CARD A ANSWERS --> RETURN ERROR // FP COLLISION RETURN 23/08/07
if (l_bStatus != ERR_NOCARD)
{
return COLLISION_ERROR ; // return TRANSMISSION_ERROR;
}
// CHANGE PROTOCOL AND WAIT DURRING THE SAME TIME tP = 4,72ms
// delay(500 etu = 4,72 ms = 10 * 419 祍 + t(ProtocolChange) )
for(l_bDelay=10;l_bDelay>0;l_bDelay--)
{
delay_us(419);
}
// LOAD ISO14443-B PROTOCOL
v_fnProtocolChange(ISOB_PROTOCOL,&g_abP6Config14443B_PayPass[0],g_bRFReceiveEOFB,p_pStructReader);
// SEND WUPB
l_bStatus = b_fnSendReceiveREQBWUPB_PayPass(_ISOB_WUPB_NO_SLOT,&l_abBuffer[0],p_pStructReader,&g_lDataBytesReceived);
// IF A CARD B ANSWERS: COLLISION --> RETURN ERROR // FP COLLISION RETURN 23/08/07
if (l_bStatus != ERR_NOCARD)
{
return COLLISION_ERROR ;// return TRANSMISSION_ERROR;
}
//CHANGE PROTOCOL AND WAIT DURRING THE SAME TIME tP = 4,72ms
//delay(500 etu = 4,72 ms = 10 * 419 祍 + t(ProtocolChange) )
for(l_bDelay=10;l_bDelay>0;l_bDelay--)
{
delay_us(419);
}
// LOAD ISO14443-A PROTOCOL
v_fnProtocolChange(ISOA_PROTOCOL,&g_abP6Config14443A_PayPass[0],g_bRFReceiveEOFA,p_pStructReader);
#ifdef MODE_DEBUG
printf("Card A ready for activate \n");
printf("UID : ");
for(i=0;i<*p_bUIDLength;i++)
{
printf("%02x",p_abUID[i]);
}
printf(" PUID Lenght : ");
printf("%02d\n",*p_bUIDLength);
#endif
return END_COLLISION_A;
}
//-----------------------------------------------------------------------------
// Function name : b_fnCollisionB(unsigned char* l_abBuffer, StructReader* p_pStructReader)
//-----------------------------------------------------------------------------
// Description : Do the type B collision detection
//
//
// IN : p_pStructReader : Pointer to the used StructReader structure.
// l_abBuffer : ATQB extract from the WUPB of POLLING
//
// OUT : - none -
//
// RETURN : END_COLLISION_B one card B
// PROTOCOL_ERROR
// TIME_OUT_ERROR
// TRANSMISSION_ERROR Collision
//
// Notes : - none -
//-----------------------------------------------------------------------------
unsigned char b_fnCollisionB(unsigned char* l_abBuffer, StructReader* p_pStructReader)
{
unsigned char l_bStatus;
unsigned char i;
unsigned char l_bDelay;
// EXTRACT FWI FROM THE ATQB TO CALCULATE THE FWT FOR THE HALTB COMMAND
g_FWT_SFGT = b_fnFWT_SFGTCalculate(_FWT,l_abBuffer[11],1);
g_FWT_SFGT += _PICOREAD_TIMEOUT_OFFSET_B;
/*--------------COLLISION DETECTION B--------------*/
// SEND HALT CMD TO THE CHIP
i = 0;
do //loop(x3) for time-out error
{
i += 1;
// TIMEOUT VALUE (礢) = g_FWT_SFGT : calculate with the FWI of ATQB
p_pStructReader->s_bRTimeoutUsed = g_FWT_SFGT;
// SEND HALTB COMMAND AND RECEIVE RESPONSE
l_bStatus = b_fnSendReceiveHALTB(&l_abBuffer[0],p_pStructReader);
// CHECK ERROR
l_bStatus = b_fnPayPassAnticollisionErrorHandling(_ISOB_HALT, l_bStatus,&l_abBuffer[0],g_lDataBytesReceived);
}
while (( i < 3 ) && (l_bStatus == ERR_NOCARD));
// RETURN ERROR
if ((l_bStatus == ERR_NOCARD) && (i = 2))
{
return TIME_OUT_ERROR;
}
// FP COLLISION RETURN 23/08/07
if (l_bStatus == ERR_COLL)
{
return COLLISION_ERROR ;
}
if(l_bStatus != ERR_NO_ERROR)
{
return TRANSMISSION_ERROR; // return l_bStatus; FP 23/08/07
}
#ifdef MODE_DEBUG
printf("Card B halted\n");
#endif
/*----------COLLISION CHECKING----------*/
// TIMEOUT VALUE + PICOREAD OFFSET (祍)
p_pStructReader->s_bRTimeoutUsed = (_FWT_ATQB + _PICOREAD_TIMEOUT_OFFSET_B);
// SEND REQB COMMAND
l_bStatus = b_fnSendReceiveREQBWUPB_PayPass(_ISOB_REQB_NO_SLOT,&l_abBuffer[0],p_pStructReader,&g_lDataBytesReceived);
// IF CARD B ANSWERS: COLLISION --> RETURN ERROR // FP COLLISION RETURN 23/08/07
if(l_bStatus != ERR_NOCARD)
{
return COLLISION_ERROR ; //eturn TRANSMISSION_ERROR;
}
//CHANGE PROTOCOL AND WAIT DURRING THE SAME TIME tP = 4,72ms
//delay(500 etu = 4,72 ms = 10 * 419 祍 + t(ProtocolChange) )
for(l_bDelay=10;l_bDelay>0;l_bDelay--)
{
delay_us(419);
}
// LOAD ISO14443-A PROTOCOL
v_fnProtocolChange(ISOA_PROTOCOL,&g_abP6Config14443A_PayPass[0],g_bRFReceiveEOFA,p_pStructReader);
// SEND WUPA COMMAND
l_bStatus = b_fnSendReceiveREQAWUPA(_ISOA_WUPA,&l_abBuffer[0],p_pStructReader,&g_lDataBytesReceived);
// If CARD A ANSERS: COLLISION --> RETURN ERROR // FP COLLISION RETURN 23/08/07
if (l_bStatus != ERR_NOCARD)
{
return COLLISION_ERROR ; // return TRANSMISSION_ERROR;
}
//CHANGE PROTOCOL AND WAIT DURRING THE SAME TIME tP = 4,72ms
//delay(500 etu = 4,72 ms = 10 * 419 祍 + t(ProtocolChange) )
for(l_bDelay=10;l_bDelay>0;l_bDelay--)
{
delay_us(419);
}
// LOAD ISO14443-B PROTOCOL
v_fnProtocolChange(ISOB_PROTOCOL,&g_abP6Config14443B_PayPass[0],g_bRFReceiveEOFB,p_pStructReader);
#ifdef MODE_DEBUG
printf("Card B ready for activate\n");
#endif
return END_COLLISION_B;
}
//-----------------------------------------------------------------------------
// Function name : b_fnActivateA(unsigned char* p_abATQAResponse_polling,unsigned char* p_abUID, StructReader* p_pStructReader)
//-----------------------------------------------------------------------------
// Description : Do the type A Activate
//
// IN : p_pStructReader : Pointer to the used StructReader structure.
// p_abATQAResponse_polling : ATQA memorized in the polling
// p_abUID : UID memorized in COLLISION
//
// OUT : - none -
//
// RETURN : END_ACTIVATE_A card A activated
// PROTOCOL_ERROR
// TIME_OUT_ERROR
// TRANSMISSION_ERROR Collision
//
// Notes : - none -
//-----------------------------------------------------------------------------
unsigned char b_fnActivateA(unsigned char* p_abATQAResponse_polling, unsigned char* p_abUID, StructReader* p_pStructReader)
{
unsigned char l_bStatus;
unsigned char l_abBuffer[20];
unsigned char l_bDelay;
unsigned char i,v;
unsigned char l_bSEL;
unsigned char l_bCurrentSerial, l_lDataBytesReceived;
unsigned char l_abDataForPrintf[3];
v = 0;
l_lDataBytesReceived = 0;
l_abDataForPrintf[0] = 0;
/*----------WUPA----------*/
//CONFIGURE DATA TO SEND & SEND COMMANDE
i = 0;
do //loop(x3) for time-out error
{
i += 1;
//Option for Host mode
/* #ifdef TTAL1
printf("WUPA Command: %02x\n",_ISOA_WUPA);
if(g_sLog.enable)
{
sprintf(g_sLog.buffer,"WUPA Command: %02x\n",_ISOA_WUPA);
}
#endif
*/
//TA311 retarde
// SEND WUPA COMMAND AND RECEIVE ATQA
l_bStatus = b_fnSendReceiveREQAWUPA(_ISOA_WUPA,&l_abBuffer[0],p_pStructReader,&g_bATQALength);
// CHECK ERROR
l_bStatus = b_fnPayPassAnticollisionErrorHandling(_ISOA_WUPA, l_bStatus,&l_abBuffer[0],g_bATQALength);
/* #ifdef TTAL1
//Option for Host mode
printf("ATQA received: %02x%02x\n",l_abBuffer[0],l_abBuffer[1]);
if(g_sLog.enable)
{
sprintf(g_sLog.buffer + strlen(g_sLog.buffer),"ATQA received: %02x%02x\n",l_abBuffer[0],l_abBuffer[1]);
}
#endif
*/
//TA311 Retarde
}
while ((i < 3) && (l_bStatus == ERR_NOCARD));
// RETURN ERROR
if ((i = 3) && (l_bStatus == ERR_NOCARD))
{
return TIME_OUT_ERROR; // time-out error within tresetdelay
}
// FP COLLISION RETURN 23/08/07
if (l_bStatus == ERR_COLL)
{
return COLLISION_ERROR ;
}
if (l_bStatus != ERR_NO_ERROR)
{
return TRANSMISSION_ERROR; //return l_bStatus; FP 23/08/07
}
// VERIFY THE ATQA VALUE (Requirements 9.4)
for(i=0;i<(g_bATQALength);i++)
{
if (p_abATQAResponse_polling[i] != l_abBuffer[i])
{
return PROTOCOL_ERROR;
}
}
#ifdef MODE_DEBUG
printf("Card A awoken, ATQA OK\n");
#endif
/*----------UID SIZE DETECTION----------*/
l_bCurrentSerial =0;
l_bSEL = _ISOA_SELECT;
do
{
// CLEAR BUFFER
memset(&l_abBuffer[5],0,10);
// COPY UID IN BUFFER TO SEND
memcpy(&l_abBuffer[2],&p_abUID[l_bCurrentSerial],4);
//SELECT COMMAND
i = 0;
do //loop(x3) for time-out error
{
i += 1;
#ifdef TTAL1
//Option for Host mode
if(g_sLog.enable)
{
//BUFFER CONCATENATION
l_abDataForPrintf[0] = l_bSEL;
l_abDataForPrintf[1] = 0x70;
l_abDataForPrintf[2] = l_abBuffer[2];
l_abDataForPrintf[3] = l_abBuffer[3];
l_abDataForPrintf[4] = l_abBuffer[4];
l_abDataForPrintf[5] = l_abBuffer[5];
l_abDataForPrintf[6] = l_abBuffer[2] ^ l_abBuffer[3] ^ l_abBuffer[4] ^ l_abBuffer[5]; // LRC (BCC calculate)
sprintf(g_sLog.buffer + strlen(g_sLog.buffer),"SELECT Command: %02x%02x%02x%02x%02x%02x%02x\n",l_abDataForPrintf[0],l_abDataForPrintf[1],l_abDataForPrintf[2],l_abDataForPrintf[3],l_abDataForPrintf[4],l_abDataForPrintf[5],l_abDataForPrintf[6]);
}
#endif
// SEND SELECT COMMAND AND RECEIVE SAK
l_bStatus = b_fnSendReceiveSELECT_ISOA(l_bSEL,&l_abBuffer[0],p_pStructReader);
// CHECK ERROR
l_bStatus = b_fnPayPassAnticollisionErrorHandling(_ISOA_SELECT, l_bStatus,&l_abBuffer[0],g_lDataBytesReceived);
#ifdef TTAL1
//Option for Host mode
if(g_sLog.enable)
{
//BUFFER CONCATENATION (WITH VARIABLE SIZE OF RESPONSE)
sprintf(g_sLog.buffer+strlen(g_sLog.buffer),"SELECT Response: %02x\n",l_abBuffer[0]);
}
#endif
}
while ((i < 3) && (l_bStatus == ERR_NOCARD));
// RETURN ERROR
if ((i = 3) && (l_bStatus == ERR_NOCARD))
{
return TIME_OUT_ERROR; //time-out error witih tresetdelay
}
// FP COLLISION RETURN 23/08/07
if (l_bStatus == ERR_COLL)
{
return COLLISION_ERROR ;
}
if (l_bStatus != ERR_NO_ERROR)
{
return TRANSMISSION_ERROR;
}
// CHECK UID LENGTH: IF = CT --> DOUBLE OR TRIPLE UID SIZE
if (p_abUID[l_bCurrentSerial]==0x88)
{
l_bSEL += 2;
l_bCurrentSerial += 5;
}
else
{
l_bCurrentSerial += 5;
break;
}
// VERIFY THE LAST SELECT RESPONSE:
// CASCADE BIT : IF BIT3=0 --> VALID SAK --> COMPLETE UID
if ((l_abBuffer[0]& 0x04) == 0x00 )
{
return PROTOCOL_ERROR;
}
}
while (l_bSEL < 0x98);
// VERIFY THE LAST SELECT RESPONSE:
// CASCADE BIT : IF BIT3=1 --> NOT COMPLETE UID
if((l_abBuffer[0]& 0x04) == 0x04 )
{
return PROTOCOL_ERROR;
}
//Debug OC
#ifdef MODE_DEBUG
printf("Card A selected\n");
// printf("g_sLog.enable: %X\n",g_sLog.enable);
// g_sLog.enable=1;
#endif
/*----------RATS/ATS----------*/
i = 0;
do //loop(x3) for time-out error
{
i += 1;
#ifdef TTAL1
//Option for Host mode
if(g_sLog.enable)
{
//CONCATENATION BUFFER
l_abDataForPrintf[0] = _ISOA_RATS;
l_abDataForPrintf[1] = 0x80;
sprintf(g_sLog.buffer+strlen(g_sLog.buffer),"RATS Command: %02x%02x\n",l_abDataForPrintf[0],l_abDataForPrintf[1]);
}
#endif
// TIMEOUT + PICOREAD OFFSET
p_pStructReader->s_bRTimeoutUsed = (_FWT_ACTIVATION + _PICOREAD_TIMEOUT_OFFSET_A);
g_bPayPassTimeoutValue = p_pStructReader->s_bRTimeoutUsed;
// SEND RATS COMMAND AND RECEIVE RESPONSE
l_bStatus = b_fnSendReceiveRATS_PayPass(&g_abRATS_ATTRIB[0],p_pStructReader);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -