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

📄 icccmd.c

📁 mifarea卡程序mifarea卡程序mifarea卡程序
💻 C
字号:
	/************************
 *    iccapp.c          *
 * Designe by 刘俐训    *
 * ic Card application  *
 * update: 2004.07.08   *
 ************************/
#include <icc.h>
#include <string.h>
#include <icccmd.h>
#include <uart.h>

// #define DEBUGICCCMD

int IccSendCmd(unsigned char *cmd, int len, unsigned char *rsp)
{
    int i, j, k;
    unsigned char proc_char;
    unsigned char LC, LE;
    unsigned char tmp, tmp1, tmp2;   // 用于比较INS和过程字节的高7位
    unsigned char cmdstr[5];

    IccClear();           //清缓冲区。
    
    if(len < 4)
        return -1;
    else if(len == 4)
    {
        LC = 0;
        LE = 0;
    }
    else if(len == 5)
    {
        LC = 0;
        LE = cmd[4];
    }
    else // if(len > 5)
    {
        LC = cmd[4];
        if(len - LC == 5)
            LE = 0;
        else // if(len - LC == 6)
            LE = cmd[5+LC];
    }
    
    memcpy(cmdstr, cmd, 5);


Startsend:
    j = 0;
    k = 0;
    tmp1 = cmdstr[1] & 0xfe;    // mask the lsb
    tmp2 = tmp1 | 0x01;
    i = IccWrite(cmdstr, 5);              /* send command head 5 bytes */
    if(i < 5)
	{
        #ifdef DEBUGICCCMD
        ComWrite("\xff", 1);
        #endif

        return -2;
	}

    
Proc:
    i = IccRead(&proc_char, 1);             /* procedure byte */
    if(i < 1)
	{
        #ifdef DEBUGICCCMD
        ComWrite("\xee", 1);
        #endif

        return -2;
	}
	
    tmp = proc_char & 0xfe;     // mask the lsb
    if(tmp1 == tmp)             // tmp1: lsb = 0, INS = proc_char
    {
        // trans all left chars
        if(LC > 0)
        {
            /* send lc */
            i = IccWrite(cmd+5+j, LC);
            if(i < LC)
			{
                #ifdef DEBUGICCCMD
                ComWrite("\xdd", 1);
                #endif

		        return -2;
			}
			
			j += LC;
			LC = 0;
			goto Proc;
		}
        
        if(LE > 0)
        {
            i = IccRead(rsp+k, LE);          // get response.data
            if(i < LE)
    		{
                #ifdef DEBUGICCCMD
                ComWrite("\xbb", 1);
                #endif
    
    	        return -2;
    		}
    		
    		k += LE;
    	}
    	
    	goto Proc;
    }
    else if(tmp2 == ~tmp)       // tmp2: lsb = 1, INS = ~proc_char
    {
        // trans next char
        if(LC > 0)
        {
            /* send lc */
            i = IccWrite(cmd+5+j, 1);  
            if(i < 1)
			{
                #ifdef DEBUGICCCMD
                ComWrite("\xdc", 1);
                #endif

		        return -2;
			}
			j ++;
			LC --;
			goto Proc;
		}
		
        
        if(LE > 0)
        {
            i = IccRead(rsp+k, 1);          // get response.data
            if(i < 1)
    		{
                #ifdef DEBUGICCCMD
                ComWrite("\xba", 1);
                #endif
    
    	        return -2;
    		}
    		
    		k ++;
    		LE --;
    	}
		
		goto Proc;
    }
    else if(proc_char == 0x6c)                        /* incorect lenght P3 */
    {
        i = IccRead(&proc_char, 1);
        if(i < 1)
		{
            #ifdef DEBUGICCCMD
            ComWrite("\x99", 1);
            #endif

	        return -2;
		}
        else
        {
            cmdstr[4] = proc_char;
            LE = proc_char;
            goto Startsend;                 /* send again*/
        }
    }
    else if(proc_char == 0x60)
    {
        goto Proc;                          /* wait another proc byte */
    }
    else                                    /* sw1 and sw2 */
    {
       	rsp[k++] = proc_char;
        i = IccRead(rsp+k, 1);
        if(i < 1)
		{
            #ifdef DEBUGICCCMD
            ComWrite("\x88", 1);
            #endif

	        return -2;
		}

        if(proc_char == 0x61)
        {
            cmdstr[0] = 0x00;               /* get response CLA */
            cmdstr[1] = 0xc0;               /* get response INS */
            cmdstr[2] = 0x00;               /* P1 */
            cmdstr[3] = 0x00;               /* P2 */
            LE = cmdstr[4] = rsp[k];        /* Le */
            LC = 0;
            
            goto Startsend;                 /* get response */
        }
    }

    return k+1;                               /* command success */
}

⌨️ 快捷键说明

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