📄 command.c
字号:
#include "dtm_v3.h"
#include "dtm.h"
#include "externdef.h"
#include "lib_AT91R40008.h"
#include <stdlib.h>
// 存放处理命令的数组
_BYTE C10H30H_RETS[]={0x03,0x1A,0x72,0x73};
_BYTE VERSION[] ={"\x1D\x10\x30\00\00WELLCOM DTM Version 3.0.0"};
_BYTE C20H30H_RETS[]={0x08,0x1A,0x72,0x73,0x00,0x05,0x20,0x30,0x00};
_BYTE C20H31H_RETS[]={0x08,0x1A,0x72,0x73,0x00,0x05,0x20,0x31,0x00};
_BYTE C20H32H_RETS[]={0x08,0x1A,0x72,0x73,0x00,0x05,0x20,0x32,0x00};
_BYTE C61H31H_RETS[]={0x08,0x1A,0x72,0x73,0x00,0x05,0x61,0x31,0x00};
_BYTE C66H31H_RETS[]={0x08,0x1A,0x72,0x73,0x00,0x05,0x66,0x31,0x00};
_BYTE C66H32H_RETS[]={0x08,0x1A,0x72,0x73,0x00,0x05,0x66,0x32,0x00};
_BYTE C70H31H_RETS[]={0x08,0x1A,0x72,0x73,0x00,0x09,0x70,0x31,0x00};
_BYTE C70H31H_RETF[]={0x08,0x1A,0x72,0x73,0x00,0x05,0x70,0x31,0x00};
_BYTE C71H31H_RETS[]={0x08,0x1A,0x72,0x73,0x00,0x0D,0x71,0x31,0x00};
_BYTE C71H31H_RETF[]={0x08,0x1A,0x72,0x73,0x00,0x05,0x71,0x31,0x00};
_BYTE C71H32H_RETS[]={0x08,0x1A,0x72,0x73,0x00,0x05,0x71,0x32,0x00};
_BYTE C80H31H_RETF[]={0x08,0x1A,0x72,0x73,0x00,0x05,0x80,0x31,0x00};
_BYTE C82H31H_RETS[]={0x08,0x1A,0x72,0x73,0x00,0x05,0x82,0x31,0x00};
_BYTE C82H33H_RETS[]={0x08,0x1A,0x72,0x73,0x00,0x05,0x82,0x33,0x00};
_BYTE C83H33H_RETS[]={0x03,0x1A,0x72,0x73};
_BYTE C83H33H_RETF[]={0x08,0x1A,0x72,0x73,0x00,0x05,0x83,0x33,0x00};
_BYTE C91H30H_RETS[]={0x03,0x1A,0x72,0x73};
_BYTE C91H30H_RETF[]={0x08,0x1A,0x72,0x73,0x00,0x05,0x91,0x30,0x00};
_BYTE C91H31H_RETS[]={0x03,0x1A,0x72,0x73};
_BYTE C91H31H_RETF[]={0x08,0x1A,0x72,0x73,0x00,0x05,0x91,0x31,0x00};
_BYTE C91H32H_RETS[]={0x03,0x1A,0x72,0x73};
_BYTE C91H32H_RETF[]={0x08,0x1A,0x72,0x73,0x00,0x05,0x91,0x32,0x00};
_BYTE C94H31H_RETS[]={0x08,0x1A,0x72,0x73,0x00,0x05,0x94,0x31,0x00};
_BYTE C94H32H_RETS[]={0x08,0x1A,0x72,0x73,0x00,0x05,0x94,0x32,0x00};
_BYTE C94H33H_RETS[]={0x08,0x1A,0x72,0x73,0x00,0x05,0x94,0x33,0x00};
_BYTE C94H34H_RETS[]={0x08,0x1A,0x72,0x73,0x00,0x05,0x94,0x34,0x00};
_BYTE C95H31H_RETS[]={0x03,0x1A,0x72,0x73};
_BYTE C95H31H_RETF[]={0x08,0x1A,0x72,0x73,0x00,0x05,0x95,0x31,0x00};
_BYTE C96H30H_RETS[]={0x08,0x1A,0x72,0x73,0x00,0x05,0x96,0x30,0x00};
_BYTE C96H31H_RETS[]={0x03,0x1A,0x72,0x73};
_BYTE C96H31H_RETF[]={0x08,0x1A,0x72,0x73,0x00,0x05,0x96,0x31,0x00};
_BYTE C97H30H_RETF[]={0x08,0x1A,0x72,0x73,0x00,0x05,0x97,0x30,0x00};
_BYTE C97H31H_RETF[]={0x08,0x1A,0x72,0x73,0x00,0x05,0x97,0x31,0x00};
_BYTE Msg_Error[] ={"\005ERROR"};
void CommandProcess(_BYTE * cpRecBuf);
_BYTE CmdSendVersion(_BYTE * cpRecBuf);
_BYTE CmdBootConnect(_BYTE * cpRecBuf);
_BYTE CmdBootDownPacket(_BYTE * cpRecBuf);
_BYTE CmdBootWriteFlash(_BYTE * cpRecBuf);
_BYTE CmdConnect(_BYTE * cpRecBuf);
_BYTE CmdFormat(_BYTE * cpRecBuf);
_BYTE CmdReadICSerialNo(_BYTE * cpRecBuf);
_BYTE CmdWriteICSerialNo(_BYTE * cpRecBuf);
_BYTE CmdGetImage(_BYTE * cpRecBuf);
_BYTE CmdVerifyMBBuf(_BYTE * cpRecBuf);
_BYTE CmdVerifyFinger(_BYTE * cpRecBuf);
_BYTE CmdGetFingerMB(_BYTE * cpRecBuf);
_BYTE CmdReadBIEFBaseInfo(_BYTE * cpRecBuf);
_BYTE CmdReadBIEFTrainInfo(_BYTE * cpRecBuf);
_BYTE CmdReadBIEFTimeInfo(_BYTE * cpRecBuf);
_BYTE CmdWriteBIEFBaseInfo(_BYTE * cpRecBuf);
_BYTE CmdWriteBIEFTrainInfo(_BYTE * cpRecBuf);
_BYTE CmdClearBIEFTrainInfo(_BYTE * cpRecBuf);
_BYTE CmdWriteBIEFTimeInfo(_BYTE * cpRecBuf);
_BYTE CmdReadDIEFLogInfo(_BYTE * cpRecBuf);
_BYTE CmdICReadBlock(_BYTE * cpRecBuf);
_BYTE CmdICWriteBlock(_BYTE * cpRecBuf);
void CommandProcess(_BYTE * cpRecBuf)
{
_BYTE cCmdByte; // 存放命令字;
_BYTE cCmdPara;
cCmdByte=cpRecBuf[5]; // 取命令字
cCmdPara=cpRecBuf[6]; // 取命令字
switch (cCmdByte) {
case 0x10: // 读程序的版本号
if (cCmdPara==0x30) CmdSendVersion(cpRecBuf);
break;
case 0x20: // 读程序的版本号
if (cCmdPara==0x30) CmdBootConnect(cpRecBuf);
if (cCmdPara==0x31) CmdBootDownPacket(cpRecBuf);
if (cCmdPara==0x32) CmdBootWriteFlash(cpRecBuf);
break;
case 0x61: // 和指纹读写器建立通信连接
if (cCmdPara==0x31) CmdConnect(cpRecBuf);
break;
case 0x66: // 重建卡文件系统
break;
case 0x71: // 读取卡号
if (cCmdPara==0x31) CmdReadICSerialNo(cpRecBuf);
if (cCmdPara==0x32) CmdWriteICSerialNo(cpRecBuf);
break;
case 0x80: // 采集指纹图像
if (cCmdPara==0x31) CmdGetImage(cpRecBuf);
break;
case 0x82: // 验证指纹模板
if (cCmdPara==0x31) CmdVerifyMBBuf(cpRecBuf);
if (cCmdPara==0x33) CmdVerifyFinger(cpRecBuf);
break;
case 0x83: // 采集指纹模板
if (cCmdPara==0x33) CmdGetFingerMB(cpRecBuf);
break;
case 0x91:
if (cCmdPara==0x30) CmdReadBIEFBaseInfo(cpRecBuf); // 读IC卡BIEF静态信息
if (cCmdPara==0x31) CmdReadBIEFTrainInfo(cpRecBuf); // 读IC卡BIEF训练信息
if (cCmdPara==0x32) CmdReadBIEFTimeInfo(cpRecBuf); // 读IC卡BIEF买钟信息
break;
case 0x94:
if (cCmdPara==0x31) CmdWriteBIEFBaseInfo(cpRecBuf); // 写IC卡BIEF静态信息
if (cCmdPara==0x32) CmdWriteBIEFTrainInfo(cpRecBuf); // 写IC卡BIEF训练信息
if (cCmdPara==0x33) CmdClearBIEFTrainInfo(cpRecBuf); // 清IC卡BIEF训练信息
if (cCmdPara==0x34) CmdWriteBIEFTimeInfo(cpRecBuf); // 写IC卡BIEF买钟信息
break;
case 0x95:
if (cCmdPara==0x31) CmdReadDIEFLogInfo(cpRecBuf); // 读一条日志文件
case 0x96:
//if (cCmdPara==0x30) CmdWriteTIEF(cpRecBuf); // 写汇总信息到IC卡中
//if (cCmdPara==0x31) CmdReadTIEF(cpRecBuf); // 读IC卡中的汇总信息
case 0x97:
if (cCmdPara==0x30) CmdICReadBlock(cpRecBuf); // 读IC卡中的数据块
if (cCmdPara==0x31) CmdICWriteBlock(cpRecBuf); // 写数据块到IC卡中
default:
break;
}
}
// 读程序版本号
// 命令:1A 72 73 00 03 10 30 CRC
// 响应: 1A 72 73 LEN(2) 10 30 00 00 VersionInfo(N) CRC
_BYTE CmdSendVersion(_BYTE * cpRecBuf)
{
_WORD wLength,i;
_WORD wSize;
wSize = 0;
gcpSendBuf[wSize++] = 0x1a;
gcpSendBuf[wSize++] = 0x72;
gcpSendBuf[wSize++] = 0x73;
// 发送长度
wLength = VERSION[0]+1;
gcpSendBuf[wSize++] = (_BYTE)(wLength/256);
gcpSendBuf[wSize++] = (_BYTE)(wLength%256);
for (i=0;i<VERSION[0];i++) { // 发送命令、参数和版本信息
gcpSendBuf[wSize++] = VERSION[i+1];
}
gcpSendBuf[wSize] = 0; // 计算检查和
for (i=0;i<wSize;i++) gcpSendBuf[wSize] += gcpSendBuf[i];
AT91F_US_SendFrame(COM1,gcpSendBuf,wSize+1);
return(C_OK);
}
void CmdDispInfo(_BYTE cIndex,_DWORD dwCurPacketSeq)
{
_DWORD dwPacketNumber;
_BYTE cpDispBuf[9];
dwPacketNumber = gdwFlashLen;
switch (cIndex) {
case 1:
DispOutText(0,0,12,(_BYTE *)" 等待下载 ");
DispOutText(2,0,13,(_BYTE *)" 下载中 ");
dwPacketNumber = (gdwFlashLen+gdwFlashLibLen+1023)/1024;
LongToString(dwCurPacketSeq,cpDispBuf,4);
cpDispBuf[4]='/';
LongToString(dwPacketNumber,cpDispBuf+5,4);
DispOutText(4,3*8,9,cpDispBuf);
DispRefresh(0,0,VIDEOPAGE,VIDEOCOL,1);
break;
}
}
// 建立BootLoader连接
// 1A 72 73 00 07 20 30 文件长度(4) CRC
_BYTE CmdBootConnect(_BYTE * cpRecBuf)
{
_WORD wSize;
_DWORD dwFileSize;
dwFileSize = cpRecBuf[7];
dwFileSize <<= 8;
dwFileSize += cpRecBuf[8];
dwFileSize <<= 8;
dwFileSize += cpRecBuf[9];
dwFileSize <<= 8;
dwFileSize += cpRecBuf[10];
gdwFlashLen = dwFileSize;
dwFileSize = cpRecBuf[11];
dwFileSize <<= 8;
dwFileSize += cpRecBuf[12];
dwFileSize <<= 8;
dwFileSize += cpRecBuf[13];
dwFileSize <<= 8;
dwFileSize += cpRecBuf[14];
gdwFlashLibLen = dwFileSize;
if (CSI.cStatus == S_TRAINING) {
wSize = SendStringComToBuf(C20H30H_RETS,C_DOWNSTATUSERROR,0x00,gcpSendBuf);
AT91F_US_SendFrame(COM1,gcpSendBuf,wSize);
return(C_DOWNSTATUSERROR);
}
if (gcpFlashBuf!=NULL) {
gcpFlashBuf = NULL;
}
gcpFlashBuf = (_BYTE *)0x420000;
if (gcpFlashBuf!=NULL) {
wSize = SendStringComToBuf(C20H30H_RETS,0x00,0x00,gcpSendBuf);
AT91F_US_SendFrame(COM1,gcpSendBuf,wSize);
DispLCDClearScreen();
gcTrainFreshFlag = 0;
gcClockFreshFlag = 0;
CmdDispInfo(1,0);
return(C_OK);
}
else {
wSize = SendStringComToBuf(C20H30H_RETS,C_NOTOK,0x00,gcpSendBuf);
AT91F_US_SendFrame(COM1,gcpSendBuf,wSize);
DispOutText(4,0,12,(_BYTE *)" 01:下载出错 ");
DispOutText(6,0,11,(_BYTE *)" 请系统重启 ");
DispRefresh(0,0,VIDEOPAGE,VIDEOCOL,1);
return(C_NOTOK);
}
}
// 数据报传输命令
// 1A 72 73 LEN(2) 20 31 包序号(2) 包长度(2) 数据包(N) CRC
_BYTE CmdBootDownPacket(_BYTE * cpRecBuf)
{
_BYTE *cpPos;
_WORD wPacketNo,wSize;
_WORD i,wPacketLen;
if (gcpFlashBuf==NULL) {
wSize = SendStringComToBuf(C20H31H_RETS,C_NOTOK,0x00,gcpSendBuf);
AT91F_US_SendFrame(COM1,gcpSendBuf,wSize);
DispOutText(6,0,12,(_BYTE *)" 02:下载出错 ");
DispRefresh(0,0,VIDEOPAGE,VIDEOCOL,1);
return(C_NOTOK);
}
wPacketNo = cpRecBuf[7]*256 + cpRecBuf[8];
wPacketLen = cpRecBuf[9]*256 + cpRecBuf[10];
cpPos = gcpFlashBuf + wPacketNo*LENOFPACKETDATA;
for (i=0;i<wPacketLen;i++)
*(cpPos+i) = cpRecBuf[11+i];
wSize = SendStringComToBuf(C20H31H_RETS,C_OK,0x00,gcpSendBuf);
AT91F_US_SendFrame(COM1,gcpSendBuf,wSize);
CmdDispInfo(1,wPacketNo+1);
return(C_OK);
}
// 写FLASH命令
// 1A 72 73 00 04 20 32 文件类型(1) CRC
_BYTE CmdBootWriteFlash(_BYTE * cpRecBuf)
{
_BYTE cFileType;
_BYTE *cpParaBuf,*cpFlash;
_BYTE cRetCode,cCalCrc,cCrc;
_WORD wSize;
_DWORD i;
_BYTE cpLenBuf[4];
cFileType = cpRecBuf[7];
cCrc = cpRecBuf[8];
cCalCrc = 0;
for (i=0;i<gdwFlashLen+gdwFlashLibLen;i++) cCalCrc +=*(gcpFlashBuf+i);
if (cCrc!=cCalCrc) {
wSize = SendStringComToBuf(C20H32H_RETS,C_FLASHCRCERR,0x00,gcpSendBuf);
AT91F_US_SendFrame(COM1,gcpSendBuf,wSize);
return(C_FLASHCRCERR);
}
cRetCode = AT91FlashCheckIdentifyID();
if (cRetCode!=C_OK) {
wSize = SendStringComToBuf(C20H32H_RETS,cRetCode,0x00,gcpSendBuf);
AT91F_US_SendFrame(COM1,gcpSendBuf,wSize);
return(cRetCode);
}
switch (cFileType) {
case 0x01: // 写BootLoader
cRetCode = AT91ChipErase();
if (cRetCode==C_OK) {
cRetCode = AT91WriteBlockToFlash((_WORD*)gcpFlashBuf,(_WORD*)FLASH_BASE,gdwFlashLen);
}
break;
case 0x02: // 写MainBlock
cpParaBuf = (_BYTE *)0x410000;
;
if (cpParaBuf==NULL) {
cRetCode = C_NOTOK;
break;
}
cpFlash = (_BYTE *)FLASH_BASE;
cpFlash += LENOFFLASHBOOTBLOCK;
for (i=0;i<LENOFFLASHPARABLOCK*2;i++) *(cpParaBuf+i) = *(cpFlash+i);
cRetCode = AT91EraseSector(0x02000); // 擦除参数块1
if (cRetCode!=C_OK) break;
cRetCode = AT91WriteBlockToFlash((_WORD*)cpParaBuf,(_WORD*)(FLASH_BASE+0x4000),LENOFFLASHPARABLOCK);
if (cRetCode!=C_OK) break;
cRetCode = AT91EraseSector(0x03000);
if (cRetCode!=C_OK) break;
cRetCode = AT91WriteBlockToFlash((_WORD*)(cpParaBuf+LENOFFLASHPARABLOCK),(_WORD*)(FLASH_BASE+0x6000),LENOFFLASHPARABLOCK);
if (cRetCode!=C_OK) break;
cRetCode = AT91EraseSector(0x3f000); // 擦除主存储块
if (cRetCode!=C_OK) break;
cRetCode = AT91WriteBlockToFlash((_WORD*)gcpFlashBuf,(_WORD*)(FLASH_BASE+0x8000),gdwFlashLen);
if (cRetCode!=C_OK) break;
// 写字库信息
cRetCode = AT91WriteBlockToFlash((_WORD*)(gcpFlashBuf+gdwFlashLen),(_WORD*)(FLASH_BASE+0x48000),gdwFlashLibLen);
if (cRetCode!=C_OK) break;
cpLenBuf[0] = (_BYTE)(gdwFlashLen); // 写长度信息到主存储块
cpLenBuf[1] = (_BYTE)(gdwFlashLen>>8);
cpLenBuf[2] = (_BYTE)(gdwFlashLen>>16);
cpLenBuf[3] = (_BYTE)(gdwFlashLen>>24);
cRetCode = AT91WriteBlockToFlash((_WORD*)cpLenBuf,(_WORD*)(FLASH_BASE+0x7FFFC),4);
break;
default:
cRetCode = C_PARAERR;
break;
}
wSize = SendStringComToBuf(C20H32H_RETS,cRetCode,0x00,gcpSendBuf);
AT91F_US_SendFrame(COM1,gcpSendBuf,wSize);
if (cRetCode==C_OK) { // 重新启动系统
DispOutText(4,0,12,(_BYTE *)" 下载成功 ");
DispOutText(6,0,12,(_BYTE *)" 系统重启 ");
DispRefresh(0,0,VIDEOPAGE,VIDEOCOL,1);
Delays(3);
MY_WD_OMR = 0x3700; // HPVC=0, MCK/8
MY_WD_CR = 0xC071; // 重新启动看门狗
MY_WD_OMR = 0x2343; // 启动看门狗,等待系统复位
while(1); // 等待看门狗溢出
}
free(gcpFlashBuf);
free(cpParaBuf);
DispOutText(4,0,12,(_BYTE *)" 03:下载出错 ");
DispOutText(6,0,11,(_BYTE *)" 请系统重启 ");
DispRefresh(0,0,VIDEOPAGE,VIDEOCOL,1);
return(cRetCode);
}
// WLFID和指纹读写器建立通信连接,61H 31H
// 命令:1A 72 73 00 03 61 31 94
// 响应:1A 72 73 00 05 61 31 00 00 CRC
_BYTE CmdConnect(_BYTE * cpRecBuf)
{
_WORD wSize;
wSize = SendStringComToBuf(C61H31H_RETS,0x00,0x00,gcpSendBuf);
AT91F_US_SendFrame(COM1,gcpSendBuf,wSize);
return(C_OK);
}
// 读取卡号
// 命令:1A 72 73 00 03 71 31 A4
// 响应:1A 72 73 00 0D 71 31 00 00 SerialNo(8) CRC
_BYTE CmdReadICSerialNo(_BYTE * cpRecBuf)
{
_BYTE cCheckSum,i;
_BYTE cRetCode;
_BYTE cpBuf[LENOFIDEF];
_WORD wSize;
cRetCode = ICCheckCardInsert();
if (cRetCode!=C_OK) {
cCheckSum = SendStringComToBuf(C71H31H_RETF,cRetCode,0x00,gcpSendBuf);
AT91F_US_SendFrame(COM1,gcpSendBuf,wSize);
return(cRetCode);
}
cRetCode = ICReadWriteIDEF(cpBuf,ICREAD);
if (cRetCode==C_OK) {
wSize = SendStringComToBuf(C71H31H_RETS,0x00,0x01,gcpSendBuf);
gcpSendBuf[wSize++] = cRetCode; // 发送返回码
for (i=0;i<LENOFIDEF-1;i++) gcpSendBuf[wSize++] = cpBuf[i]; // 发送IC卡序号
gcpSendBuf[wSize] = 0; // 计算检查和
for (i=0;i<wSize;i++) gcpSendBuf[wSize] += gcpSendBuf[i];
AT91F_US_SendFrame(COM1,gcpSendBuf,wSize+1);
return(C_OK);
}
else {
wSize = SendStringComToBuf(C71H31H_RETF,cRetCode,0x00,gcpSendBuf);
AT91F_US_SendFrame(COM1,gcpSendBuf,wSize);
return(cRetCode);
}
}
// 写IC卡卡号
// 命令: 1A 72 73 Len(2) 71 32 卡号(8) CRC
// 响应: 1A 72 73 00 05 71 32 00 00 CRC
_BYTE CmdWriteICSerialNo(_BYTE * cpRecBuf)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -