⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 paypass_anticollision.c

📁 读RF卡的源代码
💻 C
📖 第 1 页 / 共 4 页
字号:

		l_bStatus = b_fnPayPassAnticollisionErrorHandling(_ISOA_RATS, l_bStatus,&g_abRATS_ATTRIB[0],g_lDataBytesReceived);
		
		#ifdef TTAL1
		//if ((g_sLog.enable) && (i!=1) )	   
		if (g_sLog.enable)	   
		{
			//BUFFER CONCATENATION (WITH VARIABLE SIZE OF RESPONSE)
			sprintf(g_sLog.buffer+strlen(g_sLog.buffer),"RATS Response:	");
			v = 0;
			l_lDataBytesReceived=g_lDataBytesReceived;
			while(l_lDataBytesReceived!=0)
			{
				sprintf(g_sLog.buffer+strlen(g_sLog.buffer),"%02x",g_abRATS_ATTRIB[v]);
				
				v += 1;
				l_lDataBytesReceived -= 1;
			}
			sprintf(g_sLog.buffer+strlen(g_sLog.buffer),"\n");
		}
		#endif
	}
	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;
	}

	// CALCULATE SFGT + D(SFGT)   32 x 2^SFGI  + 3*2^SFGI
	g_FWT_SFGT = b_fnFWT_SFGTCalculate(_SFGT,g_abRATS_ATTRIB[3],1);
	g_FWT_SFGT /= 10;

	// WAIT DURING SFGT + D(SFGT)  	 
    for(l_bDelay=10;l_bDelay>0;l_bDelay--) 
	{
		delay_us(g_FWT_SFGT);
	}
#ifdef MODE_DEBUG
	printf("Card A RATS ok, ready for the transaction!!\n");
#endif
	return END_ACTIVATE_A;
}


//-----------------------------------------------------------------------------
// Function name : b_fnActivateB(unsigned char* p_abATQBResponse_polling, StructReader* p_pStructReader)
//-----------------------------------------------------------------------------
// Description : Do the type B Activate
//               
//
// IN       :   p_pStructReader : Pointer to the used StructReader structure.
//				p_abATQBResponse_polling : ATQB memorized in the polling
//
// OUT      :   - none -
//  
// RETURN   :	END_ACTIVATE_B	   card B activated 
//				PROTOCOL_ERROR
//				TIME_OUT_ERROR
//				TRANSMISSION_ERROR Collision
//
// Notes    :  	- none -
//-----------------------------------------------------------------------------
unsigned char b_fnActivateB(unsigned char* p_abATQBResponse_polling, StructReader* p_pStructReader)
{
	unsigned char l_bStatus;
	unsigned char l_abBuffer[15];
	unsigned char i;
	unsigned char l_abDataForPrintf[3];

	/*----------WUPB----------*/ 
  	i = 0;

	do
	{
		i += 1;

		//Option for Host mode
		l_abDataForPrintf[0] = _ISOB_REQB;		
		l_abDataForPrintf[1] = _ISOB_AFI_ALL;    // all application families     
		l_abDataForPrintf[2] = _ISOB_WUPB_NO_SLOT;    		  // _ISOB_REQB_NO_SLOT or _ISOB_WUPB_NO_SLOT
		
		#ifdef TTAL1
		if(g_sLog.enable)
		{
			sprintf(g_sLog.buffer,"WUPB Command:	%02x%02x%02x\n",l_abDataForPrintf[0],l_abDataForPrintf[1],l_abDataForPrintf[2]);
		}
		#endif

		// SEND WUPB AND RECEIVE ATQB
		l_bStatus = b_fnSendReceiveREQBWUPB_PayPass(_ISOB_WUPB_NO_SLOT,&l_abBuffer[0],p_pStructReader,&g_bATQBLength);
		// CHECK ERROR
		l_bStatus = b_fnPayPassAnticollisionErrorHandling(_ISOB_WUPB_NO_SLOT, l_bStatus,&l_abBuffer[0],g_bATQBLength);

		#ifdef TTAL1
		//Option for Host mode
		if(g_sLog.enable)
		{
			sprintf(g_sLog.buffer + strlen(g_sLog.buffer),"ATQB Received:	%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",
						l_abBuffer[0],
						l_abBuffer[1],
						l_abBuffer[2],
						l_abBuffer[3],
						l_abBuffer[4],
						l_abBuffer[5],
						l_abBuffer[6],
						l_abBuffer[7],
						l_abBuffer[8],
						l_abBuffer[9],
						l_abBuffer[10],
						l_abBuffer[11]);
		}
		#endif
	}
	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 ;				// return l_bStatus;  FP 23/08/07
	}

#ifdef MODE_DEBUG
	printf("Card B awoken\n");
#endif	
   // VERIFY THE VALUE OF ATQB WITH THE POLLING ATQB (Requirements 9.5)
	for(i=0;i<g_bATQBLength;i++) 
	{
		if (p_abATQBResponse_polling[i] != l_abBuffer[i])  
		{
			return PROTOCOL_ERROR;
		}
	}
		
#ifdef MODE_DEBUG
	printf("ATQB correct\n");
#endif
	// EXTRACT FWI FROM THE ATQB TO CALCULATE THE FWT FOR THE ATTRIB COMMAND
	g_FWT_SFGT = b_fnFWT_SFGTCalculate(_FWT,l_abBuffer[11],1);

	/*----------ATTRIB----------*/
	// TIMEOUT CALCULATE WITH THE FWT + PICOREAD OFFSET
	p_pStructReader->s_bRTimeoutUsed = (g_FWT_SFGT + _PICOREAD_TIMEOUT_OFFSET_B);	

	// PREPARE THE DATA TO SEND
	v_fnSendPreparATTRIB_PayPass(&l_abBuffer[0],p_pStructReader);
	
	#ifdef TTAL1
	//Option for Host mode
	if(g_sLog.enable)	   
	{
		//BUFFER CONCATENATION
		sprintf(g_sLog.buffer + strlen(g_sLog.buffer),"ATTRIB Command: %02x%02x%02x%02x%02x%02x%02x%02x%02x\n",l_abBuffer[0],l_abBuffer[1],l_abBuffer[2],l_abBuffer[3],l_abBuffer[4],l_abBuffer[5],l_abBuffer[6],l_abBuffer[7],l_abBuffer[8]);
	}
	#endif
	
	// SEND ATTRIB CMD TO THE CHIP (WITHOUT Higher layer朓NF (Requirements 6.22) )
	i = 0;
	do
	{
		i += 1;
		// SEND ATTRIB COMMAND
		v_fnSendBuffer(_SENDCRC,9,0,&l_abBuffer[0],p_pStructReader);
		// RECEIVE ATTRIB REsPONSE
		l_bStatus = b_fnReceiveBuffer(_CHECKCRC,&g_abRATS_ATTRIB[0],p_pStructReader,&g_lDataBytesReceived,&g_bDataBitsReceived,&g_bPicoReadStatus,&g_bRFReceiveEOFB,&g_bBitsToReceive);

		// CHECK ERROR
		l_bStatus = b_fnPayPassAnticollisionErrorHandling(_ISOB_ATTRIB, l_bStatus,&g_abRATS_ATTRIB[0],g_lDataBytesReceived);
   	}
	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 ; //return l_bStatus; FP 23/08/07
    }

	#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),"ATTRIB Response: ");
		i = 0;
		while(g_lDataBytesReceived!=0)
		{
			sprintf(g_sLog.buffer+strlen(g_sLog.buffer),"%02x",g_abRATS_ATTRIB[i]);
			i += 1;
			g_lDataBytesReceived -= 1;
		}
		sprintf(g_sLog.buffer+strlen(g_sLog.buffer),"\n");
	}
	#endif
 
#ifdef MODE_DEBUG
	printf("Card B attrib & ready for the transaction\n");
#endif  
	return END_ACTIVATE_B;
}


//-----------------------------------------------------------------------------
// Function name : b_fnRemoveA(StructReader* p_pStructReader)
//-----------------------------------------------------------------------------
// Description : Do the type A Remove
//               
//
// IN       :   p_pStructReader : Pointer to the used StructReader structure.
//
// OUT      :   
//  
// RETURN   :	END_ACTIVATE_B	   card B activated 
//				PROTOCOL_ERROR
//				TIME_OUT_ERROR
//				TRANSMISSION_ERROR Collision
//
// Notes    :  	- none -
//-----------------------------------------------------------------------------
unsigned char b_fnRemoveA(StructReader* p_pStructReader)
{
	unsigned char l_ATQReceived=0;
	unsigned char l_bStatus;
	unsigned char l_abBuffer[3];
	unsigned char l_bDelay;
	unsigned char j;

	/*----------LOOP WUPA----------*/
	j = 0;
	do
	{
	 	j += 1;

		// TIMEOUT + PICOREAD OFFSET
		p_pStructReader->s_bRTimeoutUsed =(_FDT_A_PICC_MIN + _PICOREAD_TIMEOUT_OFFSET_A)+10;
		
		
		// SEND WUPA COMMAND
		l_bStatus = b_fnSendReceiveREQAWUPA(_ISOA_WUPA,&l_abBuffer[0],p_pStructReader,&g_lDataBytesReceived);




		// IF RESPONSE (CORRECT OR NOT)
		if (l_bStatus != ERR_NOCARD) 
		{
			j = 0;
			// SEND HALT COMMAND
			v_fnSendHALTA(p_pStructReader);  // no response waiting from the card
			 l_ATQReceived=1;
			// delay tP (500 etu = 4,72 ms = 10 * 472 祍 )
			for(l_bDelay=10;l_bDelay>0;l_bDelay--) 
			{
				delay_us(472);
			}
		}




	if((j==1)||(j==2))
	{
		for(l_bDelay=100;l_bDelay>0;l_bDelay--) 
		{	
		delay_us(310);		
		}
	}



	
	}
	while (j < 3);
		
#ifdef MODE_DEBUG
	//printf("Card A removed, end of payment !!\n");
#endif

	return TIME_OUT_ERROR;  // and go to reset!!
}


//-----------------------------------------------------------------------------
// Function name : b_fnRemoveB(StructReader* p_pStructReader)
//-----------------------------------------------------------------------------
// Description : Do the type B Remove
//               
//
// IN       :   p_pStructReader : Pointer to the used StructReader structure.
//
// OUT      :   - none -
//  
// RETURN   :	END_ACTIVATE_B	   card B activated 
//				PROTOCOL_ERROR
//				TIME_OUT_ERROR
//				TRANSMISSION_ERROR Collision
//
// Notes    :  - none -
//-----------------------------------------------------------------------------
unsigned char b_fnRemoveB(StructReader* p_pStructReader)
{
	unsigned char l_bStatus;
	unsigned char l_abBuffer[15];
	unsigned char l_bDelay;
	unsigned char j;

	/*----------LOOP WUPB----------*/
	j = 0;
	p_pStructReader->s_bRTimeoutUsed = (_FWT_ATQB +_PICOREAD_TIMEOUT_OFFSET_B);
	do
	{
		j += 1;
		// SEND WUPB COMMAND
		l_bStatus = b_fnSendReceiveREQBWUPB_PayPass(_ISOB_WUPB_NO_SLOT,&l_abBuffer[0],p_pStructReader,&g_lDataBytesReceived);
		// IF RESPONSE (CORRECT OR NOT)
		if (l_bStatus != ERR_NOCARD)
		{
			j = 0;
			//delay(500 etu = 4,72 ms = 10 * 472 祍 )  	 tP
			for(l_bDelay=10;l_bDelay>0;l_bDelay--) 
			{	
				delay_us(472);
			}
		}
	}
	while (j < 3);
	
#ifdef MODE_DEBUG
	printf("Card B removed, end of payment !!\n");
#endif	

	return TIME_OUT_ERROR; //& go to Reset
}


//-----------------------------------------------------------------------------
// Function name : b_fnLoopBackFunction(StructReader* p_pStructReader)
//-----------------------------------------------------------------------------
// Description : Execute the T=CL protocol to transmit APDU 
//
// IN       :   p_pStructReader : Pointer to the used StructReader structure.
//
// OUT      :   - none -
//  
// RETURN   :	END_RESET	       error so Reset
//				END_TRANSMIT	   end of the transmission of APDU
//				
// Notes    :   
//-----------------------------------------------------------------------------
unsigned char	b_fnLoopBackFunction(StructReader* p_pStructReader)
{
    unsigned short	 l_bStatus;
	unsigned char 	 l_abCommand[5];
	unsigned short   l_iDataOutLength;
	unsigned short   l_iDataInLength;
	unsigned char 	 i = 0;

	//g_sLog.enable=1;
	#ifdef TTAL1
// LOOP BACK FUNCTION FOR PAYPASS 
	if (g_Anticollision_choice == 0)
	#endif
	{
		// The first C-APDU to be sent is a SELECT Proximity Payment System Environment APDU
		// (

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -