// {{{ 初始化系统参数 static int do_init_all_hardware() { int32 ret; ret = tft_init(); if (ret) { error_exit(1, "不能初始化LCD显示"); } lcd_160_clr(); ret = key_led_init(); if (ret) { error_exit(1, "不能初始化keyboard"); } //led_dis_clear(); RFDEV = dc_init_rf(); if (RFDEV < 0) { error_exit(1, "不能初始化射频卡模块"); } dc_config_card(RFDEV, 'A'); if (dc_typeb_timeout(RFDEV, 9)) { error_exit(1, "dc_typeb_timeout错误"); } ret = fs_print_init(); if (ret) { p16log(LOG_ERROR, "不能初始化打印机模块"); } SAMDEV = dc_int_sam(); if (SAMDEV < 0) { p16log(LOG_ERROR, "不能初始化SAM模块,%d", SAMDEV); } return 0; }
// function cpucard_cmd static int KSAPI cpucard_cmd(ks_reader_dev_t *dev,ks_cpu_cmd_t *cmd,KS_CARD_TYPE t) { int ret = -1; uint8 sw1,sw2; char szCmd[256]; char ats[200] = {0}; ks_cpu_cmd_t innerCmd; cmd->cmd_retcode=0; assert(dev != NULL); if(!g_dev_hd) { strcpy(gErrMsg,"读卡器端口未打开"); strcpy(cmd->cmd_retmsg,gErrMsg); return KS_PORT_NOTOPEN; } int recvlen; if(t == KS_CPUCARD || t == KS_FIXCARD) { // 非接触式 if(dev->cpuport == CARDSLOT_RF) { if(cmd->cmd_type == 0) { //1 //char sendBuf[512] = {0}; unsigned char cmpBuf[100] = {0}; int cmpLen = 0; char recvBuf[512] = {0}; int recvLen = 0; unsigned char* RevTemp = NULL; hex2dec("0084000004", 10, cmpBuf, cmpLen); if ( !memcmp(cmpBuf, cmd->send_buf, cmpLen) ) { ret = CPUCARD_APDU(g_dev_hd,"0084000004", recvBuf, gErrMsg); } else { //dec2hex(cmd->send_buf, cmd->send_len, sendBuf); ret = CPUCARD_APDU(g_dev_hd, (char*)cmd->send_buf, recvBuf, gErrMsg); } recvLen = strlen(recvBuf); RevTemp = cmd->recv_buf; hex2dec((char*)recvBuf, recvLen, cmd->recv_buf, (int&)cmd->recv_len); cmd->recv_buf = RevTemp; } else { //2 unsigned char ucCmd[512]; int iCmdLen=0; unsigned char* RevTemp = NULL; //hex2dec((char*)cmd->send_buf,cmd->send_len,ucCmd,iCmdLen); if ( !strncmp("00B09500", (char*)cmd->send_buf, 8) ) { strcat((char*)cmd->send_buf, "14"); } ret = CPUCARD_APDU(g_dev_hd,(char*)cmd->send_buf , (char*)ucCmd, gErrMsg); iCmdLen = strlen((char*)ucCmd); memcpy(cmd->recv_buf,ucCmd,cmd->recv_len); RevTemp = cmd->recv_buf; hex2dec((char*)ucCmd, iCmdLen, cmd->recv_buf, (int&)cmd->recv_len); cmd->recv_buf = RevTemp; } } else { //GET_DECARD_SLOT(dev,dev->cpuport); if(cmd->cmd_type == 0) { //3 char recvBuf[512] = {0}; int recvLen = 0; unsigned char* RevTemp = NULL; ret = SAMCAR1_APDU(g_dev_hd, (char*)cmd->send_buf, (char*)recvBuf, gErrMsg); recvLen = strlen(recvBuf); RevTemp = cmd->recv_buf; hex2dec((char*)recvBuf, recvLen, cmd->recv_buf, (int&)cmd->recv_len); cmd->recv_buf = RevTemp; } else { //4 //unsigned char ucCmd[512]; //int iCmdLen=0; char recvBuf[512] = {0}; int recvLen = 0; unsigned char* RevTemp = NULL; //hex2dec((char*)cmd->send_buf,cmd->send_len,ucCmd,iCmdLen); ret = SAMCAR1_APDU(g_dev_hd, (char*)cmd->send_buf, (char*)recvBuf, gErrMsg); recvLen = strlen(recvBuf); RevTemp = cmd->recv_buf; hex2dec((char*)recvBuf, recvLen, cmd->recv_buf, (int&)cmd->recv_len); cmd->recv_buf = RevTemp; } } } else if(t == KS_SIMCARD) { #if 0 unsigned char ucCmd[512]; int iCmdLen=0; ucCmd[0] = 0xA2; ucCmd[1] = 0x33; if(cmd->cmd_type == 0) { memcpy(ucCmd+2,cmd->send_buf,cmd->send_len); iCmdLen = cmd->send_len + 2; ret = send_rfsim_cmd(ucCmd,iCmdLen,cmd->recv_buf,(unsigned char*)&recvlen); cmd->recv_len=recvlen; } else { hex2dec((char*)cmd->send_buf,cmd->send_len,ucCmd+2,iCmdLen); iCmdLen += 2; ret = send_rfsim_cmd(ucCmd,iCmdLen,cmd->recv_buf,(unsigned char*)&recvlen); cmd->recv_len=recvlen; } #else char ucCmd[512] = {0}; char reCmd[512] = {0}; int iCmdLen=0; int revLen = 0; if ( !strncmp( (char*)cmd->send_buf, "805E000207", 10) ) { strcat((char*)cmd->send_buf, "08"); cmd->send_len+=2; } if ( !strncmp( (char*)cmd->send_buf, "807400021A", 10) ) { strcat((char*)cmd->send_buf, "14"); cmd->send_len+=2; } if ( !strncmp( (char*)cmd->send_buf, "807C010212", 10) ) { strcat((char*)cmd->send_buf, "2B"); cmd->send_len+=2; } if ( !strncmp( (char*)cmd->send_buf, "8476000012", 10) ) { strcat((char*)cmd->send_buf, "04"); cmd->send_len+=2; } if (cmd->cmd_type == 0) { unsigned char* RevTemp = NULL; RevTemp = cmd->recv_buf; dec2hex(cmd->send_buf, cmd->send_len, ucCmd); ret = RFSIMCARD_APDU(g_dev_hd, ucCmd,reCmd, gErrMsg); hex2dec(reCmd, strlen(reCmd), cmd->recv_buf, (int&)cmd->recv_len); cmd->recv_buf = RevTemp; } else { unsigned char* RevTemp = NULL; RevTemp = cmd->recv_buf; if ( !strncmp("00B09500", (char*)cmd->send_buf, 8) ) { strcat((char*)cmd->send_buf, "14"); } ret = RFSIMCARD_APDU(g_dev_hd, (char*)cmd->send_buf,reCmd, gErrMsg); hex2dec(reCmd, strlen(reCmd), cmd->recv_buf, (int&)cmd->recv_len); cmd->recv_buf = RevTemp; } #endif } else { // 接触式 #if 0 //end del by chen 2012-01-16 if(dev->cpuport == CARDSLOT_RF) { return KS_CMDERROR; } else { #endif //end del by chen 2012-01-16 //GET_DECARD_SLOT(dev,dev->cpuport); if(cmd->cmd_type == 0) { //5 unsigned char cmpBuf1[100] = {0}; unsigned char cmpBuf2[100] = {0}; unsigned char cmpBuf3[100] = {0}; int cmpLen1 = 0; int cmpLen2 = 0; int cmpLen3 = 0; char recvBuf[512] = {0}; int recvLen = 0; char sendBuf[200] = {0}; char sendLen = 0; unsigned char* RevTemp = NULL; #if 1 hex2dec("80FA020020", 10, cmpBuf1, cmpLen1); if ( !(memcmp(cmpBuf1, cmd->send_buf, cmpLen1)) ) { dec2hex(cmd->send_buf, 37, sendBuf); } ret = SAMCAR1_APDU(g_dev_hd,sendBuf , recvBuf, gErrMsg); //g_flag = 1; #else hex2dec("80FA0200205F3131313131313131000000000000000000000000001EE6B790201508141000", strlen("80FA0200205F3131313131313131000000000000000000000000001EE6B790201508141000"), cmpBuf1, cmpLen1); hex2dec("80FA02002020110814000020001111110007D00013880A12D6870000000000000000000000", strlen("80FA02002020110814000020001111110007D00013880A12D6870000000000000000000000"), cmpBuf2, cmpLen2); hex2dec("80FA02002000D5C5C8FD350000000000000000000000000000000000000000000000000000", strlen("80FA02002000D5C5C8FD350000000000000000000000000000000000000000000000000000"), cmpBuf3, cmpLen3); if ( !memcmp(cmpBuf1, cmd->send_buf, cmpLen1) ) { ret = CPUCARD_APDU(g_dev_hd, "80FA0200205F3131313131313131000000000000000000000000001EE6B790201508141000", recvBuf, gErrMsg); } else if ( !memcmp(cmpBuf2, cmd->send_buf, cmpLen2) ) { ret = CPUCARD_APDU(g_dev_hd, "80FA02002020110814000020001111110007D00013880A12D6870000000000000000000000", recvBuf, gErrMsg); } else if ( !memcmp(cmpBuf3, cmd->send_buf, cmpLen3) ) { ret = CPUCARD_APDU(g_dev_hd, recvBuf, "80FA02002000D5C5C8FD350000000000000000000000000000000000000000000000000000", gErrMsg); } else { //dec2hex(cmd->send_buf, cmd->send_len, sendBuf); ret = CPUCARD_APDU(g_dev_hd, recvBuf, (char*)cmd->send_buf, gErrMsg); } #endif recvLen = strlen(recvBuf); RevTemp = cmd->recv_buf; hex2dec((char*)recvBuf, recvLen, cmd->recv_buf, (int&)cmd->recv_len); cmd->recv_buf = RevTemp; } else { //6 //unsigned char ucCmd[512]; //int iCmdLen=0; char recvBuf[512] = {0}; int recvLen = 0; unsigned char* RevTemp = NULL; //hex2dec((char*)cmd->send_buf,cmd->send_len,ucCmd,iCmdLen); if ( !strncmp((char*)cmd->send_buf, "801A040110", 10) ) { strncpy((char*)cmd->send_buf , "801A440110", 10); } ret = SAMCAR1_APDU(g_dev_hd, (char*)cmd->send_buf, (char*)recvBuf, gErrMsg); recvLen = strlen(recvBuf); RevTemp = cmd->recv_buf; hex2dec((char*)recvBuf, recvLen, cmd->recv_buf, (int&)cmd->recv_len); cmd->recv_buf = RevTemp; } //}//del by chen 2012-01-16 } if(ret) { cmd->cmd_retcode = 0; TRACE_ERR("执行指令错误,type["<<t<<"]"); GetErrMsgByErrCode(ret,gErrMsg); strcpy(cmd->cmd_retmsg,gErrMsg); return KS_CMDERROR; } //if(cmd->recv_len < 2) //{ // cmd->cmd_retcode = 0; // strcpy(cmd->cmd_retmsg,"读卡器读返回数据错误"); // cmd->cmd_retcode = 2; // return KS_CMDERROR; //} sw1 = cmd->recv_buf[cmd->recv_len-2]; sw2 = cmd->recv_buf[cmd->recv_len-1]; if(sw1 != 0x90 && sw1 != 0x61) { ret = sw1; ret = ret*256 + sw2; cmd->cmd_retcode = ret; TRACE_ERR("执行指令返回状态错误,sw["<<std::hex<<(int)sw1<<" "<<(int)sw2<<"]"); return cmd->cmd_retcode; } if(sw1 == 0x61 && sw2 != 0x00) { // 61XX ,调用 00C0 取后续数据 TRACE_ERR("自动获取后续数据"); memset(&innerCmd,0,sizeof innerCmd); innerCmd.send_len = sprintf(szCmd,"00C00000%02X",sw2); innerCmd.send_buf = (unsigned char*)szCmd; innerCmd.recv_buf = cmd->recv_buf; innerCmd.cmd_type = 1; // 16 hex ret = cpucard_cmd(dev,&innerCmd,t); if(ret==0) { cmd->recv_len = innerCmd.recv_len; } cmd->cmd_retcode = innerCmd.cmd_retcode; return ret; } return 0; } int KSAPI config_card(ks_reader_dev_t *dev,KS_CPUCARD_TYPE t) { return -1; #if 0 if(!g_dev_hd) return KS_PORT_NOTOPEN; if(t == CPUCARD_A) return dc_config_card(g_dev_hd,'A'); else return dc_config_card(g_dev_hd,'B'); #endif } int KSAPI card_type() { return g_lastCardType; } void KSAPI set_logger(void *para) { KS_Log_Tracer::instance((KS_Log_Tracer*)para); }