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

📄 ch365dll.h

📁 CH365与单片机通讯界面设计
💻 H
📖 第 1 页 / 共 2 页
字号:
// 2003.09.10
// 2003.12.08 V1.2
// 2004.05.08 V1.3
// 2004.12.10 V1.5
// 2005.10.20 V1.6
//****************************************
//**  Copyright  (C)  W.ch  1999-2004   **
//**  Web:  http://www.winchiphead.com  **
//****************************************
//**  DLL for PCI interface chip CH365  **
//**  C, VC5.0                          **
//****************************************
//
// PCI总线接口芯片CH365的应用层接口库  V1.6
// 南京沁恒电子有限公司  作者: W.ch 2005.10
// CH365-DLL  V1.6 ,    Support: IO/MEM/INT
// 运行环境: Windows 98/ME, Windows 2000/XP
//

#ifndef		_CH365_DLL_H
#define		_CH365_DLL_H

#ifdef __cplusplus
extern "C" {
#endif


#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[4];					// 数据缓冲区,长度为0至32KB
} mWIN32_COMMAND, *mPWIN32_COMMAND;

// 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		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		0x00000004	// 读取I/O端口基址
#define		mFuncSetIoBaseAddr		0x00000005	// 设置I/O端口基址
#define		mFuncGetMemBaseAddr		0x00000006	// 读取存储器基址
#define		mFuncSetMemBaseAddr		0x00000007	// 设置存储器基址,自动设定存储器基址
#define		mFuncGetInterLine		0x00000008	// 读取中断号
#define		mFuncSetInterLine		0x00000009	// 设置中断号,自动检测中断号
#define		mFuncWaitInterrupt		0x0000000a	// 等待中断,直到CH365产生中断
#define		mFuncAbortWaitInter		0x0000000b	// 放弃等待中断,终止等待
#define		mFuncSetExclusive		0x0000000c	// 设置独占使用
#define		mFuncReadIoByte			0x00000010	// 读取输入输出端口,在同一个端口地址以字节为单位连续读取
#define		mFuncReadIoWord			0x00000011	// 读取输入输出端口,在同一个端口地址以字为单位连续读取
#define		mFuncReadIoDword		0x00000012	// 读取输入输出端口,在同一个端口地址以双字为单位连续读取
#define		mFuncReadIoBlock		0x00000013	// 读取输入输出端口,每读取一个字节,端口地址加一
#define		mFuncWriteIoByte		0x00000014	// 写入输入输出端口,在同一个端口地址以字节为单位连续写入
#define		mFuncWriteIoWord		0x00000015	// 写入输入输出端口,在同一个端口地址以字为单位连续写入
#define		mFuncWriteIoDword		0x00000016	// 写入输入输出端口,在同一个端口地址以双字为单位连续写入
#define		mFuncWriteIoBlock		0x00000017	// 写入输入输出端口,每写入一个字节,端口地址加一
#define		mFuncReadMemByte		0x00000018	// 读取存储器/寄存器
#define		mFuncReadMemWord		0x00000019	// 读取存储器/寄存器
#define		mFuncReadMemDword		0x0000001a	// 读取存储器/寄存器
#define		mFuncWriteMemByte		0x0000001c	// 写入存储器/寄存器
#define		mFuncWriteMemWord		0x0000001d	// 写入存储器/寄存器
#define		mFuncWriteMemDword		0x0000001e	// 写入存储器/寄存器
#define		mFuncReadConfig			0x00000020	// 读取PCI配置空间
#define		mFuncWriteConfig		0x00000021	// 写入PCI配置空间
#define		mFuncReadBuffer1		0x00000024	// 读取中断命令缓冲区1
#define		mFuncWriteBuffer1		0x00000025	// 写入中断命令缓冲区1
#define		mFuncReadBuffer2		0x00000026	// 读取中断命令缓冲区2
#define		mFuncWriteBuffer2		0x00000027	// 写入中断命令缓冲区2


typedef		VOID	( CALLBACK	* mPCH365_INT_ROUTINE ) ( VOID );		// 中断服务程序


HANDLE	WINAPI	CH365OpenDevice(  // 打开CH365设备,返回句柄,出错则无效
	BOOL			iEnableMemory,  // 是否需要支持存储器
	BOOL			iEnableInterrupt );  // 是否需要支持中断


VOID	WINAPI	CH365CloseDevice( );  // 关闭CH365设备


ULONG	WINAPI	CH365GetVersion( );  // 获得DLL版本号,返回版本号


ULONG	WINAPI	CH365DriverCommand(  // 直接传递命令给驱动程序,出错则返回0,否则返回数据长度
	mPWIN32_COMMAND	ioCommand );  // 命令结构的指针
// 该程序在调用后返回数据长度,并且仍然返回命令结构,如果是读操作,则数据返回在命令结构中,
// 返回的数据长度在操作失败时为0,操作成功时为整个命令结构的长度,例如读一个字节,则返回mWIN32_COMMAND_HEAD+1,
// 命令结构在调用前,分别提供:命令功能代码,起始地址(可选),存取数据的长度(可选),
// 命令结构在调用后,分别返回:操作状态代码,返回的基址(可选),后续数据的长度(可选),
//   操作状态代码是由WINDOWS定义的代码,可以参考NTSTATUS.H,
//   返回的基址只适用于下列命令:获取I/O基址,获取存储器基址,获取中断号,对于其它命令则保持输入时的起始地址
//   后续数据的长度是指读操作返回的数据长度,数据存放在随后的缓冲区中,对于写操作一般为0


ULONG	WINAPI	CH365GetDrvVersion( );  // 获得驱动程序版本号,返回版本号,出错则返回0


BOOL	WINAPI	CH365GetIoBaseAddr(  // 获取I/O端口的基址
	mPCH365_IO_REG	*oIoBaseAddr );  // 保存I/O端口基址的单元地址


BOOL	WINAPI	CH365SetIoBaseAddr(  // 设定I/O端口的基址
	mPCH365_IO_REG	iIoBaseAddr );  // 指定I/O端口基址


BOOL	WINAPI	CH365GetMemBaseAddr(  // 获取存储器的基址
	mPCH365_MEM_REG	*oMemBaseAddr );  // 保存存储器基址的单元地址


BOOL	WINAPI	CH365SetMemBaseAddr(  // 设定存储器的基址
	mPCH365_MEM_REG	iMemBaseAddr );  // 指定存储器基址,为0则关闭存储器,为-1则自动设定


BOOL	WINAPI	CH365GetIntLine(  // 获取中断号
	PULONG			oIntLine );  // 保存中断号的单元地址


BOOL	WINAPI	CH365SetIntLine(  // 设定中断号
	ULONG			iIntLine );  // 指定中断号,为0则关闭中断,为-1则自动检测并设定


BOOL	WINAPI	CH365WaitInterrupt( );  // 等待中断事件


BOOL	WINAPI	CH365AbortWaitInt( );  // 放弃等待中断


BOOL	WINAPI	CH365SetIntRoutine(  // 设定中断服务程序
	mPCH365_INT_ROUTINE	iIntRoutine );  // 指定中断服务程序,为NULL则取消中断服务,否则在中断时调用该程序


BOOL	WINAPI	CH365ReadIntCommand(  // 读取中断命令缓冲区
	mPWIN32_COMMAND	oCommand,  // 指向一个足够大的缓冲区,用于保存读取的命令结构
	ULONG			iCmdIndex );  // 中断命令序号,为1或者2


BOOL	WINAPI	CH365WriteIntCommand(  // 写入中断命令缓冲区
	mPWIN32_COMMAND	iCommand,  // 指向作为中断命令的命令结构
	ULONG			iCmdIndex );  // 中断命令序号,为1或者2


BOOL	WINAPI	CH365ReadIoByte(  // 从I/O端口读取一个字节
	PVOID			iAddr,  // 指定I/O端口的地址
	PUCHAR			oByte );  // 指向一个字节单元,用于保存读取的字节数据

⌨️ 快捷键说明

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