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

📄 ch341dll.h

📁 键盘扫描LED驱动芯片ch451资料及c语言源代码
💻 H
字号:
// 2004.05.28
//****************************************
//**  Copyright  (C)  W.ch  1999-2004   **
//**  Web:  http://www.winchiphead.com  **
//****************************************
//**  DLL for USB interface chip CH341  **
//**  C, VC5.0                          **
//****************************************
//
// USB总线接口芯片CH341并口应用层接口库 V1.0
// 南京沁恒电子有限公司  作者: W.ch 2004.05
// CH341-DLL  V1.0
// 运行环境: Windows 98/ME, Windows 2000/XP
// support USB chip: CH341
// USB => Parallel
//

#ifndef		_CH341_DLL_H
#define		_CH341_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	_USB_SETUP_PKT {				// USB控制传输的建立阶段的数据请求包结构
	UCHAR			mUspReqType;				// 00H 请求类型
	UCHAR			mUspRequest;				// 01H 请求代码
	union	{
		struct	{
			UCHAR	mUspValueLow;				// 02H 值参数低字节
			UCHAR	mUspValueHigh;				// 03H 值参数高字节
		};
		USHORT		mUspValue;					// 02H-03H 值参数
	};
	union	{
		struct	{
			UCHAR	mUspIndexLow;				// 04H 索引参数低字节
			UCHAR	mUspIndexHigh;				// 05H 索引参数高字节
		};
		USHORT		mUspIndex;					// 04H-05H 索引参数
	};
	USHORT			mLength;					// 06H-07H 数据阶段的数据长度
} mUSB_SETUP_PKT, *mPUSB_SETUP_PKT;


#define		mCH341_PACKET_LENGTH	32			// CH341支持的数据包的长度
#define		mCH341_PKT_LEN_SHORT	8			// CH341支持的短数据包的长度


typedef	struct	_WIN32_COMMAND {				// 定义WIN32命令接口结构
	union	{
		ULONG		mFunction;					// 输入时指定功能代码或者管道号
		NTSTATUS	mStatus;					// 输出时返回操作状态
	};
	ULONG			mLength;					// 存取长度,返回后续数据的长度
	union	{
		mUSB_SETUP_PKT	mSetupPkt;				// USB控制传输的建立阶段的数据请求
		UCHAR			mBuffer[ mCH341_PACKET_LENGTH ];	// 数据缓冲区,长度为0至255B
	};
} mWIN32_COMMAND, *mPWIN32_COMMAND;


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

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

#define		mCH341_MAX_NUMBER		16			// 最多同时连接的CH341数

#define		mMAX_BUFFER_LENGTH		0x1000		// 数据缓冲区最大长度4096

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

#define		mDEFAULT_BUFFER_LEN		0x0400		// 数据缓冲区默认长度1024

#define		mDEFAULT_COMMAND_LEN	( mWIN32_COMMAND_HEAD + mDEFAULT_BUFFER_LEN )	// 默认数据长度加上命令结构头的长度


// CH341端点地址
#define		mCH341_ENDP_INTER_UP	0x81		// CH341的中断数据上传端点的地址
#define		mCH341_ENDP_INTER_DOWN	0x01		// CH341的中断数据下传端点的地址
#define		mCH341_ENDP_DATA_UP		0x82		// CH341的数据块上传端点的地址
#define		mCH341_ENDP_DATA_DOWN	0x02		// CH341的数据块下传端点的地址


// 设备层接口提供的管道操作命令
#define		mPipeDeviceCtrl			0x00000004	// CH341的综合控制管道
#define		mPipeInterUp			0x00000005	// CH341的中断数据上传管道
#define		mPipeDataUp				0x00000006	// CH341的数据块上传管道
#define		mPipeDataDown			0x00000007	// CH341的数据块下传管道

// 应用层接口的功能代码
#define		mFuncNoOperation		0x00000000	// 无操作
#define		mFuncGetVersion			0x00000001	// 获取驱动程序版本号
#define		mFuncGetConfig			0x00000002	// 获取USB设备配置描述符
#define		mFuncResetDevice		0x0000000c	// 复位USB设备
#define		mFuncResetPipe			0x0000000d	// 复位USB管道
#define		mFuncAbortPipe			0x0000000e	// 取消USB管道的数据请求

// CH341并口专用的功能代码
#define		mFuncSetParaMode		0x0000000f	// 设置并口模式
#define		mFuncReadData0			0x00000010	// 从并口读取数据块0
#define		mFuncReadData1			0x00000011	// 从并口读取数据块1
#define		mFuncWriteData0			0x00000012	// 向并口写入数据块0
#define		mFuncWriteData1			0x00000013	// 向并口写入数据块1


// USB设备标准请求代码
#define		mUSB_CLR_FEATURE		0x01
#define		mUSB_SET_FEATURE		0x03
#define		mUSB_GET_STATUS			0x00
#define		mUSB_SET_ADDRESS		0x05
#define		mUSB_GET_DESCR			0x06
#define		mUSB_SET_DESCR			0x07
#define		mUSB_GET_CONFIG			0x08
#define		mUSB_SET_CONFIG			0x09
#define		mUSB_GET_INTERF			0x0a
#define		mUSB_SET_INTERF			0x0b
#define		mUSB_SYNC_FRAME			0x0c

// CH341控制传输的厂商专用请求类型
#define		mCH341_VENDOR_READ		0xc0		// 通过控制传输实现的CH341厂商专用读操作
#define		mCH341_VENDOR_WRITE		0x40		// 通过控制传输实现的CH341厂商专用写操作

// CH341控制传输的厂商专用请求代码
#define		mCH341_PARA_INIT		0xb1		// 初始化并口
#define		mCH341_I2C_STATUS		0x52		// 获取I2C接口的状态
#define		mCH341_I2C_COMMAND		0x53		// 发出I2C接口的命令


// CH341并口工作模式
#define		mCH341_PARA_MODE_EPP	0x00		// CH341并口工作模式为EPP方式
#define		mCH341_PARA_MODE_MEM	0x02		// CH341并口工作模式为MEM方式


// 直接输入的状态信号的位定义
#define		mStateBitERR			0x00000100	// 只读,ERR#引脚输入状态,1:高电平,0:低电平
#define		mStateBitPEMP			0x00000200	// 只读,PEMP引脚输入状态,1:高电平,0:低电平
#define		mStateBitINT			0x00000400	// 只读,INT#引脚输入状态,1:高电平,0:低电平
#define		mStateBitSLCT			0x00000800	// 只读,SLCT引脚输入状态,1:高电平,0:低电平
#define		mStateBitSDA			0x00800000	// 只读,SDA引脚输入状态,1:高电平,0:低电平


typedef		VOID	( * mPCH341_INT_ROUTINE ) (  // 中断服务程序
	ULONG			iStatus );  // 中断状态数据
// 位7-位0对应CH341的D7-D0引脚
// 位8对应CH341的ERR#引脚, 位9对应CH341的PEMP引脚, 位10对应CH341的INT#引脚, 位11对应CH341的SLCT引脚


HANDLE	WINAPI	CH341OpenDevice(  // 打开CH341设备,返回句柄,出错则无效
	ULONG			iIndex );  // 指定CH341设备序号,0对应第一个设备


VOID	WINAPI	CH341CloseDevice(  // 关闭CH341设备
	ULONG			iIndex );  // 指定CH341设备序号


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


ULONG	WINAPI	CH341DriverCommand(  // 直接传递命令给驱动程序,出错则返回0,否则返回数据长度
	ULONG			iIndex,  // 指定CH341设备序号
	mPWIN32_COMMAND	ioCommand );  // 命令结构的指针
// 该程序在调用后返回数据长度,并且仍然返回命令结构,如果是读操作,则数据返回在命令结构中,
// 返回的数据长度在操作失败时为0,操作成功时为整个命令结构的长度,例如读一个字节,则返回mWIN32_COMMAND_HEAD+1,
// 命令结构在调用前,分别提供:管道号或者命令功能代码,存取数据的长度(可选),数据(可选)
// 命令结构在调用后,分别返回:操作状态代码,后续数据的长度(可选),
//   操作状态代码是由WINDOWS定义的代码,可以参考NTSTATUS.H,
//   后续数据的长度是指读操作返回的数据长度,数据存放在随后的缓冲区中,对于写操作一般为0


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


BOOL	WINAPI	CH341ResetDevice(  // 复位USB设备
	ULONG			iIndex );  // 指定CH341设备序号


BOOL	WINAPI	CH341GetDeviceDescr(  // 读取设备描述符
	ULONG			iIndex,  // 指定CH341设备序号
	PVOID			oBuffer,  // 指向一个足够大的缓冲区,用于保存描述符
	PULONG			ioLength );  // 指向长度单元,输入时为准备读取的长度,返回后为实际读取的长度


BOOL	WINAPI	CH341GetConfigDescr(  // 读取配置描述符
	ULONG			iIndex,  // 指定CH341设备序号
	PVOID			oBuffer,  // 指向一个足够大的缓冲区,用于保存描述符
	PULONG			ioLength );  // 指向长度单元,输入时为准备读取的长度,返回后为实际读取的长度


BOOL	WINAPI	CH341SetIntRoutine(  // 设定中断服务程序
	ULONG			iIndex,  // 指定CH341设备序号
	mPCH341_INT_ROUTINE	iIntRoutine );  // 指定中断服务程序,为NULL则取消中断服务,否则在中断时调用该程序


BOOL	WINAPI	CH341ReadInter(  // 读取中断数据
	ULONG			iIndex,  // 指定CH341设备序号
	PULONG			iStatus );  // 指向一个双字单元,用于保存读取的中断状态数据
// 位7-位0对应CH341的D7-D0引脚
// 位8对应CH341的ERR#引脚, 位9对应CH341的PEMP引脚, 位10对应CH341的INT#引脚, 位11对应CH341的SLCT引脚


BOOL	WINAPI	CH341AbortInter(  // 放弃中断数据读操作
	ULONG			iIndex );  // 指定CH341设备序号


BOOL	WINAPI	CH341SetParaMode(  // 设置并口模式
	ULONG			iIndex,  // 指定CH341设备序号
	ULONG			iMode );  // 指定并口模式: 0为EPP模式, 2为MEM模式


BOOL	WINAPI	CH341InitParallel(  // 复位并初始化并口,RST#输出低电平脉冲
	ULONG			iIndex,  // 指定CH341设备序号
	ULONG			iMode );  // 指定并口模式: 0为EPP模式, 2为MEM模式, >= 0x00000100 保持当前模式


BOOL	WINAPI	CH341ReadData0(  // 从0#端口读取数据块
	ULONG			iIndex,  // 指定CH341设备序号
	PVOID			oBuffer,  // 指向一个足够大的缓冲区,用于保存读取的数据
	PULONG			ioLength );  // 指向长度单元,输入时为准备读取的长度,返回后为实际读取的长度


BOOL	WINAPI	CH341ReadData1(  // 从1#端口读取数据块
	ULONG			iIndex,  // 指定CH341设备序号
	PVOID			oBuffer,  // 指向一个足够大的缓冲区,用于保存读取的数据
	PULONG			ioLength );  // 指向长度单元,输入时为准备读取的长度,返回后为实际读取的长度


BOOL	WINAPI	CH341AbortRead(  // 放弃数据块读操作
	ULONG			iIndex );  // 指定CH341设备序号


BOOL	WINAPI	CH341WriteData0(  // 向0#端口写出数据块
	ULONG			iIndex,  // 指定CH341设备序号
	PVOID			iBuffer,  // 指向一个缓冲区,放置准备写出的数据
	PULONG			ioLength );  // 指向长度单元,输入时为准备写出的长度,返回后为实际写出的长度


BOOL	WINAPI	CH341WriteData1(  // 向1#端口写出数据块
	ULONG			iIndex,  // 指定CH341设备序号
	PVOID			iBuffer,  // 指向一个缓冲区,放置准备写出的数据
	PULONG			ioLength );  // 指向长度单元,输入时为准备写出的长度,返回后为实际写出的长度


BOOL	WINAPI	CH341AbortWrite(  // 放弃数据块写操作
	ULONG			iIndex );  // 指定CH341设备序号


BOOL	WINAPI	CH341GetStatus(  // 通过CH341直接输入数据和状态
	ULONG			iIndex,  // 指定CH341设备序号
	PULONG			iStatus );  // 指向一个双字单元,用于保存状态数据
// 位7-位0对应CH341的D7-D0引脚
// 位8对应CH341的ERR#引脚, 位9对应CH341的PEMP引脚, 位10对应CH341的INT#引脚, 位11对应CH341的SLCT引脚, 位23对应CH341的SDA引脚


BOOL	WINAPI	CH341ReadI2C(  // 从I2C接口读取一个字节数据
	ULONG			iIndex,  // 指定CH341设备序号
	UCHAR			iDevice,  // 低7位指定I2C设备地址
	UCHAR			iAddr,  // 指定数据单元的地址
	PUCHAR			oByte );  // 指向一个字节单元,用于保存读取的字节数据


BOOL	WINAPI	CH341WriteI2C(  // 向I2C接口写入一个字节数据
	ULONG			iIndex,  // 指定CH341设备序号
	UCHAR			iDevice,  // 低7位指定I2C设备地址
	UCHAR			iAddr,  // 指定数据单元的地址
	UCHAR			iByte );  // 待写入的字节数据


BOOL	WINAPI	CH341EppReadData(  // EPP方式读数据: WR#=1, DS#=0, AS#=1, D0-D7=input
	ULONG			iIndex,  // 指定CH341设备序号
	PVOID			oBuffer,  // 指向一个足够大的缓冲区,用于保存读取的数据
	PULONG			ioLength );  // 指向长度单元,输入时为准备读取的长度,返回后为实际读取的长度


BOOL	WINAPI	CH341EppReadAddr(  // EPP方式读地址: WR#=1, DS#=1, AS#=0, D0-D7=input
	ULONG			iIndex,  // 指定CH341设备序号
	PVOID			oBuffer,  // 指向一个足够大的缓冲区,用于保存读取的地址数据
	PULONG			ioLength );  // 指向长度单元,输入时为准备读取的长度,返回后为实际读取的长度


BOOL	WINAPI	CH341EppWriteData(  // EPP方式写数据: WR#=0, DS#=0, AS#=1, D0-D7=output
	ULONG			iIndex,  // 指定CH341设备序号
	PVOID			iBuffer,  // 指向一个缓冲区,放置准备写出的数据
	PULONG			ioLength );  // 指向长度单元,输入时为准备写出的长度,返回后为实际写出的长度


BOOL	WINAPI	CH341EppWriteAddr(  // EPP方式写地址: WR#=0, DS#=1, AS#=0, D0-D7=output
	ULONG			iIndex,  // 指定CH341设备序号
	PVOID			iBuffer,  // 指向一个缓冲区,放置准备写出的地址数据
	PULONG			ioLength );  // 指向长度单元,输入时为准备写出的长度,返回后为实际写出的长度


BOOL	WINAPI	CH341EppSetAddr(  // EPP方式设置地址: WR#=0, DS#=1, AS#=0, D0-D7=output
	ULONG			iIndex,  // 指定CH341设备序号
	UCHAR			iAddr );  // 指定EPP地址


BOOL	WINAPI	CH341MemReadAddr0(  // MEM方式读地址0: WR#=1, DS#/RD#=0, AS#/ADDR=0, D0-D7=input
	ULONG			iIndex,  // 指定CH341设备序号
	PVOID			oBuffer,  // 指向一个足够大的缓冲区,用于保存从地址0读取的数据
	PULONG			ioLength );  // 指向长度单元,输入时为准备读取的长度,返回后为实际读取的长度


BOOL	WINAPI	CH341MemReadAddr1(  // MEM方式读地址1: WR#=1, DS#/RD#=0, AS#/ADDR=1, D0-D7=input
	ULONG			iIndex,  // 指定CH341设备序号
	PVOID			oBuffer,  // 指向一个足够大的缓冲区,用于保存从地址1读取的数据
	PULONG			ioLength );  // 指向长度单元,输入时为准备读取的长度,返回后为实际读取的长度


BOOL	WINAPI	CH341MemWriteAddr0(  // MEM方式写地址0: WR#=0, DS#/RD#=1, AS#/ADDR=0, D0-D7=output
	ULONG			iIndex,  // 指定CH341设备序号
	PVOID			iBuffer,  // 指向一个缓冲区,放置准备向地址0写出的数据
	PULONG			ioLength );  // 指向长度单元,输入时为准备写出的长度,返回后为实际写出的长度


BOOL	WINAPI	CH341MemWriteAddr1(  // MEM方式写地址1: WR#=0, DS#/RD#=1, AS#/ADDR=1, D0-D7=output
	ULONG			iIndex,  // 指定CH341设备序号
	PVOID			iBuffer,  // 指向一个缓冲区,放置准备向地址1写出的数据
	PULONG			ioLength );  // 指向长度单元,输入时为准备写出的长度,返回后为实际写出的长度


#ifdef __cplusplus
}
#endif

#endif		// _CH341_DLL_H

⌨️ 快捷键说明

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