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

📄 app_magdrive.c

📁 磁条卡读卡的源代码
💻 C
字号:

#include "App_Cfg.h"
#include "App_MagDrive.h"

MAGCARD_TRACK2 Track2_Data;
MAGCARD_TRACK3 Track3_Data;


void MagDrive_Init(void)
{
    REG32(GPALR) &= 0xFF0003FF;         //IO 5,6,7 8 9 10 11

    REG32(GPDIR) &= ~IO_CLS;
     	
	REG32(GPDIR) &= ~IO_TRACK_2_DATA;   //data  IO  for track2
	REG32(GPDIR) &= ~IO_TRACK_2_CLK;    //clock IO  for track2

	REG32(GPDIR) &= ~IO_TRACK_3_DATA;   //data  IO  for track3
	REG32(GPDIR) &= ~IO_TRACK_3_CLK;    //clock IO  for track3 
	
	
	REG32(GPDIR) |= IO_BUZZER_CTRL;
	REG32(GPDR)  &= ~IO_BUZZER_CTRL;
	
	REG32(GPDR)  |= IO_CLS;      
}


UINT1 MagDrive_Polling(void)
{
    memset(&Track2_Data,0,sizeof(Track2_Data));   
    memset(&Track3_Data,0,sizeof(Track3_Data));
    
    if ( REG32(GPDR) & IO_CLS ) return 0;

    do
    {
        //MagDrive_Get_TK1();
        MagDrive_Get_TK3();
        //MagDrive_Get_TK2();    
        
    }
    while( (REG32(GPDR) & IO_CLS) == 0 );
    
    Z32Print("\r\n");
    Z32Print("Swipe");
    Z32Printf("-----------------------------------------------------------------------------\r\n");
    
    Z32PrintHex(Track2_Data.TK2_Data,Track2_Data.TK2_Len,"Orign Track2:\r\n"); 
    Z32Printf("Track2 Length(Orign):%d",Track2_Data.TK2_Len);
    
    Z32Printf("\r\n");
    
    MagDrive_Fix_Track2(&Track2_Data);   
    
    Z32PrintHex(Track2_Data.TK2_Data,Track2_Data.TK2_Len,"Fixed Track2:\r\n");  
    Z32Printf("Track2 Length(Fixed):%d",Track2_Data.TK2_Len);  
    Z32Printf("\r\n");
    
    //if (0 == MagDrive_Check_Track2_Characters(Track2_Data.TK2_Data, Track2_Data.TK2_Len)) return 0;
    //if (0 == MagDrive_Check_LRC(Track2_Data.TK2_Data, Track2_Data.TK2_Len))               return 0; 
                       
    MagDrive_Decode_Track(Track2_Data.TK2_Data,Track2_Data.TK2_Data,Track2_Data.TK2_Len);
    Z32Print(Track2_Data.TK2_Data);
    
    Z32Printf("\r\n");
    
    /////////////////////////////////////////////////////////////////////////////
    
    Z32PrintHex(Track3_Data.TK3_Data,Track3_Data.TK3_Len,"Orign Track3:\r\n"); 
    Z32Printf("Track3 Length(Orign):%d",Track3_Data.TK3_Len);
    
    Z32Printf("\r\n");
    
    MagDrive_Fix_Track2((MAGCARD_TRACK2*)&Track3_Data);   
    
    Z32PrintHex(Track3_Data.TK3_Data,Track3_Data.TK3_Len,"Fixed Track3:\r\n");  
    Z32Printf("Track3 Length(Fixed):%d",Track3_Data.TK3_Len);  
    Z32Printf("\r\n");
    
    //if (0 == MagDrive_Check_Track2_Characters(Track3_Data.TK3_Data, Track3_Data.TK3_Len)) return 0;
    //if (0 == MagDrive_Check_LRC(Track3_Data.TK3_Data, Track3_Data.TK3_Len))               return 0; 
                       
    MagDrive_Decode_Track(Track3_Data.TK3_Data,Track3_Data.TK3_Data,Track3_Data.TK3_Len);
    Z32Print(Track3_Data.TK3_Data);
    
    Z32Printf("\r\n");
    
    return 1;                
}


UINT1 MagDrive_Get_TK1(void)
{

    return 0;
}

UINT1 MagDrive_Get_TK2(void)
{
    if ( REG32(GPDR)&IO_TRACK_2_CLK)
    { 
        Track2_Data.TK2_ClkSign = 0;                //Clock Status left unchanged        
        return 0;
    }    
    
    
    //Start To Sample the data
    //LSB First Read Out, b1 is LSB,  P is MSB 
    
    if (Track2_Data.TK2_ClkSign == 1) return 0;                         //Sample,already
    if (Track2_Data.TK2_Len >= sizeof(Track2_Data.TK2_Data)) return 1;  //Full ,already
    
    Track2_Data.TK2_ClkSign = 1;                                        //Clock Status Reverse
    
    if ( REG32(GPDR) & IO_TRACK_2_DATA )
    {  
        Track2_Data.TK2_StartGuard = 1;
        Track2_Data.TK2_BITMAP  |= (0x01 << Track2_Data.TK2_Index);     
    }
    else
    {
        //Self-clocking will be filtered out
        if (Track2_Data.TK2_StartGuard == 0) return 0;
    }
       
    Track2_Data.TK2_Index++;
    
    if (Track2_Data.TK2_Index == 5)
    {
        Track2_Data.TK2_Data[Track2_Data.TK2_Len++] = (UINT1)Track2_Data.TK2_BITMAP;
        Track2_Data.TK2_BITMAP = 0;
        Track2_Data.TK2_Index  = 0;                      
    }
    
    return 1;
}

UINT1 MagDrive_Get_TK3(void)
{
    if ( REG32(GPDR)&IO_TRACK_3_CLK)
    { 
        Track3_Data.TK3_ClkSign = 0;                //Clock Status left unchanged        
        return 0;
    }    
    
    
    //Start To Sample the data
    //LSB First Read Out, b1 is LSB,  P is MSB 
    
    if (Track3_Data.TK3_ClkSign == 1) return 0;                         //Sample,already
    if (Track3_Data.TK3_Len >= sizeof(Track3_Data.TK3_Data)) return 1;  //Full ,already
    
    Track3_Data.TK3_ClkSign = 1;                    //Clock Status Reverse
    
    if ( REG32(GPDR) & IO_TRACK_2_DATA )
    {  
        Track3_Data.TK3_StartGuard = 1;
        Track3_Data.TK3_BITMAP  |= (0x01 << Track3_Data.TK3_Index);     
    }
    else
    {
        //Self-clocking will be filtered out
        if (Track3_Data.TK3_StartGuard == 0) return 0;
    }
       
    Track3_Data.TK3_Index++;
    
    if (Track3_Data.TK3_Index == 5)
    {
        Track3_Data.TK3_Data[Track3_Data.TK3_Len++] = (UINT1)Track3_Data.TK3_BITMAP;
        Track3_Data.TK3_BITMAP = 0;
        Track3_Data.TK3_Index  = 0;                      
    }
    
    return 1;    
}


UINT1 MagDrive_Check_5Bits(UINT1 a5Bits)
{
    UINT2 i = 0;
    UINT1 nOddNum = 0;
		
	for (;i<5;i++) 
    {
		if (a5Bits & (0x01<<i)) nOddNum++; 
	}	

	return (nOddNum%2);	
}

UINT1 MagDrive_Check_Track2_Characters(UINT1* aBuff,UINT2 nLen)
{
    UINT2 i;
    
    for(i = 0 ; i < nLen ; i++)
    {
        if (0 ==  MagDrive_Check_5Bits(aBuff[i]))  return 0;    
    }
    
    return 1;
}


UINT1 MagDrive_Check_LRC(UINT1* aBuff,UINT2 nLen)
{
    UINT1 aTmp = 0;
    UINT1 i;
    
    for(i = 0; i < nLen; i++)
    {
        aTmp ^= aBuff[i];    
    }
    
    return (!aTmp);
}



UINT1 MagDrive_Decode_Track(UINT1* aOutData,UINT1* aInData,UINT2 nLen)
{
    int i = 0; 
    
    for( ; i < nLen; i++)
    {
        aOutData[i] = ( (0x0F & aInData[i]) + 0x30);    
    }
}

//fix up data:cut trailing clocking bits, and reverse bits

void MagDrive_Rvs_Bits(UINT1* aBuff, UINT2 nLen)
{
    UINT1 i,j;
    UINT1 aTmp;
    
    for( j = 0; j < nLen; j++)
    {               
        aTmp = 0;
        
        for( i = 0; i < 5; i++)
        {
                if ( aBuff[j] & (0x01<<i)) aTmp |= (0x01<<(4-i));
        }
        aBuff[j] = aTmp;
    }    
}


void MagDrive_Fix_Track2(MAGCARD_TRACK2* pTK2)
{
    //Cut trailing clocking bits
    UINT1 aTmp;
    UINT2 nIndex = 0;
    UINT2 nNum   = 0;
    

    if (pTK2->TK2_Len <= 0 ) return;
    while(pTK2->TK2_Data[pTK2->TK2_Len -1] == 0x00) pTK2->TK2_Len--;
    
    if (pTK2->TK2_Data[1] == 0x1F)         //反向刷卡
    {
        nNum = pTK2->TK2_Len/2;
        while(nIndex < nNum)
        {
                aTmp = (pTK2->TK2_Data[nIndex]);
                pTK2->TK2_Data[nIndex] = pTK2->TK2_Data[pTK2->TK2_Len -1 - nIndex];
                pTK2->TK2_Data[pTK2->TK2_Len - 1 - nIndex] = aTmp; 
                nIndex++;                          
        }   
        //Z32PrintHex(Track2_Data.TK2_Data,Track2_Data.TK2_Len,"Track2_Rvs:\r\n");
        MagDrive_Rvs_Bits( pTK2->TK2_Data, pTK2->TK2_Len);
    } 
}





 

⌨️ 快捷键说明

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