?? reader.c
字號:
datas++;
}
CheckControlCode(TxCheckSum);
}
//設定用戶信息
unsigned char SetUserInfo(unsigned char *add)
{
if (write_Flash(USERINFO,add,32)==0) return 0 ;
else return 1 ;
}
//保存數據
unsigned char Save_Data()
{ unsigned char leg;
unsigned int address;
address=(u_ram.host.RxBuffer[5]*256+u_ram.host.RxBuffer[6]);//+0XE800;
if (address>0xfe00) return 1;
leg=u_ram.host.RxBuffer[3]-3;
if(write_Flash(address,&u_ram.host.RxBuffer[7],leg)==0) return 0;
else return 1;
}
//讀取數據
void R_Flash()
{ unsigned char leg,CMD_status;
unsigned int address;
address=(u_ram.host.RxBuffer[5]*256+u_ram.host.RxBuffer[6]);//+0XE800;
leg=u_ram.host.RxBuffer[7];
if (leg>90) {ReturnStatus(OutRange); return;}
CMD_status=read_Flash(address,&u_ram.host.RxBuffer[5],leg);
if(CMD_status) ReturnStatus(OutRange);
else TxOut(leg,CMD_status,&u_ram.host.RxBuffer[5]);
}
// 設定讀卡器地址
unsigned char SetAddress()
{
unsigned char i[3];
if(u_ram.host.RxBuffer[5] != 0x00)
//DATA[0]: Enable Serial Number Checking
//0x00 – Don’t check the Serial Number.
//0x01 – Check the Serial Number.
{
if(u_ram.host.RxBuffer[7] != read_byte_Flash(SERIALNUM)) return(OutRange);
else if(u_ram.host.RxBuffer[8] != read_byte_Flash(SERIALNUM+1)) return(OutRange);
else if(u_ram.host.RxBuffer[9] != read_byte_Flash(SERIALNUM+2)) return(OutRange);
else if(u_ram.host.RxBuffer[10] != read_byte_Flash(SERIALNUM+3)) return(OutRange);
else if(u_ram.host.RxBuffer[11] != read_byte_Flash(SERIALNUM+4)) return(OutRange);
else if(u_ram.host.RxBuffer[12] != read_byte_Flash(SERIALNUM+5)) return(OutRange);
else if(u_ram.host.RxBuffer[13] != read_byte_Flash(SERIALNUM+6)) return(OutRange);
else if(u_ram.host.RxBuffer[14] != read_byte_Flash(SERIALNUM+7)) return(OutRange);
}
// write_Flash(MADDRESSMCU,&u_ram.host.RxBuffer[6],1);//DATA[1]: The new Device ( Reader ) Address to be set
//SlaveADR=read_byte_Flash(MADDRESSMCU);
i[2]=u_ram.host.RxBuffer[6];
i[1]=0xaa;
i[0]=0x55;
write_Flash(BCCA,i,3);
SlaveADR=u_ram.host.RxBuffer[6];
//write_byte_Flash(MADDRESSMCU,SlaveADR);
return(0);
}
//設定通訊波特率
unsigned char SetBaudrateMCU(unsigned char Baudrate)
{
unsigned char i[2];
i[0]=SlaveADR;
i[1]=Baudrate;
if(Baudrate <= 0x05)
{
//write_Flash(MADDRESSMCU,i,2);
write_Flash(bauderate,&i[1],1);
return(0);
}
return(OutRange);
}
/*Flash 內部數據效驗
unsigned char CaulaBCC(void)
{ unsigned char i;
i= read_byte_Flash(mAddressMCU);
i^= read_byte_Flash(mAddressMCU+1);
i^= read_byte_Flash(mAddressMCU+2);
i^= read_byte_Flash(mAddressMCU+3);
return (i);
}
*/
// 系統默認參數設置
void InitialSetup(void)
{
u_ram.host.RxBuffer[0]=0X55;
u_ram.host.RxBuffer[1]=0XAA;
u_ram.host.RxBuffer[2]=0X00;
u_ram.host.RxBuffer[3]=0X5;
u_ram.host.RxBuffer[4]=0X1;
u_ram.host.RxBuffer[5]=0X00;
write_Flash(BCCA,&u_ram.host.RxBuffer[0],6);
}
void DecodeCMD_Buzzer(unsigned char mode,unsigned char *buffer)
{
switch(mode)
{
case 0:Buzzer=ON; //OFF
break;
case 1:Buzzer=OFF; //ON
break;
case 4:
Buz_T1=buffer[0];
Buz_T2=buffer[1];
Buz_T3=buffer[2];
Buz_T4=buffer[3];
Buz_Period=buffer[4];
Buz_CNT=0xFF;
Buz_Step=0;
BuzFlag=1;
}
}
/********************************************************************************************************/
/*unsigned char getrc500EEPROM(unsigned short Address)
{
unsigned char Buffer;
PcdReadE2(Address,1,&Buffer);
return(Buffer);
}
*/
//*******************************************************
//高階操作,完成對卡的14443 操作,序列號比較。密碼校驗
unsigned char MF_HL_Auth(unsigned char mode, unsigned char *snr, unsigned char Blk_Add)
{
unsigned char ReqMode,temp[5],KeyA_B,CMD_status;
if(mode & 0x01) ReqMode = 0x52;
else ReqMode =0x26;
CMD_status=Mf500PiccCommonRequest(ReqMode,temp);
if(CMD_status !=0x00)
CMD_status=Mf500PiccCommonRequest(ReqMode,temp);
if(CMD_status) // Request Error
{
if(CMD_status == MI_NOTAGERR) return (inf_nCard);
else if (CMD_status == MI_ACCESSTIMEOUT) return (TMO_ERR);
else if (CMD_status == MI_PARITYERR) return (PARITY_ERR);
else if (CMD_status == MI_BITCOUNTERR) return (BITCNT_ERR);
else return (inf_NACK);
}
CMD_status=Mf500PiccCascAnticoll(PICC_ANTICOLL1,temp);
if(CMD_status)
{
if(CMD_status == MI_NOTAGERR) return (inf_nCard);
else if(CMD_status == MI_SERNRERR) return (MF_SERNRERR);//
else if (CMD_status == MI_ACCESSTIMEOUT) return (TMO_ERR);
else if (CMD_status == MI_PARITYERR) return (PARITY_ERR);
else if (CMD_status == MI_BITCOUNTERR) return (BITCNT_ERR);
else return (inf_NACK);
}
CMD_status=Mf500PiccCascSelect(PICC_ANTICOLL1,temp);
if(CMD_status)
{
if(CMD_status == MI_NOTAGERR) return (inf_nCard);
else if(CMD_status == MI_CRCERR) return (CRC_ERR);
else if (CMD_status == MI_ACCESSTIMEOUT) return (TMO_ERR);
else if (CMD_status == MI_PARITYERR) return (PARITY_ERR);
else if (CMD_status == MI_BITCOUNTERR) return (BITCNT_ERR);
else return (inf_NACK);
}
if(mode & 0x04) KeyA_B = 0x61; //Check use KEYA or B
else KeyA_B =0x60;
CMD_status=MRC500LoadKey2(KeyA_B,Blk_Add >> 2); //Blk Address
if(CMD_status)
{
if(CMD_status == MI_NOTAGERR) return (inf_nCard);
else if (CMD_status == MI_ACCESSTIMEOUT) return (TMO_ERR);
else return (inf_NACK);
}
CMD_status=MRC500PiccAuthentication(KeyA_B,temp,Blk_Add);
if(CMD_status)
{
if(CMD_status == MI_NOTAGERR) return (inf_nCard);
else if(CMD_status == MI_AUTHERR) return (MF_AUTHERR);
else if (CMD_status == MI_ACCESSTIMEOUT) return (TMO_ERR);
else if (CMD_status == MI_BITCOUNTERR) return (BITCNT_ERR);
else return (inf_NACK);
}
if(mode & 0x02)
{
CMD_status=snr[0]^temp[3]|snr[1]^temp[2]|snr[2]^temp[1]|snr[3]^temp[0]; /*比較序列號*/
if(CMD_status) return(inf_nCard);
else;
}
{
snr[0]=temp[0];snr[1]=temp[1];snr[2]=temp[2];snr[3]=temp[3];
return CMD_status;
}
}
void return_nodata_ack(status)
{
unsigned char i;
cmd_buffer[0]=SEQ;
cmd_buffer[1]=SlaveADR;
cmd_buffer[2]=1;
cmd_buffer[3]=status;
make_xor(cmd_buffer,4);
TxFlag=1;
STX_Pointer=0;
ETX_Pointer=5;
for(i=0;i<5;i++)
{
u_ram.host.TxBuffer[i]=cmd_buffer[i];
}
RS485=1;
SBUF=2;
}
void return_guid(void)
{
unsigned char i;
cmd_buffer[0]=SEQ;
cmd_buffer[1]=SlaveADR;
cmd_buffer[2]=8;
cmd_buffer[3]=0;
memcpy(&cmd_buffer[4],&card_desuid[1],7);
make_xor(cmd_buffer,11);
TxFlag=1;
STX_Pointer=0;
ETX_Pointer=12;
for(i=0;i<12;i++)
{
u_ram.host.TxBuffer[i]=cmd_buffer[i];
}
RS485=1;
SBUF=2;
}
/*****************************************************************************************/
void funtions()
{
unsigned char CMD_status;
unsigned short HostBuffer;
unsigned char application_no[3];
unsigned char file_no;
unsigned char offset[3];
unsigned char data_len;
int deskey_address;
unsigned char status;
// unsigned char i;
EA=0;
weigandFlag=0;
switch(u_ram.host.RxBuffer[2]) //decode command code
{
// desfire
case CMD_DES_get_uid:
status =get_desfire_uid();
if (status)
return_nodata_ack(1);
else
return_guid();
break;
case CMD_DES_read:
application_no[0]=u_ram.host.RxBuffer[5];
application_no[1]=u_ram.host.RxBuffer[6];
application_no[2]=u_ram.host.RxBuffer[7];
file_no=u_ram.host.RxBuffer[8];
offset[0]=u_ram.host.RxBuffer[9];
offset[1]=u_ram.host.RxBuffer[10];
offset[2]=u_ram.host.RxBuffer[11];
data_len=u_ram.host.RxBuffer[12];
// deskey_address=key_buffer+u_ram.host.RxBuffer[13]*32;
// read_Flash(deskey_address,select_key,17);
// LED_R=1;
status=read(application_no,file_no,offset,data_len); //application_no
// LED_R=0;
if (status)
return_nodata_ack(status);
//read(0,3,1,0,0,10);
break;
case CMD_DES_savekey: //保存DESFIRE 密碼
deskey_address=key_buffer+u_ram.host.RxBuffer[5]*32;
memcpy(cmd_buffer,&u_ram.host.RxBuffer[6],17);
memcpy(select_key,cmd_buffer,17);
status=write_Flash(deskey_address,cmd_buffer,17);
if (status)
return_nodata_ack(1);
else
return_nodata_ack(0);
break;
case CMD_DES_getkey:
deskey_address=key_buffer+u_ram.host.RxBuffer[5]*32;
read_Flash(deskey_address,select_key,17);
memcpy(&cmd_buffer[4],select_key,17);
cmd_buffer[0]=SEQ;
cmd_buffer[1]=SlaveADR;
cmd_buffer[2]=18;
cmd_buffer[3]=0;
make_xor(cmd_buffer,21);
memcpy(u_ram.host.TxBuffer,cmd_buffer,22);
TxFlag=1;
STX_Pointer=0;
ETX_Pointer=22;
RS485=1;
SBUF=2;
break;
case CMD_DES_setpara:
des_app_no[0]=u_ram.host.RxBuffer[5];
des_app_no[1]=u_ram.host.RxBuffer[6];
des_app_no[2]=u_ram.host.RxBuffer[7];
des_file_no=u_ram.host.RxBuffer[8];
des_offset[0]=u_ram.host.RxBuffer[9];
des_offset[1]=u_ram.host.RxBuffer[10];
des_offset[2]=u_ram.host.RxBuffer[11];
des_read_len=u_ram.host.RxBuffer[12];
//des_key_index=u_ram.host.RxBuffer[15];
write_Flash(des_read_parameter,&u_ram.host.RxBuffer[5],9);
deskey_address=key_buffer+u_ram.host.RxBuffer[13]*32;
read_Flash(deskey_address,select_key,17);
// des_key_no=select_key[16];
return_nodata_ack(0);
break;
case CMD_ActivePort: //command code for active IO point forever
if(!SetPortActive(u_ram.host.RxBuffer[5]))
ReturnStatus(inf_ACK);
else ReturnStatus(OutRange);
break;
case CMD_GetPortStat: //command code for get I/O status.
u_ram.host.RxBuffer[6]=GetPortStatus(u_ram.host.RxBuffer[5]);
TxOut(1,0,&u_ram.host.RxBuffer[6]);
break;
case CMD_ToggleLED: //command code for toggle LED ON/OFF
CMD_status=DecodeToggleLED(&u_ram.host.RxBuffer[5]);
if (CMD_status==inf_ACK) ReturnStatus(inf_ACK);
else ReturnStatus(OutRange);
break;
case CMD_ActiveLED: //command code for ON LED forever
CMD_status=SetLED_Active(u_ram.host.RxBuffer[5]);
if (CMD_status==inf_ACK) ReturnStatus(inf_ACK);
else ReturnStatus(OutRange);
break;
case CMD_Buzzer: //Buzzer
if(u_ram.host.RxBuffer[5] < 5)
{
DecodeCMD_Buzzer(u_ram.host.RxBuffer[5],&u_ram.host.RxBuffer[6]);
ReturnStatus(inf_ACK);
}
else ReturnStatus(OutRange);
break;
case CMD_C_Ext:
CMD_status=C_Ext(u_ram.host.RxBuffer[5]);
if (CMD_status==inf_ACK) ReturnStatus(inf_ACK);
else ReturnStatus(OutRange);
break;
case CMD_LoadProgram: //程序下載
EA=1;
ReturnStatus(inf_ACK);
while(TxFlag);
u_ram.host.TxBuffer[0]=0x55;
u_ram.host.TxBuffer[1]=0xAA;
u_ram.host.TxBuffer[2]=10;
while(1);
break;
case CMD_SetAddress: //Set reader address
CMD_status=SetAddress();
TxOut(1,CMD_status,&SlaveADR);
break;
case CMD_SetBaudrate: //Set reader baudrate//
EA=1;
CMD_status=SetBaudrateMCU(u_ram.host.RxBuffer[5]);
// u_ram.host.RxBuffer[5]=read_byte_Flash(bauderate);
TxOut(1,CMD_status,&u_ram.host.RxBuffer[5]);
// return_nodata_ack(CMD_status);
while(TxFlag); //wait the txout command complete;
if(CMD_status == 0x00)
{
delay(3);
InitialUART(read_byte_Flash(bauderate)); //for 22.1184MHz
}
break;
case CMD_SetSerialNum: //Set reader serial number
if(write_Flash(SERIALNUM,&u_ram.host.RxBuffer[5],8) ==0x00) ReturnStatus(inf_ACK);
else ReturnStatus(Fail);
break;
case CMD_GetSerialNum: //Get reader serial number
CMD_status=read_Flash(SERIALNUM,&u_ram.host.RxBuffer[6],8);
u_ram.host.RxBuffer[14]=0;
u_ram.host.RxBuffer[15]=SlaveADR;
if (CMD_status) ReturnStatus(Fail);
else TxOut(10,CMD_status,&u_ram.host.RxBuffer[6]);
break;
case CMD_Weigand: //Weigand 控制
weigandFlag=u_ram.host.RxBuffer[5];
CMD_status=write_Flash(WEIGAND26,&u_ram.host.RxBuffer[5],1) ;
if(CMD_status==0)
ReturnStatus(inf_ACK);
else ReturnStatus(Fail);
break;
case CMD_WeigandActive: //Weigand 控制
weigandFlag=u_ram.host.RxBuffer[5];
ReturnStatus(inf_ACK);
break;
case CMD_Set_User_Info: //設定用戶信息
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -