// 2003.08.10
//****************************************
//**  Copyright  (C)  W.ch  1999-2003   **
//**  Web:  http://www.winchiphead.com  **
//****************************************
//**  WDM for PCI interface chip CH365  **
//**  C, VC5.0, Windows 98 DDK          **
//****************************************
//
// PCI总线接口芯片CH365的WDM驱动程序   V1.0
// 南京沁恒电子有限公司  作者: W.ch 2003.08
// CH365-WDM  V1.0 ,    Support: IO/MEM/INT
// 运行环境: Windows 98/ME, Windows 2000/XP
//

#ifndef		_CAN_WDM_H
#define		_CAN_WDM_H


#define		mOFFSET( s, m )			( (ULONG) & ( ( ( s * ) 0 ) -> m ) )	// 定义获取结构成员相对偏移地址的宏

#ifndef		max
#define		max( a, b )				( ( ( a ) > ( b ) ) ? ( a ) : ( b ) )	// 较大值
#endif

#ifndef		min
#define		min( a, b )				( ( ( a ) < ( b ) ) ? ( a ) : ( b ) )	// 较小值
#endif

#ifdef		ExAllocatePool
#undef		ExAllocatePool						// 删除带TAG的内存分配
#endif

#ifndef		NTSTATUS
typedef		LONG	NTSTATUS;					// 返回状态
#endif


typedef	struct	_PCI_CONFIG {					// 定义PCI配置空间数据结构
	USHORT			mPcVendorId;				// 00H 供应商标识
	USHORT			mPcDeviceId;				// 02H 设备标识
	USHORT			mPcCommandReg;				// 04H 命令寄存器
	USHORT			mPcStatusReg;				// 06H 状态寄存器
	UCHAR			mPcRevisionId;				// 08H 修改标识
	UCHAR			mPcProgramIf;				// 09H 寄存器级编程接口
	UCHAR			mPcSubClass;				// 0AH 子类代码
	UCHAR			mPcBaseClass;				// 0BH 基本分类代码
	UCHAR			mPcCacheLine;				// 0CH 缓存行长度
	UCHAR			mPcLatenTimer;				// 0DH 延迟计数器
	UCHAR			mPcHeaderType;				// 0EH 头标类型
	UCHAR			mPcBistReg;					// 0FH 内含自测试寄存器
	ULONG			mPcBaseAddr0;				// 10H 基址寄存器0
	ULONG			mPcBaseAddr1;				// 14H 基址寄存器1
	ULONG			mPcBaseAddr2;				// 18H 基址寄存器2
	ULONG			mPcBaseAddr3;				// 1CH 基址寄存器3
	ULONG			mPcBaseAddr4;				// 20H 基址寄存器4
	ULONG			mPcBaseAddr5;				// 24H 基址寄存器5
	ULONG			mPcCardCis;					// 28H
	USHORT			mPcSubSysVen;				// 2CH 子系统供应商标识
	USHORT			mPcSubSysDev;				// 2EH 子系统设备标识
	ULONG			mPcExpansRom;				// 30H 扩展ROM基址寄存器
	UCHAR			mPcCapPtr;					// 34H
	UCHAR			mPcReserved1[3];			// 35H
	ULONG			mPcReserved2;				// 38H
	UCHAR			mPcInterLine;				// 3CH 中断线寄存器
	UCHAR			mPcInterPin;				// 3DH 中断引脚寄存器
	UCHAR			mPcMinGrant;				// 3EH
	UCHAR			mPcMaxLatency;				// 3FH
} mPCI_CONFIG, *mPPCI_CONFIG;

typedef	struct	_PCI_EXP_ROM {					// PCI扩展ROM的数据结构
	UCHAR			mPerRomSig[4];				// 00H PCI扩展ROM签名字符串'PCIR'
	USHORT			mPerVendorId;				// 04H 供应商标识
	USHORT			mPerDeviceId;				// 06H 设备标识
	USHORT			mPerVpdPtr;					// 08H 重要产品数据指针
	USHORT			mPerStrucLen;				// 0AH PCI扩展ROM数据结构的长度
	UCHAR			mPerRevision;				// 0CH PCI扩展ROM数据结构的修改版本
	UCHAR			mPerProgramIf;				// 0DH 寄存器级编程接口
	UCHAR			mPerSubClass;				// 0EH 子类代码
	UCHAR			mPerBaseClass;				// 0FH 基本分类代码
	USHORT			mPerImageLen;				// 10H 映像长度
	USHORT			mPerImageRev;				// 12H 映像中代码/数据的修改版本
	UCHAR			mPerCodeType;				// 14H 代码类型
	UCHAR			mPerIndicator;				// 15H 映像指示标志
	USHORT			mPerReserved;				// 16H
} mPCI_EXP_ROM, *mPPCI_EXP_ROM;

typedef	struct	_CH365_CFG_REG {				// CH365芯片的配置寄存器
	mPCI_CONFIG		mCh365CfgPci;				// 00H-3FH,共64字节为标准PCI配置空间
	UCHAR			mCh365CfgCtrl;				// 40H 芯片控制寄存器,高5位只读
	UCHAR			mCh365CfgDin;				// 41H 8位总线输入端口,只读
	UCHAR			mCh365CfgState;				// 42H 芯片状态寄存器,只读
	UCHAR			mCh365CfgResv;				// 43H
} mCH365_CFG_REG, *mPCH365_CFG_REG;

typedef	struct	_CH365_IO_REG {					// CH365芯片的I/O空间
	UCHAR			mCh365IoPort[0xf0];			// 00H-EFH,共240字节为标准的I/O端口
	union	{									// 以字或者以字节为单位进行存取
		USHORT		mCh365MemAddr;				// F0H 存储器接口: A15-A0地址设定寄存器
		struct	{								// 以字节为单位进行存取
			UCHAR	mCh365MemAddrL;				// F0H 存储器接口: A7-A0地址设定寄存器
			UCHAR	mCh365MemAddrH;				// F1H 存储器接口: A15-A8地址设定寄存器
		};
	};
	UCHAR			mCh365IoResv2;				// F2H
	UCHAR			mCh365MemData;				// F3H 存储器接口: 存储器数据存取寄存器
	UCHAR			mCh365I2cData;				// F4H I2C串行接口: I2C数据存取寄存器
	UCHAR			mCh365I2cCtrl;				// F5H I2C串行接口: I2C控制和状态寄存器
	UCHAR			mCh365I2cAddr;				// F6H I2C串行接口: I2C地址设定寄存器
	UCHAR			mCh365I2cDev;				// F7H I2C串行接口: I2C设备地址和命令寄存器
	UCHAR			mCh365IoCtrl;				// F8H 芯片控制寄存器,高5位只读
	UCHAR			mCh365IoBuf;				// F9H 本地数据输入缓存寄存器
	UCHAR			mCh365Speed;				// FAH 芯片速度控制寄存器
	UCHAR			mCh365IoResv3;				// FBH
	UCHAR			mCh365IoTime;				// FCH 硬件循环计数寄存器
	UCHAR			mCh365IoResv4[3];			// FDH
} mCH365_IO_REG, *mPCH365_IO_REG;

typedef	struct	_CH365_MEM_REG {				// CH365芯片的存储器空间
	UCHAR			mCh365MemPort[0x8000];		// 0000H-7FFFH,共32768字节为标准的存储器单元
} mCH365_MEM_REG, *mPCH365_MEM_REG;

typedef	struct	_WIN32_COMMAND {				// 定义WIN32命令接口结构
	union	{
		ULONG		mFunction;					// 输入时指定功能代码
		NTSTATUS	mStatus;					// 输出时返回操作状态
	};
	PVOID			mAddress;					// 起始地址,返回地址
	ULONG			mLength;					// 存取长度,返回后续数据的长度
	UCHAR			mBuffer[16];					// 数据缓冲区,长度为0至32KB
} mWIN32_COMMAND, *mPWIN32_COMMAND;


typedef struct _Can_FRAME{

		UCHAR		ExF_StartFrame;		//启始帧
		UCHAR		ExF_IDRegion;		//域代号
		UCHAR		ExF_IDSub;			//子类代号
		UCHAR		ExF_Func;			//功能代号
		UCHAR		ExF_Func_Ex;		//功能模式模式扩展0xff@@(低四位无关)
		UCHAR		ExF_DATA[8];		//传送最多8位数据

} m_Can_Frame,* p_Can_Frame;

typedef struct _Rece_Buffer{
m_Can_Frame		* Frame	;	//13位帧长度
volatile	int		 Head_op	;	 //链接指针
volatile	int		Tail_op	;
int                         m_Max_Rece_Len;
} m_ReceBuffer,		*p_ReceBuffer;


// WIN32应用层接口命令
#define		IOCTL_CH365_COMMAND		( FILE_DEVICE_UNKNOWN << 16 | FILE_ANY_ACCESS << 14 | 0x0f36 << 2 | METHOD_BUFFERED )	// 专用接口

#define		mWIN32_COMMAND_HEAD		mOFFSET( mWIN32_COMMAND, mBuffer )	// WIN32命令接口的头长度

#define		mCH365_MAX_NUMBER		16			// 最多同时连接的CH365数

#define		mMAX_BUFFER_LENGTH		max( sizeof( mCH365_IO_REG ), sizeof( mCH365_MEM_REG ) )	// 数据缓冲区最大长度

#define		mMAX_COMMAND_LENGTH		( mWIN32_COMMAND_HEAD + mMAX_BUFFER_LENGTH )	// 最大数据长度加上命令结构头的长度

#define		mCH365_MEM_BASE_AUTO		( (PVOID)0xffffffff )	// 自动设定CH365的存储器基址

#define		mCH365_INT_LINE_AUTO			0xffffffff				// 自动检测CH365的中断号

#define         MAX_RECE_BUFFER_SIZE                 102400
// 寄存器的位定义
#define		mBitAddr15Out			0x01		// 设定A15输出值,1*:high,0:low
#define		mBitSysExtOut			0x02		// 设定SYS_EX输出值,1:high,0*:low
#define		mBitIntAction			0x04		// 设定中断激活状态,1:action,0*:inaction
#define		mBitPciIdDef			0x01		// 只读,PCI设备标识的当前选择,1*:default,0:external
#define		mBitPortHit			0x04		// 只读,本地硬件定址功能的启用状态,1:启用,0*:禁用
#define		mBitInterRom			0x10		// 只读,内部Mini-ROM功能的启用状态,1:启用,0*:禁用
#define		mBitSysExtOe			0x40		// 只读,SYS_EX输出三态控制/输出使能,1*:启用,0:禁用
#define		mBitIntEnable			0x80		// 只读,中断功能的启用状态,1:启用,0*:禁用
#define		mBitI2cStatus			0x01		// I2C接口的操作控制和状态,1:开始/正在操作,0*:空闲/操作完成
#define		mBitI2cSclOut			0x80		// 选择I2C接口的SCL输出,1:SYS_EX,0*:A15
#define		mBitSpeedAct			0x07		// 速度控制,激活状态的脉冲宽度,实际宽度为该值乘以30nS
#define		mBitSpeedInact			0x10		// 速度控制,非激活状态的空闲宽度,1:前45nS/后15nS,0:前15nS/后15nS
#define		mBitSpeedPreft			0x80		// 速度控制,预取状态控制位,1:预取位有效,0:预取位无效


// 应用层接口的功能代码
#define		mFuncNoOperation		0x00000000	// 无操作
#define		mFuncGetVersion			0x00000001	// 获取驱动程序版本号
#define		mFuncGetIoBaseAddr		0x00000002	// 读取I/O端口基址
#define		mFuncGetMemBaseAddr		0x00000003	// 读取存储器基址
#define         mFuncCanInitialize		0x00000004      // CAN设备初始化例程
#define         mFuncCanReceive	  		0x00000005      // CAN设备接收例程
#define         mFuncCanSend			0x00000006	// CAN设备发送例程
#define 	mFuncSetInterLine		0x00000007      // 设置设备中断线程
#define   	mFuncWaitingSend           	0x00000008
#define   	mFuncWaitingReceive           	0x00000009
#define     	mFuncGetInterLine        	0x0000000a
#define         mFuncAbortWaitInter		0x0000000b	
//CAN CONTROLER REGISTER DEFINE
#define		ModeRegister_Addr				0x00		/*MOD						*/  
#define		CmdRegister_Addr				0x01		/*CMR						*/
#define		StateRegister_Addr				0x02		/*SR						*/
#define		IntRegister_Addr				0x03		/*IR						*/
#define		IntEnRegister_Addr				0x04		/*IER						*/
#define		BusTimeRegister0_Addr			0x06		/*BTR0						*/
#define		BusTimeRegister1_Addr			0x07		/*BTR1						*/
#define		OutPutCtrRegister_Addr			0x08		/*OCR						*/
#define		ArbitrationLCatch_Addr			0x0B		/*ALC Read Only					*/
#define		ErrorCCRegister_Addr			0x0C		/*ECC						*/
#define		ErrorWarningLR_Addr			0x0D		/*EWLR						*/
#define		RXERRegister_Addr				0x0E		/*RXERR						*/
#define		TXERRegister_Addr				0x0F		/*TXERR						*/
#define		SFFIDBuffer_Addr				0x10		/*BID*2						*/
#define		EFFIDBuffer_Addr				0x10		/*BID*4						*/
#define		SFF_DATA						0x13		/*SFF						*/
#define		EFF_DATA						0x15		/*EFF						*/
#define		RXRamBuffer_Addr				0x1E		/*RBSA						*/
#define		CDR_Addr						0x1F		/*CDR						*/
#define		ACR0_Addr						0x10		/*ACR0						*/
#define		ACR1_Addr						0x11		/*ACR1						*/
#define		ACR2_Addr						0x12		/*ACR2						*/
#define		ACR3_Addr						0x13		/*ACR3						*/
#define		AMR0_Addr						0x14		/*AMR0						*/
#define		AMR1_Addr						0x15		/*AMR1						*/
#define		AMR2_Addr						0x16		/*AMR2						*/
#define		AMR3_Addr						0x17		/*AMR3						*/

////////////////////////////////////////////////////////////////////////////////////////

/**************CFG Define******************************************************************/
/*MOD_CFG*/
#define		MOD_RM						0x01		/*复位模式					*/
#define		MOD_LOM					0x02		/*只听模式					*/
#define		MOD_STM					0x04		/*自检模式					*/
#define		MOD_AFM					0x08		/*验收滤波器模式				*/
#define		MOD_SM						0x10		/*睡眠模式					*/
/*CMR_CFG*/
#define		CMR_TR						0x01		/*发送请求					*/
#define		CMR_AT						0x02		/*终止发送					*/
#define		CMR_RR						0x04		/*释放接收缓冲				 	*/
#define		CMR_CDO					0x08		/*清除数据溢出					*/
#define		CMR_SRR					0x10		/*自动接受模式					*/
/*IR*/
#define		RI_RI						0x01		/*接受中断					*/
#define		RI_TI						0x02		/*发送中断					*/
#define		RI_EI						0x04		/*出错报警中断					*/
#define		RI_DOI						0x08		/*数据溢出中断					*/
#define		RI_WUI						0x10		/*唤醒中断					*/
#define		RI_EPI						0x20		/*错误认可中断					*/
#define		RI_ALI						0x40		/*仲裁丢失中断					*/
#define		RI_BEI						0x80		/*总线错误中断					*/	
/*SR*/
#define		SR_RBS						0x01		/*接收缓冲器状态 1：有有效报文			*/
#define		SR_DOS						0x02		/*数据溢出状态	RXFIFO	满			*/
#define		SR_TBS						0x04		/*发送缓冲器状态 1：CPU可以向缓冲起发送报文	*/
#define		SR_TCS						0x08		/*发送完成状态1：最近依次发送已完成		*/
#define		SR_RS						0x10		/*接受状态	1：正在接收			*/
#define		SR_TS						0x20		/*发送状态	1：正在发送			*/
#define		SR_ES						0x40		/*错误状态	1：至少有一个错误计数器溢出	*/
#define		SR_BS						0x80		/*总线状态  1：关闭				*/
/*IER*/
#define		IER_RIE						0x01		/*接受中断使能					*/
#define		IER_TIE						0x02		/*发送中断使能					*/
#define		IER_ELE						0x04		/*出错报警中断使能				*/
#define		IER_DOIE					0x08		/*数据溢出中断使能				*/
#define		IER_WUIE					0x10		/*唤醒中断使能					*/
#define		IER_EPIE					0x20		/*错误认可中断使能				*/
#define		IER_ALIE					0x40		/*仲裁丢失中断使能				*/
#define		IER_BEIE					0x80		/*总线错误中断使能				*/
/*ERRO*/
#define		ALC_MASK					0x1F		/*仲裁丢失捕捉编码				*/
#define		ECC_ERRC_MASK				0xC0		/*错误类型编码00，01，10，11：位错，格式错，填充错，其他类型*/
#define		ECC_DIR_MASK				0x20		/*错误定位RX：1，TX：0				*/
#define		ECC_SEG_MASK				0x1F		/*错误代码编码					*/
/*DLC*/
#define		STFrame_FF_MASK			0x80		/*帧结构标识					*/
#define		STFrame_RTR_MASK			0x40		/*远程帧标识					*/
/*CDR*/
#define		CDR_Clock_OFF				0x08		/*关闭外部时钟输出				*/	
#define		CDR_CBP_RX0				0x40		/*旁路比较器					*/
#define		CDR_Mode_Switch			0x80		/*BasicCAN					*/
/*SELF DEFINE */
#define		GetDataLength(ID)			(ID&0x0F)	/*取得数据帧长度 */
UCHAR         CanIntEn= 0x73;

//{5EA71865-00F6-4fbf-9B19-FC58C894A261}
static const GUID  CanGuid= { 0x5ea71865, 0xf6, 0x4fbf, { 0x9b, 0x19, 0xfc, 0x58, 0xc8, 0x94, 0xa2, 0x61 } };

#endif		// _CAN_WDM_H
