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

📄 paypass_tcl.lst

📁 读RF卡的源代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
                   
                   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 + -