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

📄 command.c

📁 AT91fr40162的FLASH读写程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -