📄 icccmd.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 + -