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

📄 icccmd1.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

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

    IccClear();           //清缓冲区。
    rsp->len = 0;
    
    cmdstr[0] = cmd->CLA;
    cmdstr[1] = cmd->INS;
    cmdstr[2] = cmd->P1;
    cmdstr[3] = cmd->P2;
    if(cmd->Lc == 0)
        cmdstr[4] = cmd->Le;
    else
        cmdstr[4] = cmd->Lc;
        
    LC = cmd->Lc;
    LE = cmd->Le;

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 0;
	}

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

        return 0;
	}
	
    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->DAT)+j, LC);  
            if(i < LC)
			{
                #ifdef DEBUGICCCMD
                ComWrite("\xdd", 1);
                #endif

		        return 0;
			}
			j += LC;
			LC = 0;
			goto Proc;
		}
        
        if(LE > 0)
        {
            #if 0   // LE need not be sent
                /* send le ? */
                if(j > 0)
                {
                    i = IccWrite(&LE, 1);
                    if(i < 1)
    				{
                        #ifdef DEBUGICCCMD
                        ComWrite("\xcc", 1);
                        #endif
    
    			        return 0;
    				}
    				j = 0;
    				goto Proc;
                }
            #endif
            
            i = IccRead((rsp->DAT)+k, LE);          // get response.data
            if(i < LE)
    		{
                #ifdef DEBUGICCCMD
                ComWrite("\xbb", 1);
                #endif
    
    	        return 0;
    		}
    		k += LE;
    	}
    	
    	goto Proc;
		
		#if 0
            i = IccRead(rsp->SW, 2);            // get response.sw1~sw2
            if(i < 2)
        	{
                #ifdef DEBUGICCCMD
                ComWrite("\xaa", 1);
                #endif
        
                return 0;
        	}
        	rsp->len = k;
    	#endif
    }
    else if(tmp2 == ~tmp)       // tmp2: lsb = 1, INS = ~proc_char
    {
        // trans next char
        if(LC > 0)
        {
            /* send lc */
            i = IccWrite((cmd->DAT)+j, 1);  
            if(i < 1)
			{
                #ifdef DEBUGICCCMD
                ComWrite("\xdc", 1);
                #endif

		        return 0;
			}
			j ++;
			LC --;
			goto Proc;
		}
		
        
        if(LE > 0)
        {
            #if 0   // LE need not be sent
                /* send le ? */
                if(j > 0)
                {
                    i = IccWrite(&LE, 1);
                    if(i < 1)
                    {
                        #ifdef DEBUGICCCMD
                        ComWrite("\xcb", 1);
                        #endif
    
                        return 0;
                    }
                    j = 0;
                    goto Proc;
                }
            #endif
            
            
            i = IccRead((rsp->DAT)+k, 1);          // get response.data
            if(i < 1)
    		{
                #ifdef DEBUGICCCMD
                ComWrite("\xba", 1);
                #endif
    
    	        return 0;
    		}
    		
    		k ++;
    		LE --;
    	}
		
		goto Proc;
		
		#if 0
            i = IccRead(rsp->SW, 2);            // get response.sw1~sw2
            if(i < 2)
    		{
                #ifdef DEBUGICCCMD
                ComWrite("\xa9", 1);
                #endif
    
    	        return 0;
    		}
        	rsp->len = k;
        #endif
    }
    else if(proc_char == 0x6c)                        /* incorect lenght P3 */
    {
        i = IccRead(&proc_char, 1);
        if(i < 1)
		{
            #ifdef DEBUGICCCMD
            ComWrite("\x99", 1);
            #endif

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

	        return 0;
		}

        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->SW[1];    /* Le */
            LC = 0;
            
            goto Startsend;                 /* get response */
        }
        
        rsp->len = k;

        #if 0
    	/* ???????????? */
    	// rsp->len = 0;
    	if((proc_char & 0x90 != 0x90) && (proc_char & 0x60 != 0x60))
    	{
    	    rsp->len = IccRead(rsp->DAT+2, 248);
    	    rsp->DAT[0] = rsp->SW[0];
    	    rsp->DAT[1] = rsp->SW[1];
    	    rsp->SW[0] = rsp->DAT[rsp->len];
    	    rsp->SW[1] = rsp->DAT[rsp->len+1];
    	}
    	#endif
    }

    //rsp->ISW = rsp->SW[0];
    //rsp->ISW <<= 8;
    //rsp->ISW |= rsp->SW[1];
    return 1;                               /* command success */
}

⌨️ 快捷键说明

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