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

📄 paypass_tcl.lst

📁 读RF卡的源代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
                       }
                       
                       g_bPayPassTimeoutValue = p_pStructReader->s_bRTimeoutUsed;
                               
               /*------------------------------------------------------------------------------------------------*/
               
                       #ifdef TTAL1
                       // Option for Host mode
                       if (g_sLog.enable)     
                       {
                           // CONCATENATION BUFFER
                           sprintf(g_sLog.buffer,"C-APDU: ");
                           for (i=0;i<l_iTCLFrameInLength;i++)
                           {
                               sprintf(g_sLog.buffer + strlen(g_sLog.buffer),"%02x",l_abTCLFrame[i]);
                           }
                           sprintf(g_sLog.buffer + strlen(g_sLog.buffer),"\n");
                           v_fnSendToHostEcho(g_sLog.buffer);
                       }
                       #endif
               /*------------------------------------------------------------------------------------------------*/
               
               
               /*------------------------ SEND -----AND ----- RECEIVE--------------------------------------------*/
               
                           
                       //TRANSMIT A FRAME AND RECEIVE A FRAME
                       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
                       {
                           //SET LENGTH TO MAXIMUM PCD SIZE BECAUSE PICC WILL NEVER SEND MORE
ARM COMPILER V2.40e,  Paypass_TCL                                                          12/12/07  14:35:11  PAGE 16  

                           l_iTCLFrameOutLength = g_TCLCard.f_iPCDMaximumInputFrameSize;        // FP ERROR  l_iTCLFrameOutLength is n
             -ot use as a limit in b_fnReceiveBuffer call
                           
                           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);    
                       }
               
               
               /*------------------------------------------------------------------------------------------------*/
               
               /*------------------------------------------------------------------------------------------------*/
               /*------------------ERROR HANDLING ---------------------------------------------------------------*/
               /*------------------------------------------------------------------------------------------------*/
               
                             
               /* Debug FP 20/02/07   FSD CHECK*/      
                       // Si longueur de la trame recu > (PCD FSD-CRC)  et si quelque chose a bien ete recu
                       if ( ((l_iTCLFrameOutLength > (g_TCLCard.f_iPCDMaximumInputFrameSize-2)) && (l_wStatus != ERR_NOCARD) )
             -|| (l_wStatus == ERR_ISOB) )          //max = 256 - 2(CRC)=254
                       {
                           return PROTOCOL_ERROR;
                       }
               
                       // CHECK IF DATA RECEIVED
                       if (l_wStatus == ERR_NO_ERROR)
                       {
                                   // IF FRAME SIZE > PCD FSD
                                   if (l_iTCLFrameOutLength > (g_TCLCard.f_iPCDMaximumInputFrameSize-2))
                                   {
                                       return PROTOCOL_ERROR;
                                   }
                           
                                   // Test TB 411.7 
                                   // IF (SENDING A COMMAND OR SENDING A CHAINING FRAME )
                                   // AND PREVIOUS ONE SENT IS A CHAINING FRAME
                                   // AND ( FRAME RECEIVED IS A S-BLOCK OR A I-CHAINING BLOCK )
                       
                                   if ( ( (l_eTransmitStep == CST_tcltsCommand) || (l_eTransmitStep == CST_tcltsChaining))
                                       && (l_ePCBTypeInitial == CST_pcbtIWithChaining ) 
                                       && (( l_abTCLFrame[0] == PCB_S ) || ( (l_abTCLFrame[0] & 0xF0) == PCB_I_WITH_CHAINING  ) ) )
                                   {
                                       return PROTOCOL_ERROR;
                                   }
                           
                       
                       
                                   //Test TA 404.6
                                   // IF (SENDING A COMMAND OR SENDING A CHAINING FRAME )
                                   // AND PREVIOUS ONE SENT IS A NOT CHAINING FRAME
                                   // AND FRAME RECEIVED IS A S-BLOCK
                                   if (( (l_eTransmitStep == CST_tcltsCommand) || (l_eTransmitStep == CST_tcltsChaining) )
                                       &&  ( l_ePCBTypeInitial == CST_pcbtINoChaining ) && ( l_abTCLFrame[0] == PCB_S ) )
                                   {
                                       return PROTOCOL_ERROR;
                                   }
                       
                                   //Test TA 408.5
                                   // IF (SENDING A COMMAND OR SENDING A CHAINING FRAME )
                                   // AND PREVIOUS ONE SENT IS A CHAINING FRAME
                                   // AND FRAME RECEIVED IS A S-BLOCK
                                   if (( (l_eTransmitStep == CST_tcltsCommand) || (l_eTransmitStep == CST_tcltsChaining) )
                                       && ( l_ePCBTypeInitial == CST_pcbtIWithChaining ) && ( l_abTCLFrame[0] == PCB_S ) )
                                   {
                                       return PROTOCOL_ERROR;
                                   }
ARM COMPILER V2.40e,  Paypass_TCL                                                          12/12/07  14:35:11  PAGE 17  

                           
                                   // Test TA 408.4 and Test TA 408.5  FP
                                   // IF SENDING A R-ACK
                                   // AND RECEIVED FRAME SIZE=1 AND IS A S-BLOCK AND PREVIOUS ONE SENT IS A CHAINING FRAME
                                   if ( ( l_eTransmitStep == CST_tcltsRACK ) 
                                       && ( ( l_iTCLFrameOutLength == 1 ) && ( l_abTCLFrame[0] == PCB_S ) && (l_ePCBTypeInitial == CST_pcb
             -tIWithChaining) ) )
                                   {
                                       return PROTOCOL_ERROR;
                                   }
                       
                                   // Test TA 408.2 and Test TA 408.3
                                   // IF SENDING A COMMAND OR SENDING A CHAINING FRAME 
                                   // AND PREVIOUS ONE SENT IS A CHAINING FRAME
                                   // AND Bit3 AND Bit4 OF THE PCD ARE DIFF TO 0
                                   if ( ( (l_eTransmitStep == CST_tcltsCommand) || (l_eTransmitStep == CST_tcltsChaining) )
                                       && (l_ePCBTypeInitial == CST_pcbtIWithChaining) && ( (l_abTCLFrame[0] & 0x0C) != 0x00 ))
                                   {
                                       return PROTOCOL_ERROR;
                                   }
                       
                                   //Test TA 404.6
                                   // IF SENDING A COMMAND OR SENDING A CHAINING FRAME 
                                   // AND PREVIOUS ONE SENT IS A NOT CHAINING FRAME 
                                   // AND RECEIVED FRAME IS A R-ACK
                                   // AND RECEIVED BLOCK NUMBER = READER BLOCK NUMBER
                                   if (( (l_eTransmitStep == CST_tcltsCommand) || (l_eTransmitStep == CST_tcltsChaining) )
                                       && ( l_ePCBTypeInitial == CST_pcbtINoChaining ) && ( (l_abTCLFrame[0] & 0xF0) == 0xA0 )
                                       &&( (l_abTCLFrame[0] & 0x01) == (g_TCLCard.f_iBlockNumber & 0x01)) )
                                   {
                                       return PROTOCOL_ERROR;
                                   }    
                       
                           
                                   #ifdef TTAL1
                                   // Option for Host mode
                                   if (g_sLog.enable)     
                                   {
                                       // BUFFER CONCATENATION (WITH VARIABLE LENGTH OF RESPONSE)
                                       sprintf(g_sLog.buffer,"R-APDU: ");
                                       for (i=0;i<l_iTCLFrameOutLength;i++)
                                       {
                                           sprintf(g_sLog.buffer + strlen(g_sLog.buffer),"%02x",l_abTCLFrame[i]);
                                       }
                                       sprintf(g_sLog.buffer + strlen(g_sLog.buffer),"\n");
                                       v_fnSendToHostEcho(g_sLog.buffer);
                                   }
                                   #endif
                       
                                   // Requirements 10.9 (to notify a time-out: 10.4.4.4 )
                                   // IF SENDING A R-NACK
                                   // AND RECEIVED FRAME IS A R-ACK
                                   // AND RECEIVED BLOCK NUMBER NOT EQUAL TO READER BLOCK NUMBER
                                   if ( ( (l_abTCLFrame[0] & 0xF0)== 0xA0) && (l_eTransmitStep == CST_tcltsRNACK) 
                                       && ((l_abTCLFrame[0] & 0x01) != (g_TCLCard.f_iBlockNumber & 0x01)))
                                   {
                                       // FRAME RECEIVED IS A R-ACK
                                       l_ePCBType = CST_pcbtRACK ;
                                   }
                                   else
                                   {
                                       // RECEIVED FRAME TYPE EXTRACTION
                                       l_ePCBType = b_fnTCLFrameExtract(&l_iTCLFrameOutLength, &l_abTCLFrame[0], &p_pabDataOut[l_iCurrentO
             -utIndex], &l_wStatus);
                                   }
                                               
ARM COMPILER V2.40e,  Paypass_TCL                                                          12/12/07  14:35:11  PAGE 18  

                       
                                   // IF PROTOCOL ERROR IN DATA RECEIVED(Requirements 10.2) & BLOCK NUMBER ERROR (Requirements 10.9)
                                   if (l_ePCBType == CST_pcbPROTOCOL_ERROR)
                                   {
                                       return PROTOCOL_ERROR;
                                   }
                                                       
                                   
                                   // IF SENDING A CHAINING OR A NOT CHAINING FRAME (AND EVERYTHING'S OK)
                                   // INCREASE CURSOR OF DATA RECEIVED
                                   if ( (l_ePCBType == CST_pcbtINoChaining) || (l_ePCBType == CST_pcbtIWithChaining) )
                                   {   
                                       l_iCurrentOutIndex += l_iTCLFrameOutLength;   
                                   }
                                      
               
                       }
                       else         // if  l_ErrorType != ERR_NO_ERROR
                       { 
                                   l_ePCBType = CST_pcbtError;
                       
                                   if (l_wStatus == ERR_NOCARD)
                                   {
                                       l_ErrorType = TIME_OUT_ERROR;
                                   }
                                   else
                                   {
                                       l_ErrorType = TRANSMISSION_ERROR;
                                   }
                       }
                  
               
               
               
               /*------------------------------------------------------------------------------------------------*/
               /*------------------PREPARE NEXT FRAME------------------------------------------------------------*/
               /*------------------------------------------------------------------------------------------------*/
               
               
                       // CASE PCB TYPE
               
                       switch (l_ePCBType)
                       {
                           case CST_pcbtINoChaining:
                           // NO CHAINING PCB RECEIVED
                               
                               // INCREMENT BLOCK COUNTER
                               g_TCLCard.f_iBlockNumber++;
                           
                               // END OF APDU SENDING
                               l_eTransmitStep = CST_tcltsEnd;
                           break;
               
               
               
                           case CST_pcbtIWithChaining:
                           // CHAINING PCB RECEIVED
               
                               // RESET RETRY COUNT
                               l_iRetryCount = TCL_RETRY_COUNT;
               
                               // INCREMENT BLOCK COUNTER
                               g_TCLCard.f_iBlockNumber++;
               
                               // SEND RACK FOR GETTING THE DATA
                               l_eTransmitStep = CST_tcltsRACK;
ARM COMPILER V2.40e,  Paypass_TCL                                                          12/12/07  14:35:11  PAGE 19  

                      

⌨️ 快捷键说明

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