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

📄 s4442.c

📁 SIMENS 4442逻辑加密IC应用例程
💻 C
字号:
//==============================================================
//
//                        RICOM Co.,Ltd.
//                      (c) Copyright 2001
//
//      PRODUCT   :  RICOM Base Application in C
//
//      COMPONENT :  MagIc1800
//
//      FILENAME  :  menuapp.c
//
//      HISTORY   :
//
//        DATE         AUTHOR       COMMENT
//      --------     ----------    ---------------
//      03/06/20     WangWenJun    Program created
//
//==============================================================
#include <am.h>
#include <pub_os.h>
#include <pub_sc.h>

#include "pm.h"
#include "kbdapi.h"
#include "typedef.h"
#include "slclock.h"
#include "ext.h"
#include "var.h"
#include "utility.h"
#include "se2k.h"



/* -- External Routines -- */
char _loadds Reset(void);
char _loadds CardInfo(void);
char _loadds ReadM(void);
char _loadds Present(void);

char _loadds TscPresent(void);

char _loadds CardCmd(void);

char _loadds Mem_query(void);
char _loadds Mem_write(void);
char _loadds Writemem(void);

/* -- External Variables -- */

/* -- Function prototype -- */

/* -- Local Variables -- */

HIERARCHY MsgFuncMenu[] =                              // 2K version
{
   { 0,  "MEMORY卡测试"      ,   NULL},                // level 0
   { 0,  "复位"              ,   Reset},               // level 0
   { 0,  "CARD INFO"         ,   CardInfo},            // level 0
   { 0,  "write"             ,   Writemem},           // level 0 
   { 0,  "READ M"            ,   ReadM},               // level 0   
   { 0,  "Present"           ,   Present},             // level 0         
   { 0,  "Tsc Present"       ,   TscPresent},          // level 0      
   { 0,              NULL,   NULL}                     // end of the menu
};

char _loadds Reset(void)
{
  BYTE bStatus;

  ClearDisplay(LINEA);
  memset(abBuffer, 0xff, sizeof(abBuffer));
  if ((bStatus = SE2KReset(CUSTOMER_SC_RDR, abBuffer)) == SE2K_OK) {        
    Split(abKbdBuf, abBuffer, 40);
    OS_DisplayString(LINE2, 0, 16, abKbdBuf);
    OS_DisplayString(LINE3, 0, 16, &abKbdBuf[16]);    
    OS_DisplayString(LINE4, 0, 16, &abKbdBuf[32]);    
  } else {    
    Bin2Dec(bStatus, abBuffer, 2);
    OS_DisplayString(LINE2, 0, 6, "失败: ");
    OS_DisplayString(LINE2, 6, 2, abBuffer);
  }
  BeepDelay(0, 0);
  return OS_OK;
}

char _loadds CardInfo(void)
{
  BYTE bStatus;
  SE2K_INFO_STRUCT Se2kInfo;


  ClearDisplay(LINEA);  
  if ((bStatus = SE2K_CardInfo(CUSTOMER_SC_RDR, &Se2kInfo)) == SE2K_OK) {  	
    OS_DisplayString(LINE2, 0, 16, Se2kInfo.version);  
    OS_DisplayString(LINE3, 0, 1, &Se2kInfo.version[16]);  
  } else {
    Bin2Dec(bStatus, abBuffer, 2);
    OS_DisplayString(LINE2, 0, 6, "失败: ");
    OS_DisplayString(LINE2, 6, 2, abBuffer);
  }
  BeepDelay(0, 0);
  return OS_OK;
}


//VERIFY PIN 
//4442有MM, SM和PM 3个记录区, 其中MM区读任意, 写受密码保护; SM区是安全
//记录区, 一共4个字节,第1个字节是计数器, 后3个字节保存


char _loadds Writemem(void)
{
     BYTE buf[100], buf1[200], sle_pin[4];
     BYTE bStatus;
     TSCMDSYNC_SE2K tsc_read = {SE2K_READ_S , 4 , 0 , buf} ,tsc_write,tsc_psc;
	 BYTE result;

     if (SC_CardInserted(CUSTOMER_SC_RDR, 5*SEC) == FALSE) 
       return 5;

     //使读卡器有效
     if (SC_CardDetect(CUSTOMER_SC_RDR, TRUE) == SC_ERROR) {
       return 0;
     }

     memcpy(sle_pin, "\x68\x06\x28",3);
 	  
//step 1 reset
     memset(abBuffer, 0xff, sizeof(abBuffer)); 
     bStatus = SE2KReset(CUSTOMER_SC_RDR, abBuffer);

     if (bStatus!=SE2K_OK)
       return 6;

//step 2 read sm
     memset(buf,'1',sizeof(buf));
     buf[0]=0;
     bStatus = SE2K_Cmd (CUSTOMER_SC_RDR, &tsc_read) ;
         
     if (bStatus!=SE2K_OK) 
       return 4;
        	
     //debug
     memset(abBuffer,0x00,16);
     Split(abBuffer,buf,4);
     OS_DisplayString(LINE2, 0, 3, "SM:");
     OS_DisplayString(LINE2, 3, 8, abBuffer); 
     BeepDelay(0,0);

//step 3 verify pin
      tsc_psc.wOrder=SE2K_PSC;
      tsc_write.wByteLen=0;
      tsc_write.wByteAdd=0;
      tsc_psc.pbBuff=sle_pin;
      bStatus = SE2K_Cmd (CUSTOMER_SC_RDR, &tsc_psc) ;
  
      if (bStatus!=SE2K_OK) 
        return 10;

//step 4 write mm       
     memset(abBuffer, 0xFF, sizeof(abBuffer));
     tsc_write.wOrder=SE2K_UPDATE_M;
     tsc_write.wByteLen=5;
     tsc_write.wByteAdd=40;
     tsc_write.pbBuff  =abBuffer;
     bStatus = SE2K_Cmd (CUSTOMER_SC_RDR, &tsc_write) ;


     memset(abKbdBuf, 0, sizeof(abKbdBuf));
     OS_DisplayString(LINE3, 0, 16, "PLEASE ENTER :  ");
     if (Getkbd(NUMERIC_INPUT+FIX_LEN+ECHO, 10) == FALSE) {
       return 5;
     } else
       Compress(abBuffer, &abKbdBuf[1], 5);     
     
     tsc_write.wOrder=SE2K_UPDATE_M;
     tsc_write.wByteLen=5;
     tsc_write.wByteAdd=40;
     tsc_write.pbBuff  =abBuffer;
     bStatus = SE2K_Cmd (CUSTOMER_SC_RDR, &tsc_write) ;
     if (bStatus!=SE2K_OK) 
	  return 5;

//step 5 read mm
      memset(buf1,'-',10);
      tsc_read.wOrder=SE2K_READ_M;
      tsc_read.wByteLen=5;
      tsc_read.wByteAdd=40;
      tsc_read.pbBuff=buf1;
      bStatus = SE2K_Cmd (CUSTOMER_SC_RDR, &tsc_read) ;
      if (bStatus!=SE2K_OK) 
        return 4;

      memset(abBuffer, '-', 80);
      Split( abBuffer, buf1, 5);
      OS_DisplayString(LINE4-1, 0, 10, abBuffer);
      BeepDelay(0, 0);
      	
      return OS_OK;
}



char _loadds ReadM(void)
{
  BYTE bStatus, bI;
  TSCMDSYNC_SE2K tsc_read = {SE2K_READ_M , 256 , 0 , TxMsg.abContent} ; 

  ClearDisplay(LINEA);
  /*Read 12 1st bytes of main memory */ 
  bStatus = SE2K_Cmd (CUSTOMER_SC_RDR, &tsc_read) ; 
  if (bStatus == SE2K_OK) { 
    for (bI = 0; bI< 4; bI++) {
    ClearDisplay(LINEA);
    Split(abKbdBuf, &TxMsg.abContent[bI*64], 16);
    OS_DisplayString(LINE1-1, 0, 16, abKbdBuf);    
    OS_DisplayString(LINE1, 0,   16, &abKbdBuf[16]);    

    Split(abKbdBuf, &TxMsg.abContent[bI*64+16], 16);
    OS_DisplayString(LINE2-1, 0, 16, abKbdBuf);    
    OS_DisplayString(LINE2, 0,   16, &abKbdBuf[16]);    

    Split(abKbdBuf, &TxMsg.abContent[bI*64+32], 16);
    OS_DisplayString(LINE3-1, 0, 16, abKbdBuf);    
    OS_DisplayString(LINE3, 0,   16, &abKbdBuf[16]);    

    Split(abKbdBuf, &TxMsg.abContent[bI*64+48], 16);
    OS_DisplayString(LINE4-1, 0, 16, abKbdBuf);    
    OS_DisplayString(LINE4, 0,   16, &abKbdBuf[16]);    

    BeepDelay(0, 0);
    }
  } else {
    Bin2Dec(bStatus, abBuffer, 2);
    OS_DisplayString(LINE2, 0, 6, "失败: ");
    OS_DisplayString(LINE2, 6, 2, abBuffer);
  }
  
  BeepDelay(0,0);  
  return OS_OK;
}

char _loadds Present(void)
{
  BYTE bStatus;
	
  bStatus = SE2KPresent(CUSTOMER_SC_RDR);	

  ClearDisplay(LINEA);
  if (bStatus == SE2K_OK) { 
    OS_DisplayString(LINE2, 0, 6, "成功 ");
  } else {
    Bin2Dec(bStatus, abBuffer, 2);
    OS_DisplayString(LINE2, 0, 6, "失败: ");
    OS_DisplayString(LINE2, 6, 2, abBuffer);
  }
  BeepDelay(0, 0);

}

char _loadds TscPresent(void)
{
  BYTE bStatus;
  	
  /* Present SECURITY Code */
  BYTE abCode[3] = {0x68, 0x06, 0x28} ;
  TSCMDSYNC_SE2K tsc_present = {SE2K_PSC , 0 , 0 , abCode} ;   

  bStatus = SE2K_Cmd (CUSTOMER_SC_RDR, &tsc_present) ; 

  if (bStatus == SE2K_OK) { 
    ClearDisplay(LINEA);
    Split(abKbdBuf, &TxMsg.abContent[0], 3);
    OS_DisplayString(LINE1-1, 0, 6, abKbdBuf);    

  } else {
    Bin2Dec(bStatus, abBuffer, 2);
    OS_DisplayString(LINE2, 0, 6, "失败: ");
    OS_DisplayString(LINE2, 6, 2, abBuffer);
  }
  
  BeepDelay(0,0);  

}

char _loadds CardCmd(void)
{
  BYTE bStatus, bI;
  TSCMDSYNC_SE2K tsc_read = {SE2K_UPDATE_M , 0 , 0 , TxMsg.abContent} ; 

  ClearDisplay(LINEA);
  /*Read 12 1st bytes of main memory */ 
  bStatus = SE2K_Cmd (CUSTOMER_SC_RDR, &tsc_read); 
  if (bStatus == SE2K_OK) { 
    ClearDisplay(LINEA);
    Split(abKbdBuf, TxMsg.abContent, 16);
    OS_DisplayString(LINE1-1, 0, 16, abKbdBuf);    
    OS_DisplayString(LINE1, 0,   16, &abKbdBuf[16]);    

    Split(abKbdBuf, &TxMsg.abContent[16], 16);
    OS_DisplayString(LINE2-1, 0, 16, abKbdBuf);    
    OS_DisplayString(LINE2, 0,   16, &abKbdBuf[16]);    
  } else {
    Bin2Dec(bStatus, abBuffer, 2);
    OS_DisplayString(LINE2, 0, 6, "失败: ");
    OS_DisplayString(LINE2, 6, 2, abBuffer);
  }
  
  BeepDelay(0,0);  
  return OS_OK;
}

void menuApp(void)
{
  ManMenuRun(MsgFuncMenu);
}

⌨️ 快捷键说明

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