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

📄 commprotocol.h

📁 coldfire5206芯片的boot程序
💻 H
字号:
// CommProtocol.h: interface for the CCommProtocol class.
//
//////////////////////////////////////////////////////////////////////

#ifndef	__SLC_COMM_PROTOCOL_H__
#define __SLC_COMM_PROTOCOL_H__

#define MAX_FRAME_LENGTH 1450	// 最大帧长度
#define MAX_DATA_LENGTH	1426	// MAX_FRAME_LENGTH - 24最大数据长度,帧长度减掉帧格式和包头字段长度
#define MAX_RESEND_NUM	10		// 最大重发次数
#define FIELD_FILE_NAME_LENGTH 14
#define MIN_FRAME_LENGTH 24

#include "bastype.h"

class CCommProtocol  
{
public:
	enum PackType
	{
		CPT_DATA = 0x40,
		CPT_CMD	 = 0x80
	};
	
	enum CommEndType
	{
		CET_NOT,				// 没有结束
			CET_NORMAL,				// 正常结束
			CET_RESEND_INVALID,		// 重发无效错误
			CET_NO_DATA				// 无通讯数据错误
	};
	
	enum COMM_INDEXT_YPE
	{
		CIT_FILE, CIT_VERSION
	};
	
#pragma pack(1)
	
	typedef struct version_comm_info
	{
		UINT16	soft_no;		// 软件代号,用于实现同一系列软件的通讯
		UINT8	ver_info[4];
		UINT16  flash_no;		// FLASH的容量标志
		UINT16	module_no;
	}	VersionCommInfo;
	
	typedef struct	renew_comm_info			// 更新命令
	{
			UINT8		cResultFlag;		// 升级更新是否成功
	} RenewCommInfo;
	
	
	typedef struct file_comm_info
	{
		UINT16	file_type;		// 文件类型
		UINT16	file_no;		// 文件是这个文件传输中的第几个文件
		UINT32	lFileLength;	// 文件长度
		UINT8	file_name[FIELD_FILE_NAME_LENGTH];  // 文件名称
		UINT8*	pcFileInfo;		// 文件内容,这个缓冲是由上层给出
	}	FileCommInfo;
	
	struct comm_info
	{
		UINT16	nCommType;
		union {
			FileCommInfo	fileData;
			VersionCommInfo	verData;
			RenewCommInfo  renewData;
			UINT8			acReserved[20];
		}	commData;
	};
	typedef struct comm_info COMMINFO;
	
	enum CommType	// CST 表示发送方通讯类型,CRT表示接收方通讯类型
	{
		CT_NULL, 
			CST_START,		CRT_START,	
			CST_VERSION, 	CRT_VERSION,
			CST_FILE,		CRT_FILE, 
			CST_BREAK,		CRT_BREAK,
			CST_RENEW,		CRT_RENEW
	};
	


	protected:
		enum CommandType	{
			CMD_START		= 0x30,		// 初始化(S)	初始化,主要用于传输连接时,请求传输
				CMD_BREAK		= 0x31,		// 中断(B)	中断通讯,表示所有文件都已经传输完毕,请求中断通讯
				CMD_YES			= 0x32,		// 确认(Y)	确认,主要用于传输连接时,应答可以传输
				CMD_RESEND		= 0x33,    	// 重发(R)	重发,帧发生错误时要求重发数据		
				CMD_FILESTART	= 0x34,		// 文件开始(fS)	文件传输开始,附带文件信息,表示接下来要发送一个文件
				CMD_FILEEND		= 0x35,		// 文件结束(fE)	文件结束请求
				CMD_VERSION		= 0x36,		// 请求版本号(rV)	给出自己版本号,请求对方版本号
				CMD_RENEW		= 0x37		// 更新FLASH结果(W) 给出升级文件被更新结果
		};
		enum CommStatus	// 版本通讯过程常量
		{
			CS_NULL,
				// 发送方
				// 开始(初始化)通讯
				//		CSS_START_SEND_CMD,				// 发送开始命令
				CSS_START_WAIT_YES,				// 等待开始确认
				// 版本通讯
				//		CSS_VERSION_SEND_RV,			// 发送版本请求
				CSS_VERSION_WAIT_AV,			// 等待版本应答
				//		CSS_VERSION_SEND_YES,			// 发送接收确认
				CSS_VERSION_WAIT_YES,			// 等待结束确认
				// 文件通讯
				//		CSS_FILE_SEND_SCMD,				// 发送开始命令
				CSS_FILE_WAIT_SYES,				// 等待开始确认
				//		CSS_FILE_SEND_DATA,				// 发送数据块
				CSS_FILE_WAIT_DYES,				// 等待数据确认
				//		CSS_FILE_SEND_ECMD,				// 发送结束命令
				CSS_FILE_WAIT_EYES,				// 等待结束确认
				// 中断通讯
				//		CSS_BREAK_SEND_BCMD,			// 发送中断命令
				CSS_BREAK_WAIT_YES,				// 等待结束确认
				// 更新(写升级文件)通讯
				//		CSS_WRITE_SEND_CMD,			// 发送更新结束命令
				CSS_RENEW_WAIT_YES,				// 等待结束确认
				
				// 接收方
				// 开始(初始化)通讯
				CSR_START_WAIT_CMD,				// 等待开始命令
				//		CSR_START_SEND_YES,				// 发送确认命令
				// 版本通讯
				CSR_VERSION_WAIT_RV,			// 等待版本请求
				//		CSR_VERSION_SEND_AV,			// 发送版本应答
				CSR_VERSION_WAIT_YES,			// 等待接收确认
				//		CSR_VERSION_SEND_YES,			// 发送结束确认
				// 文件通讯
				CSR_FILE_WAIT_SCMD,				// 等待开始命令
				//		CSR_FILE_SEND_SYES,				// 发送开始确认
				CSR_FILE_WAIT_DATA,				// 等待数据块
				//		CSR_FILE_SEND_DYES,				// 发送数据确认
				CSR_FILE_WAIT_ECMD,				// 等待结束命令
				//		CSR_FILE_SEND_EYES,				// 发送结束确认	
				// 中断通讯
				CSR_BREAK_WAIT_BCMD,				// 等待中断命令
				//		CSR_BREAK_SEND_YES				// 发送结束确认
				// 更新(写升级文件)通讯
				CSR_RENEW_WAIT_CMD			// 等待更新结束命令
				//		CSR_WRITE_SEND_CMD,			// 发送更新结束确认命令
		};		
	protected:
		// -------------------------  1、命令包数据定义	------------------------------- //
		typedef	struct cmd_filestart_data	// 文件开始命令
		{
			UINT16	file_type;		// 文件类型
			UINT16	file_no;		// 文件是这个文件传输中的第几个文件
			UINT16	data_pack_num;  // 文件包含的数据包数量
			UINT8	file_name[FIELD_FILE_NAME_LENGTH];  // 文件名称
		} FSData;
		
	
		typedef struct cmd_version_data	// 应答版本命令
		{
			UINT16	soft_no;		// 软件代号,用于实现同一系列软件的通讯
			UINT8	ver_info[4];
			UINT16  flash_no;		// FLASH的容量标志
			UINT16	module_no;		// module no
		} VRData;
		
		typedef struct	cmd_resend_data			// 重发命令
		{
			UINT16	nCommType;		// 请求重发方的通讯类型
			//			UINT16	cPackType;		// 请求重发方等待的包类型
			UINT16	nPackNo;			// 命令包,命令类型;数据包,文件的第几个包
		} RSData;
		
		typedef struct	cmd_renew_data			// 更新命令
		{
			UINT8		cResultFlag;		// 升级更新是否成功
		} RNData;
		
		typedef union cmd_data		// 命令数据联合
		{
			UINT8	normal[20];	// 普通命令包,无效,可以忽略
			FSData  fs;			// 文件开始命令包数据
			VRData  ver;			// 应答版本命令包数据
			RSData	rs;			// 请求重发命令
			RNData	rn;			// 更新命令
		}	CmdData;
		
		// -------------------------   2、命令包结构定义	------------------------------- //
		typedef	struct cmd_pack
		{
			UINT8	type;			// 命令类型
			UINT8	reserved[10];	// 保留
			UINT8	length;			// 命令数据长度
			union 	// 命令数据联合
			{
				UINT8	normal[20];	// 普通命令包,无效,可以忽略
				FSData  fs;			// 文件开始命令包数据
				VRData  ver;			// 应答版本命令包数据
				RSData	rs;			// 请求重发命令
				RNData	rn;			// 更新命令
			}	info;			// 命令数据
		} CmdPack;
		
		// -------------------------   3、数据包结构定义	------------------------------- //
		typedef	struct data_pack
		{
			UINT16	no;				// 数据包序号
			UINT32	reserved;		// 保留
			UINT32	length;			// 数据包长度
			UINT16	len_check;		// 长度校验
			UINT8*	info;			// 数据内容
		} DataPack;
		
		
		// -------------------------   4、桢结构定义	------------------------------- //
		typedef struct comm_frame
		{
			UINT8		start_flag;		// 开始标志,等于0Xx7e
			UINT32		len;			// 桢长度
			UINT16		len_check;		// 长度校验
			UINT8		type;			// 包类型
			union// 包数据联合
			{
				CmdPack cmdPack;
				DataPack dataPack;
			}	pack;			// 包内容
			UINT32		check;			// 校验和
		} CommFrame;
		
#pragma pack(0)
		
	public:
		CCommProtocol(BOOL cpu_is_same = 1, UINT32 frame_size = MAX_FRAME_LENGTH);
		~CCommProtocol();
		
	protected:
	// 如果bIsDynamicSendFile = 1, 发送文件时,不再根据传入的文件指针来发送文件数据
	// 而根据指针函数GetFilePackInfo(UINT16 nPackNo),取得文件数据来发送
	// 在大文件时,使用这种方式可以减少文件缓冲所占的内存
		BOOL	m_bIsDynamicSendFile;
//		UINT32 (*m_funcDynamicGetFilePackInfo)(UINT8* pFileName, UINT16 nCurFilePackNo, UINT8* pCurFileInfo, UINT32 lLength);
		UINT32 (*m_funcDynamicGetFilePackInfo)(UINT16 nCurFilePackNo, UINT8* pCurFileInfo, UINT32 lLength);

		BOOL	m_bCpuIsSame;			// 是否需要处理(CPU对整数高低位的倒位)
		COMMINFO	m_stCommInfo;		// 通讯信息
		UINT32  m_lFileHandlePos;		// 已通讯的文件块的位置
		UINT16  m_nFilePackCount;		// 文件包的数量
		
		UINT16	m_nCommEndFlag;			// 通讯结束标志,见enum CommEndFlag
		UINT16	m_nResendNum;			// 一个通讯包的重发次数
		UINT16	m_nStatusFlag;			// 通讯状态标志,见enmu CommStatus
		
		// 有关帧的变量
		BOOL	m_bCheckoutIsRight;		// 校验是否正确
		BOOL	m_bHaveSendFrame;		// 是否有发送帧
		BOOL	m_bHaveReceiveInfo;		// 是否有上层需要的接收信息
		UINT32	m_lReceivePos;			// 接收位置
		UINT32  m_lSendSize;			// 发送帧使用大小
		UINT32  m_lReceiveSize;
		UINT8	m_acReceiveFrameInfo[MAX_FRAME_LENGTH];		// 接收桢缓冲
		UINT8	m_acSendFrameInfo[MAX_FRAME_LENGTH];		// 发送桢缓冲
		UINT8   m_acTempDataBuf[MAX_DATA_LENGTH+1];
		UINT32  m_nFrameMaxSize;

public:
		UINT16  m_nCurPackNo;			// 当前包的序号
		UINT32  m_nFrameDataMaxSize;

	protected:
		void RenewCommSend();
		void RenewCommReceive();
		void BreakCommSend();
		void BreakCommReceive();
		void StartCommSend();
		void StartCommReceive();
		void FileCommSend();
		void FileCommReceive();
		void VersionCommSend();
		void VersionCommReceive();
		BOOL CheckupFrame();
		UINT32 GetFrameLength();
		BOOL CheckupData(UINT8* pcData, UINT32 lDataLen, UINT32 lCheckCode, UINT16 nValueByteNum);
		UINT32 GetDataCheckout(UINT8 *pcData, UINT32 lDataLen, UINT16 nValueByteNum);
		void FormatFrame(UINT16 nType, void* pFrameInfo);
		void UnformatFrame();
		void ResendFrame(BOOL nResendFlag);
		
	public:
		void ConverseInt( UINT32* pSourceInt, UINT16 nByteCount);
		BOOL StartupComm(COMMINFO stCommInfo);
		UINT32 GetEndCommFlag();
		INT32 TransferAndAnalyse(UINT32 length, UINT8 *rec_info, BOOL bAllDo = 1);
		UINT32 GetCommRecLength( void );
		UINT32 GetCommSendLength();
		void GetSendData(UINT8* pcSendInfo);
		void GetRecCommInfo(COMMINFO* pstCommInfo);
		void ResendOnOvertime();
		UINT32 GetResendNum();
		// 清除通讯标志,包括清除:1、接收和发送内容  2、通讯标志  3、通讯状态
		void ClearCommStatus(void);
		void SetCpuIsSame(BOOL bFlag);
		BOOL SetFrameSize(UINT32 nFrameSize);
		UINT32 GetFrameDataMaxSize();
//		BOOL SetDynamicSendFileMode(BOOL bIsDynamicSendFile, UINT32 (*func)(UINT8* pFileName, UINT16 nCurFilePackNo, UINT8* pCurFileInfo, UINT32 lLength) = NULL);
		BOOL SetDynamicSendFileMode(BOOL bIsDynamicSendFile, UINT32 (*func)(UINT16 nCurFilePackNo, UINT8* pCurFileInfo, UINT32 lLength) = NULL);
};

#endif // !defined(AFX_COMMPROTOCOL_H__5DD269FC_CE24_4876_9791_54CCAC384BAE__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -