📄 esam_cpu.c
字号:
uchar MAC_CARDtoESAM(uchar fileID,uchar adrCARD,uchar adrESAM, uchar len)
{
uchar i;
Get_ISOHead(E_GET_4RAMDOM);
if(ISO7816CMDAnalyse()==false) return false;
for(i=0;i<4;i++)
{
SendBuffer[i] = RecvBuffer[i];
}
SendBuffer[4] = 0x04;
SendBuffer[5] = 0xD6;
SendBuffer[6] = 0x80 +(fileID&0x0f);
SendBuffer[7] = adrESAM;
SendBuffer[8] = 0x0C+len; // 8SpreadGene+4MAC+DATA
Iso7816Head[0] = 0X04;
Iso7816Head[1] = 0XB0;
Iso7816Head[2] = 0X80+(fileID>>4);
Iso7816Head[3] = adrCARD;
Iso7816Head[4] = 0x09;
Iso7816Head[5] = TYPE_TX01+TYPE_CARD;
if(ISO7816CMDAnalyse()==false) return false;
Get_ISOHead(IC_RX_RESPONS);
ISOHEAD_LEN = len+4;
if(ISO7816CMDAnalyse()==false) return false;
for(i=0;i<8;i++)
{
SendBuffer[i] = SpreadGene[i];
}
for(i=0;i<(len+4);i++)
{
SendBuffer[8+i] = RecvBuffer[i];
}
Iso7816Head[0] = 0X04;
Iso7816Head[1] = 0XD6;
Iso7816Head[2] = 0X80+(fileID&0x0f);
Iso7816Head[3] = adrESAM;
Iso7816Head[4] = 0x0C+len; // 8SpreadGene+4MAC+DATA
Iso7816Head[5] = TYPE_TX01+TYPE_ESAM;
if(ISO7816CMDAnalyse()==false) return false;
return true;
}
/********************************************************
*
*
*********************************************************/
uchar IN_AUTHEN_all(void)
{
uchar tmp_da0[8];
uchar i;
Get_ISOHead(E_DISP_01MM);
for(i=0;i<8;i++)
{
SendBuffer[i] = SpreadGene[i];
}
if(ISO7816CMDAnalyse()==false) return false;
Get_ISOHead(IC_GET_8RAMDOM);
if(ISO7816CMDAnalyse()==false) return false;
for(i=0;i<8;i++)
{
SendBuffer[i] = RecvBuffer[i];
}
Get_ISOHead(IC_IN_AUTHENT);
if(ISO7816CMDAnalyse()==false) return false;
Get_ISOHead(IC_RX_RESPONS);
ISOHEAD_LEN = 8;
if(ISO7816CMDAnalyse()==false) return false;
for(i=0;i<8;i++)
{
tmp_da0[i] = RecvBuffer[i];
}
Get_ISOHead(E_MM_ENCRYPT);
if(ISO7816CMDAnalyse()==false) return false;
Get_ISOHead(E_RX_RESPONS);
ISOHEAD_LEN = 8;
if(ISO7816CMDAnalyse()==false) return false;
if(Cmp_TwoArry(&tmp_da0[0], &RecvBuffer[0], 8) != 0)
{
Sram.IcErr_status = ERR_IC_03;
return false;
}
return true;
}
/********************************************************
*
*
*********************************************************/
uchar EX_AUTHEN_Card(void)
{
uchar i;
for(i=0;i<8;i++)
{
SendBuffer[i] = SpreadGene[i];
}
Get_ISOHead(E_DISP_02MM);
if(ISO7816CMDAnalyse()==false) return false;
Get_ISOHead(IC_GET_8RAMDOM);
if(ISO7816CMDAnalyse()==false) return false;
for(i=0;i<8;i++)
{
SendBuffer[i] = RecvBuffer[i];
}
Get_ISOHead(E_MM_ENCRYPT);
if(ISO7816CMDAnalyse()==false) return false;
Get_ISOHead(E_RX_RESPONS);
ISOHEAD_LEN = 8;
if(ISO7816CMDAnalyse()==false) return false;
for(i=0;i<8;i++)
{
SendBuffer[i] = RecvBuffer[i];
}
Get_ISOHead(IC_EX_AUTHENT);
if(ISO7816CMDAnalyse()==false)
{
Sram.IcErr_status = ERR_IC_03;
return false;
}
return true;
}
/********************************************************
*
*
*********************************************************/
uchar EX_AUTHEN_Esam(void)
{
uchar i;
Get_ISOHead(E_GET_8RAMDOM);
if(ISO7816CMDAnalyse()==false) return false;
for(i=0;i<8;i++)
{
SendBuffer[i] = RecvBuffer[i];
}
Get_ISOHead(IC_IN_AUTHENT);
if(ISO7816CMDAnalyse()==false) return false;
for(i=0;i<8;i++)
{
SendBuffer[i] = RecvBuffer[i];
}
for(i=0;i<8;i++)
{
SendBuffer[8+i] = SpreadGene[i];
}
Get_ISOHead(E_EX_AUTHENT);
if(ISO7816CMDAnalyse()==false)
{
Sram.IcErr_status = ERR_IC_03;
return false;
}
return true;
}
/********************************************************
*
*
*********************************************************/
uchar EsamPurse_RD(void)
{
uchar i;
Get_ISOHead(IC_GET_4RAMDOM);
if(ISO7816CMDAnalyse()==false) return false;
Get_ISOHead(E_GET_8RAMDOM);
if(ISO7816CMDAnalyse()==false) return false;
for(i=0;i<8;i++)
{
SendBuffer[i] = RecvBuffer[i];
}
//??????????????????????????????????????????????
return true;
}
/********************************************************
*
*
*********************************************************/
uchar CARDPurse_INC(void)
{
uchar i;
Get_ISOHead(E_GET_4RAMDOM);
if(ISO7816CMDAnalyse()==false) return false;
Get_ISOHead(E_GET_8RAMDOM);
if(ISO7816CMDAnalyse()==false) return false;
for(i=0;i<8;i++)
{
SendBuffer[i] = RecvBuffer[i];
}
//??????????????????????????????????????????????
return true;
}
/********************************************************
* FUNCTION: get IS07816 Head data, lenth ,status.
* RENTURN: NO
* CHANGE: Iso7816Head[0].......Iso7816Head[5]
*********************************************************/
void Get_ISOHead(uchar suffix)
{
if(suffix>MAX_CMMOND_NUM) SysReset();
Iso7816Head[0] = (uchar)(IC_Apdu[suffix].Cmmond >>8);
Iso7816Head[1] = (uchar)(IC_Apdu[suffix].Cmmond);
Iso7816Head[2] = (uchar)(IC_Apdu[suffix].Parameter>>8);
Iso7816Head[3] = (uchar)(IC_Apdu[suffix].Parameter);
Iso7816Head[4] = (uchar)(IC_Apdu[suffix].Len);
Iso7816Head[5] = (uchar)(IC_Apdu[suffix].status);
}
/*******************************************************************
* FUNCTION: ISO7816 COMMAND TX and data rx
* RENTURN: true or false
********************************************************************/
uchar ISO7816CMDAnalyse(void)
{
if(CMD_Code_TX(&Iso7816Head[0]) == false) return false;
switch(Iso7816Head[5] & TYPE_TX11)
{
case TYPE_TX00: //only rx DATA,SW1,SW2
if(RX_Apdu(Iso7816Head[4]+2, Iso7816Head[5]) ==false) return false;
break;
case TYPE_TX01: // tx,and rx SW1,SW2
if(Iso7816Head[5]&TYPE_ESAM)
{
if( ESAM_Data_TX(&SendBuffer[0],Iso7816Head[4] )== false) return false;
}
else
{
if( IC_Data_TX(&SendBuffer[0],Iso7816Head[4] )== false) return false;
}
if( RX_Apdu(2,(Iso7816Head[5]&TYPE_ESAM))== false) return false;
break;
case TYPE_TX02: // tx,and rx DATA,SW1,SW2
if(Iso7816Head[5]&TYPE_ESAM)
{
if( ESAM_Data_TX(&SendBuffer[0],Iso7816Head[4] )== false) return false;
if( RX_Apdu(Iso7816Head[4]+2,TYPE_ESAM)== false) return false;
}
else
{
if( IC_Data_TX(&SendBuffer[0],Iso7816Head[4] )== false) return false;
if( RX_Apdu(Iso7816Head[4]+2,TYPE_CARD)== false) return false;
}
break;
default:
return false;
}
return true;
}
/********************************************************
* FUNCTION: recvice data from CARD OR ESAM
* RENTURN: true or false
* CHANGE: RecvBuffer[0].......RecvBuffer[lenth-1]
*********************************************************/
uchar RX_Apdu(uchar lenth, uchar type)
{
if(type&TYPE_ESAM)
{
if(ESAM_Data_RX(&RecvBuffer[0],lenth)==false) return false;
if(RecvBuffer[lenth-2] == 0x90)
{
if(RecvBuffer[lenth-1] == 0x00) return true;
return false;
}
if(RecvBuffer[lenth-2] != 0x61) return false;
if(RecvBuffer[lenth-1] == 0x00) return false;
}
else
{
if(IC_Data_RX(&RecvBuffer[0],lenth)==false) return false;
if(RecvBuffer[lenth-2] == 0x90)
{
if(RecvBuffer[lenth-1] == 0x00) return true;
return false;
}
if(RecvBuffer[lenth-2] != 0x61) return false;
if(RecvBuffer[lenth-1] == 0x00) return false;
}
return true;
}
/********************************************************
*Select Card and Type Read
* CardType=RecvBuffer[1];
*********************************************************/
uchar Judge_ICType(void)
{
uchar type;
//Select Card
SendBuffer[0] =0x3f;
SendBuffer[1] =0x01;
Get_ISOHead(CARD_SECLECT);
if(ISO7816CMDAnalyse()==false) return false;
//Read Card Type
if( NOMAC_Read(0x10+TYPE_CARD, 0x01 , &type,1)==false) return false;
RecvBuffer[0] = type;
return true;
}
/*******************************************************************
*
********************************************************************/
uchar ICCard_Check(void)
{
if(pin_ICKEY == 1)
{
Delay_ms(1);
if(pin_ICKEY == 0) return false;
Flag.even &= ~bitCardIn;
return false;
}
else
{
Delay_ms(1);
if(pin_ICKEY == 1) return false;
if(Flag.even & bitCardIn) return false;
Flag.even |= bitCardIn;
}
Sram.IcErr_status = ERR_IC_OK;
LCDStatus_Trig(DISTG_CARDIN);
BLED_Open();
dir_ICVCCCON = 0;
pin_ICVCCCON =0;
dir_ICDATA = 0;
pin_ICDATA = 1;
Delay_ms(5);
dir_ICDATA = 1;
NOP();
NOP();
if(pin_ICDATA == 1) return true;
pin_ICVCCCON =1;
Sram.IcErr_status = ERR_IC_01;
return false;
}
/*******************************************************************
*
********************************************************************/
void IC_ESAM_init(void)
{
dir_ICRST = 0;
pin_ICRST = 0;
dir_ERST = 0;
pin_ERST = 0;
TM51_Init();
}
/*******************************************************************
* 购电后电能增加函数
********************************************************************/
uchar ADD_Buy_EC(ulong tmp_buyEC;)
{
ulong tmp_ZEC;
ulong tmp_LEC;
ulong tmp_LIMITBUY;
uchar tmp_dat[4];
MEM_Read(E2P_LIMITBUY, &tmp_LIMITBUY, 0x04);
if(Sram.creditSTU == USE_CREDIT)
{
MEM_Read(E2P_ZENINT, &tmp_ZEC, 0x04);
(uchar*)(&tmp_ZEC)= Sram.Z_ENdec;
BCD4_Long(&tmp_ZEC);
if(tmp_ZEC>tmp_buyEC)
{
tmp_ZEC -= tmp_buyEC;
Long_BCD4(&tmp_dat[0], tmp_ZEC);
Sram.Z_ENdec = tmp_dat[0];
MEM_Write(E2P_ZENINT, &tmp_dat[0],4);
}
else
{
tmp_buyEC -= tmp_ZEC;
if( tmp_buyEC>tmp_LIMITBUY )
{
Sram.IcErr_status = ERR_IC_07;
return false;
}
Long_BCD4(&tmp_dat[0], tmp_buyEC);
Sram.L_ENdec = tmp_dat[0];
MEM_Write(E2P_LENINT, &tmp_dat[0],4);
}
}
else
{
MEM_Read(E2P_LENINT, &tmp_LEC, 0x04);
(uchar*)(&tmp_LEC)= Sram.L_ENdec;
BCD4_Long(&tmp_LEC);
tmp_LEC += tmp_buyEC;
if( tmp_LEC>tmp_LIMITBUY )
{
Sram.IcErr_status = ERR_IC_07;
return false;
}
Long_BCD4(&tmp_dat[0], tmp_LEC);
Sram.L_ENdec = tmp_dat[0];
MEM_Write(E2P_LENINT, &tmp_dat[0],4);
}
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -