📄 paypass_anticollision.lst
字号:
if (l_bStatus == ERR_COLL)
{
return COLLISION_ERROR ;
}
if (l_bStatus != ERR_NO_ERROR)
{
return TRANSMISSION_ERROR;
}
// UID CLn NOT COMPLIANT(Requirements 5.4)
if ( ( ( (g_abATQAResponse[0]& 0xC0) == 0x00) & ((l_bSEL > 0x93)||(l_abBuffer[0]==0x88)))
|| ( ( (g_abATQAResponse[0]& 0xC0) == 0x40) & (((l_bSEL == 0x93)&(l_abBuffer[0]!=0x88)) || (l_bSEL > 0
-x95)))
|| ( ( (g_abATQAResponse[0]& 0xC0) == 0x80) & (((l_bSEL == 0x93)&(l_abBuffer[0]!=0x88))||((l_bSEL == 0
-x95)&(l_abBuffer[0]!=0x88))))
|| ( ( (g_abATQAResponse[0]& 0xC0) == 0xC0)))
{
return PROTOCOL_ERROR;
}
// VERIFY IF THE BCC INCLUDING IN THE UID CLn IS CORRECT (Requirements 5.4)
// CALCULATED VALUE
l_abBuffer[6] = l_abBuffer[0] ^ l_abBuffer[1] ^ l_abBuffer[2] ^ l_abBuffer[3];
if (l_abBuffer[4] != l_abBuffer[6])
{
return TRANSMISSION_ERROR;
}
// STORE THE UID
memcpy(&p_abUID[l_bCurrentSerial],&l_abBuffer[0],5);
// BUFFER SHOULD BE INITIALIZED WITH 0x00 FROM 5 UNTIL 14
memset(&l_abBuffer[5],0,10);
// COPY THE UID WITHOUT THE BCC IN THE 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;
// 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_lDataBytesR
-eceived);
}
ARM COMPILER V2.40e, PayPass_Anticollision 12/12/07 14:35:10 PAGE 13
while ((i < 3) && (l_bStatus == ERR_NOCARD));
// RETURN ERROR
if ((i = 3) && (l_bStatus == ERR_NOCARD))
{
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;
}
// IF = CT --> DOUBLE OR TRIPLE UID
if (p_abUID[l_bCurrentSerial] == 0x88)
{
// NEXT STAGE SELECTION 93->95->97
l_bSEL += 2;
// SHIFT POSITION FOR THE NEXT 5 BYTES SERIAL NUMBER STAGE
l_bCurrentSerial += 5;
}
else
{
// FOR THE REAL SIZE OF UID
l_bCurrentSerial += 5;
break;
}
// VERIFY THE LAST SELECT RESPONSE:
// CASCADE BIT : IF BIT3=0 --> VALID SAK --> COMPLETE UID
//if ( bit_testChar(&l_abBuffer[0],2) == 0 )
if ((l_abBuffer[0] & 0x04) == 0)
{
return PROTOCOL_ERROR;
}
}
while (l_bSEL<0x98);
// VERIFY THE LAST SELECT RESPONSE:
// CASCADE BIT : IF BIT3=0 --> VALID SAK --> COMPLETE UID
if ((l_abBuffer[0] & 0x04) == 0x04 )
{
return PROTOCOL_ERROR;
}
// UID LENGTH
*p_bUIDLength=l_bCurrentSerial;
/*----------COLLISION DETECTION A----------*/
// SEND HALT A COMMAND
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
ARM COMPILER V2.40e, PayPass_Anticollision 12/12/07 14:35:10 PAGE 14
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_lDataBy
-tesReceived);
// 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
ARM COMPILER V2.40e, PayPass_Anticollision 12/12/07 14:35:10 PAGE 15
// 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_lDataBytesR
-eceived);
}
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_lDataB
-ytesReceived);
// IF CARD B ANSWERS: COLLISION --> RETURN ERROR // FP COLLISION RETURN 23/08/07
if(l_bStatus != ERR_NOCARD)
{
return COLLISION_ERROR ; //eturn TRANSMISSION_ERROR;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -