📄 ch341dll.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 + -