?? iccard.c
字號:
Cpu_card_comm.Serial_Buffer[2] = file_id | 0x80 ;
Cpu_card_comm.Serial_Buffer[3] = s_pos & 0xff;
Cpu_card_comm.Serial_Buffer[4] = w_len;
CPU_card_send_command(0, 5);
CPU_card_read_response(1);
CPU_card_send_command(5, w_len);
CPU_card_read_response(2);
Cpu_card_comm.selectDevice = old_dev;
if( ( Cpu_card_comm.Serial_Buffer[0] != 0x90 )||( Cpu_card_comm.Serial_Buffer[1] != 0x00 ) )
{
return ERROR;
}
return OK;
}
uchar IC_write_file_ex(uchar sel_dev, ushort s_pos, uchar w_len)
{
uchar old_dev = Cpu_card_comm.selectDevice;
Cpu_card_comm.selectDevice = sel_dev;
Cpu_card_comm.Serial_Buffer[0] = 0x0;
Cpu_card_comm.Serial_Buffer[1] = 0xd6;
Cpu_card_comm.Serial_Buffer[2] = (uchar)(s_pos >> 8);
Cpu_card_comm.Serial_Buffer[3] = (uchar)(s_pos & 0xff);
Cpu_card_comm.Serial_Buffer[4] = w_len;
CPU_card_send_command(0, 5);
CPU_card_read_response(1);
CPU_card_send_command(5, w_len);
CPU_card_read_response(2);
Cpu_card_comm.selectDevice = old_dev;
if( ( Cpu_card_comm.Serial_Buffer[0] != 0x90 ) ||( Cpu_card_comm.Serial_Buffer[1] != 0x00 ) )
{
return ERROR;
}
return OK;
}
uchar ESAM_update_key(void)
{
uchar old_dev = Cpu_card_comm.selectDevice;
Cpu_card_comm.selectDevice = SEL_ESAM;
Cpu_card_comm.Serial_Buffer[0] = 0x84;
Cpu_card_comm.Serial_Buffer[1] = 0xd4;
Cpu_card_comm.Serial_Buffer[2] = 0x01;
Cpu_card_comm.Serial_Buffer[3] = 0xff;
Cpu_card_comm.Serial_Buffer[4] = 0x18;
memcpy(Cpu_card_comm.Serial_Buffer + IC_WRITE_START_ADDR, IC_ESAM_KEY_BUFFER, IC_KEY_LEN);
CPU_card_send_command(0, 5);
CPU_card_read_response(1);
CPU_card_send_command(IC_WRITE_START_ADDR, IC_KEY_LEN);
CPU_card_read_response(2);
Cpu_card_comm.selectDevice = old_dev;
if( ( Cpu_card_comm.Serial_Buffer[0] != 0x90 ) ||( Cpu_card_comm.Serial_Buffer[1] != 0x00 ) )
{
return ERROR;
}
return OK;
}
uchar ESAM_read_MAC(uchar file_id, uchar start_pos, uchar len)
{
uchar old_dev = Cpu_card_comm.selectDevice;
Cpu_card_comm.selectDevice = SEL_ESAM;
Cpu_card_comm.Serial_Buffer[0] = 0x04;
Cpu_card_comm.Serial_Buffer[1] = 0xB0;
Cpu_card_comm.Serial_Buffer[2] = 0x80|file_id;
Cpu_card_comm.Serial_Buffer[3] = start_pos;
Cpu_card_comm.Serial_Buffer[4] = 0x11;
memcpy(&Cpu_card_comm.Serial_Buffer[IC_WRITE_START_ADDR], IC_CPU_RAND_DATA, 4);
Cpu_card_comm.Serial_Buffer[9] = 0x04;
Cpu_card_comm.Serial_Buffer[10] = 0xd6;
Cpu_card_comm.Serial_Buffer[11] = 0x80|file_id;
Cpu_card_comm.Serial_Buffer[12] = start_pos;
Cpu_card_comm.Serial_Buffer[13] = len + 4;
memcpy(&Cpu_card_comm.Serial_Buffer[14], IC_ATR_DATA, 8);
CPU_card_send_command(0, 5);
CPU_card_read_response(1);
CPU_card_send_command(IC_WRITE_START_ADDR, 0x11);
CPU_card_read_response(2);
Cpu_card_comm.selectDevice = old_dev;
if( ( Cpu_card_comm.Serial_Buffer[0] != 0x61 ) )
{
return ERROR;
}
return OK;
}
uchar ESAM_spread_pwd(uchar auth_type)
{
uchar old_dev = Cpu_card_comm.selectDevice;
Cpu_card_comm.selectDevice = SEL_ESAM;
Cpu_card_comm.Serial_Buffer[0] = 0x80;
Cpu_card_comm.Serial_Buffer[1] = 0xFA;
Cpu_card_comm.Serial_Buffer[2] = 0;
Cpu_card_comm.Serial_Buffer[3] = auth_type;
Cpu_card_comm.Serial_Buffer[4] = 0x08;
memcpy(&Cpu_card_comm.Serial_Buffer[IC_WRITE_START_ADDR], IC_ATR_DATA, 8 );
CPU_card_send_command(0, 5);
CPU_card_read_response(1);
CPU_card_send_command(IC_WRITE_START_ADDR, 8);
CPU_card_read_response(2);
Cpu_card_comm.selectDevice = old_dev;
if( ( Cpu_card_comm.Serial_Buffer[0] != 0x90 ) ||( Cpu_card_comm.Serial_Buffer[1] != 0x00 ) )
{
return ERROR;
}
return OK;
}
uchar ESAM_encrypt_rand8(void)
{
uchar old_dev = Cpu_card_comm.selectDevice;
Cpu_card_comm.selectDevice = SEL_ESAM;
Cpu_card_comm.Serial_Buffer[0] = 0x80;
Cpu_card_comm.Serial_Buffer[1] = 0xFA;
Cpu_card_comm.Serial_Buffer[2] = 0;
Cpu_card_comm.Serial_Buffer[3] = 0x00;
Cpu_card_comm.Serial_Buffer[4] = 0x08;
memcpy( &Cpu_card_comm.Serial_Buffer[IC_WRITE_START_ADDR], IC_CPU_RAND_DATA, 8 );
CPU_card_send_command(0, 5);
CPU_card_read_response(1);
CPU_card_send_command(IC_WRITE_START_ADDR, 8);
CPU_card_read_response(2);
Cpu_card_comm.selectDevice = old_dev;
if( ( Cpu_card_comm.Serial_Buffer[0] != 0x61 ) ||( Cpu_card_comm.Serial_Buffer[1] != 0x08 ) )
{
return ERROR;
}
return OK;
}
uchar ESAM_external_auth(void)
{
uchar old_dev = Cpu_card_comm.selectDevice;
Cpu_card_comm.selectDevice = SEL_ESAM;
Cpu_card_comm.Serial_Buffer[0] = 0x00;
Cpu_card_comm.Serial_Buffer[1] = 0x82;
Cpu_card_comm.Serial_Buffer[2] = 0;
Cpu_card_comm.Serial_Buffer[3] = 0x05;
Cpu_card_comm.Serial_Buffer[4] = 0x10;
memcpy( &Cpu_card_comm.Serial_Buffer[IC_WRITE_START_ADDR], IC_CPU_ENCRYPT_DATA, 8 );
memcpy( &Cpu_card_comm.Serial_Buffer[IC_WRITE_START_ADDR+8], IC_ATR_DATA, 8 );
CPU_card_send_command(0, 5);
CPU_card_read_response(1);
CPU_card_send_command( IC_WRITE_START_ADDR, 16 );
CPU_card_read_response(2);
Cpu_card_comm.selectDevice = old_dev;
if( ( Cpu_card_comm.Serial_Buffer[0] != 0x90 ) ||( Cpu_card_comm.Serial_Buffer[1] != 0x00 ) )
{
return ERROR;
}
return OK;
}
uchar UNIC_internal_auth_proc(void)
{
if( ESAM_spread_pwd(AUTH_CPU_INTERNAL) != OK )
{
test_value = 1;
return ERROR;
}
if( IC_get_rand_data(SEL_CARD, 8) != OK )
{
test_value = 2;
return ERROR;
}
if( IC_internal_auth(AUTH_CPU_INTERNAL) != OK )
{
test_value = 3;
return ERROR;
}
if( IC_get_data_back(SEL_CARD, 8) != OK )
{
test_value = 4;
return ERROR;
}
memcpy( IC_CPU_ENCRYPT_DATA, &Cpu_card_comm.Serial_Buffer[1], 8 );
if( ESAM_encrypt_rand8() != OK )
{
test_value = 5;
return ERROR;
}
if( IC_get_data_back(SEL_ESAM, 8) != OK )
{
test_value = 6;
return ERROR;
}
memcpy( IC_ESAM_ENCRYPT_DATA, &Cpu_card_comm.Serial_Buffer[1], 8 );
if( OK != IsEqual( IC_ESAM_ENCRYPT_DATA, IC_CPU_ENCRYPT_DATA, 8 ) )
{
test_value = 7;
return ERROR;
}
test_value = 0;
return OK;
}
uchar UNIC_esam_external_auth_proc(void)
{
if( IC_get_rand_data(SEL_ESAM, 8) != OK )
{
return ERROR;
}
if( IC_internal_auth(AUTH_ESAM_EXTERNAL) != OK )
{
return ERROR;
}
if( IC_get_data_back(SEL_CARD, 8) != OK )
{
return ERROR;
}
memcpy( IC_CPU_ENCRYPT_DATA, &Cpu_card_comm.Serial_Buffer[1], 8 );
if( ESAM_external_auth() != OK )
{
return ERROR;
}
return OK;
}
uchar UNIC_ic_external_auth_proc(void)
{
if( ESAM_spread_pwd(AUTH_CPU_EXTERNAL) != OK )
{
return ERROR;
}
if( IC_get_rand_data(SEL_CARD, 8) != OK )
{
return ERROR;
}
if( ESAM_encrypt_rand8() != OK )
{
return ERROR;
}
if( IC_get_data_back(SEL_ESAM, 8) != OK )
{
return ERROR;
}
memcpy( IC_ESAM_ENCRYPT_DATA, &Cpu_card_comm.Serial_Buffer[1], 8 );
if( IC_external_auth() != OK )
{
return ERROR;
}
return OK;
}
void ICCardPolling(void)
{
unsigned char cd_code = OK, *recv_buf;
unsigned char read_len, err_num = 0;
recv_buf = &Cpu_card_comm.Serial_Buffer[1];
CPU_CARD_IC_DIR = IC_IO_DIR_INPUT;
if( CPU_CARD_IC )
{
card_in_slot = 0;
IC_Card_flag = 0;
return;
}
if( card_in_slot ) return;
card_in_slot = 1;
//等待一段時間以消除干擾
Delay20ms(2);
if( CPU_CARD_IC )
{
card_in_slot = 0;
IC_Card_flag = 0;
return;
}
BEGIN_CARD_PROC:
ClrWdt();
MemsetZero( cd_data, ICCARD_MAX_DLEN );
Cpu_card_comm.selectDevice = SEL_ESAM;
CPUCardReset();
CPU_card_read_response(RESET_RESPONSE_DATA_NUBER);
if( Cpu_card_comm.FramePointer != RESET_RESPONSE_DATA_NUBER )
{
err_num++;
if( err_num < MAX_READ_CARD_NUM )
{
goto BEGIN_CARD_PROC;
}
else
{
cd_code = EPM_E__1;
goto ICCard_End;
}
}
Cpu_card_comm.selectDevice = SEL_CARD;
CPUCardReset();
CPU_card_read_response(RESET_RESPONSE_DATA_NUBER);
if( Cpu_card_comm.FramePointer != RESET_RESPONSE_DATA_NUBER )
{
err_num++;
cd_code = EPM_E__2;
goto ICCard_End;
}
if( IC_get_ATR() != OK )
{
err_num++;
cd_code = EPM_E__12;
goto ICCard_End;
}
if( IC_select_file(SEL_TYPE_DF, 0x3f01) != OK )
{
err_num++;
cd_code = EPM_E__9;
goto ICCard_End;
}
#if 0
if( ( cd_code = UNIC_ic_external_auth_proc() ) != OK )
{
cd_code = EPM_E__8;
goto ICCard_End;
}
#endif
//讀取主電表應用文件
if( OK != IC_read_file( SEL_CARD, 1, 0, 3 ) )
{
err_num++;
cd_code = EPM_E__4;
goto ICCard_End;
}
if( ( recv_buf[0] != 0x68 ) )
{
err_num++;
cd_code = EPM_E__27;
goto ICCard_End;
}
//判斷是否為修改密鑰卡
if( recv_buf[1] == 0x06)
{
goto Update_key;
}
read_len = recv_buf[2];
//如果文件內容過長,則異常退出
if( read_len > MAX_485_GPRS_UART_LEN )
{
err_num++;
cd_code = EPM_E__18;
goto ICCard_End;
}
Delay20ms(10);
if( OK != IC_read_file(SEL_CARD, 1, 0, read_len + 5 ) )
{
err_num++;
cd_code = EPM_E__4;
goto ICCard_End;
}
if( FRAME_END_FLAG != recv_buf[read_len + 4] )
{
err_num++;
cd_code = EPM_E__27;
goto ICCard_End;
}
//檢查校驗和
if( recv_buf[read_len + 3] != GetSum( &recv_buf[1], read_len + 2 ) )
{
err_num++;
cd_code = EPM_E__16;
goto ICCard_End;
}
Update_key:
cd_code = recv_buf[1];
Delay20ms(10);
switch(cd_code)
{
case 0x02:/* 購電卡 - 有寫卡操作 */
IC_Card_flag |= IC_CARD_BUY;
PlaySoundInfo( 3, (uchar *)&IC_SOUND_BUY[0] );
cd_code = ic_refilling();
break;
case 0x04: /* 檢查卡 */
cd_code = ic_checking();
break;
case 0x06:/* 修改密鑰卡 */
cd_code = ic_updating_pwd();
break;
case 0x83:/* 設置卡 */
IC_Card_flag |= IC_CARD_CLR;
PlaySoundInfo( 4, (uchar *)&IC_SOUND_CLR[0] );
cd_code = ic_setting();
break;
default:
cd_code = EPM_E__4;
break;
}
ICCard_End:
if( cd_code != OK )
{
err_num++;
if( err_num < MAX_READ_CARD_NUM )
{
goto BEGIN_CARD_PROC;
}
else
{
if( IC_Card_flag & IC_CARD_BUY )
{
/* 購電失敗*/
PlaySoundInfo( 1, (uchar *)&IC_SOUND_BUY_ERR[0] );
}
else
{
/* 無法識別卡*/
PlaySoundInfo( 1, (uchar *)&IC_SOUND_NOT_IDENTIFY[0] );
}
}
}
else
{
if( IC_Card_flag & IC_CARD_CLR )
{
/* 已完成清零*/
PlaySoundInfo( 1, (uchar *)&IC_SOUND_CLR_OK[0] );
}
else if( IC_Card_flag & IC_CARD_BUY )
{
/* 購電成功*/
PlaySoundInfo( 1, (uchar *)&IC_SOUND_BUY_OK[0] );
SoundData.play_ptr++;
/* 播當前剩余電量*/
PlaySoundPowerInfo(2);
}
}
Delay20ms(10);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -