CH375DLL.H 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. // 2003.09.08, 2003.12.28, 2004.10.15, 2004.12.05, 2004.12.10, 2005.01.20, 2005.02.23, 2005.07.15, 2005.08.17
  2. //****************************************
  3. //** Copyright (C) W.ch 1999-2005 **
  4. //** Web: http://www.winchiphead.com **
  5. //****************************************
  6. //** DLL for USB interface chip CH375 **
  7. //** C, VC5.0 **
  8. //****************************************
  9. //
  10. // USB总线接口芯片CH375的应用层接口库 V2.2
  11. // 南京沁恒电子有限公司 作者: W.ch 2005.08
  12. // CH375-DLL V2.2 , Support: Ctrl/Bulk/Int
  13. // 运行环境: Windows 98/ME, Windows 2000/XP
  14. // support USB chip: CH372/CH375
  15. //
  16. #ifndef _CH375_DLL_H
  17. #define _CH375_DLL_H
  18. #include "windows.h"
  19. #ifdef __cplusplus
  20. extern "C" {
  21. #endif
  22. #define mOFFSET( s, m ) ( (ULONG) & ( ( ( s * ) 0 ) -> m ) ) // 定义获取结构成员相对偏移地址的宏
  23. #ifndef max
  24. #define max( a, b ) ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) ) // 较大值
  25. #endif
  26. #ifndef min
  27. #define min( a, b ) ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) ) // 较小值
  28. #endif
  29. #ifdef ExAllocatePool
  30. #undef ExAllocatePool // 删除带TAG的内存分配
  31. #endif
  32. #ifndef NTSTATUS
  33. typedef LONG NTSTATUS; // 返回状态
  34. #endif
  35. typedef struct _USB_SETUP_PKT { // USB控制传输的建立阶段的数据请求包结构
  36. UCHAR mUspReqType; // 00H 请求类型
  37. UCHAR mUspRequest; // 01H 请求代码
  38. union {
  39. struct {
  40. UCHAR mUspValueLow; // 02H 值参数低字节
  41. UCHAR mUspValueHigh; // 03H 值参数高字节
  42. };
  43. USHORT mUspValue; // 02H-03H 值参数
  44. };
  45. union {
  46. struct {
  47. UCHAR mUspIndexLow; // 04H 索引参数低字节
  48. UCHAR mUspIndexHigh; // 05H 索引参数高字节
  49. };
  50. USHORT mUspIndex; // 04H-05H 索引参数
  51. };
  52. USHORT mLength; // 06H-07H 数据阶段的数据长度
  53. } mUSB_SETUP_PKT, *mPUSB_SETUP_PKT;
  54. #define mCH375_PACKET_LENGTH 64 // CH375支持的数据包的长度
  55. #define mCH375_PKT_LEN_SHORT 8 // CH375支持的短数据包的长度
  56. typedef struct _WIN32_COMMAND { // 定义WIN32命令接口结构
  57. union {
  58. ULONG mFunction; // 输入时指定功能代码或者管道号
  59. NTSTATUS mStatus; // 输出时返回操作状态
  60. };
  61. ULONG mLength; // 存取长度,返回后续数据的长度
  62. union {
  63. mUSB_SETUP_PKT mSetupPkt; // USB控制传输的建立阶段的数据请求
  64. UCHAR mBuffer[ mCH375_PACKET_LENGTH ]; // 数据缓冲区,长度为0至255B
  65. };
  66. } mWIN32_COMMAND, *mPWIN32_COMMAND;
  67. // WIN32应用层接口命令
  68. #define IOCTL_CH375_COMMAND ( FILE_DEVICE_UNKNOWN << 16 | FILE_ANY_ACCESS << 14 | 0x0f37 << 2 | METHOD_BUFFERED ) // 专用接口
  69. #define mWIN32_COMMAND_HEAD mOFFSET( mWIN32_COMMAND, mBuffer ) // WIN32命令接口的头长度
  70. #define mCH375_MAX_NUMBER 16 // 最多同时连接的CH375数
  71. #define mMAX_BUFFER_LENGTH 0x1000 // 数据缓冲区最大长度4096
  72. #define mMAX_COMMAND_LENGTH ( mWIN32_COMMAND_HEAD + mMAX_BUFFER_LENGTH ) // 最大数据长度加上命令结构头的长度
  73. #define mDEFAULT_BUFFER_LEN 0x0400 // 数据缓冲区默认长度1024
  74. #define mDEFAULT_COMMAND_LEN ( mWIN32_COMMAND_HEAD + mDEFAULT_BUFFER_LEN ) // 默认数据长度加上命令结构头的长度
  75. // CH375端点地址
  76. #define mCH375_ENDP_INTER_UP 0x81 // CH375的中断数据上传端点的地址
  77. #define mCH375_ENDP_AUX_DOWN 0x01 // CH375的辅助数据下传端点的地址
  78. #define mCH375_ENDP_DATA_UP 0x82 // CH375的数据块上传端点的地址
  79. #define mCH375_ENDP_DATA_DOWN 0x02 // CH375的数据块下传端点的地址
  80. // 设备层接口提供的管道操作命令
  81. #define mPipeDeviceCtrl 0x00000004 // CH375的综合控制管道
  82. #define mPipeInterUp 0x00000005 // CH375的中断数据上传管道
  83. #define mPipeDataUp 0x00000006 // CH375的数据块上传管道
  84. #define mPipeDataDown 0x00000007 // CH375的数据块下传管道
  85. #define mPipeAuxDown 0x00000008 // CH375的辅助数据下传管道
  86. // 应用层接口的功能代码
  87. #define mFuncNoOperation 0x00000000 // 无操作
  88. #define mFuncGetVersion 0x00000001 // 获取驱动程序版本号
  89. #define mFuncGetConfig 0x00000002 // 获取USB设备配置描述符
  90. #define mFuncSetExclusive 0x0000000b // 设置独占使用
  91. #define mFuncResetDevice 0x0000000c // 复位USB设备
  92. #define mFuncResetPipe 0x0000000d // 复位USB管道
  93. #define mFuncAbortPipe 0x0000000e // 取消USB管道的数据请求
  94. #define mFuncSetTimeout 0x0000000f // 设置USB通讯超时
  95. #define mFuncBufferMode 0x00000010 // 设定缓冲上传模式及查询缓冲区中的数据长度
  96. #define mFuncBufferModeDn 0x00000011 // 设定缓冲下传模式及查询缓冲区中的数据长度
  97. // USB设备标准请求代码
  98. #define mUSB_CLR_FEATURE 0x01
  99. #define mUSB_SET_FEATURE 0x03
  100. #define mUSB_GET_STATUS 0x00
  101. #define mUSB_SET_ADDRESS 0x05
  102. #define mUSB_GET_DESCR 0x06
  103. #define mUSB_SET_DESCR 0x07
  104. #define mUSB_GET_CONFIG 0x08
  105. #define mUSB_SET_CONFIG 0x09
  106. #define mUSB_GET_INTERF 0x0a
  107. #define mUSB_SET_INTERF 0x0b
  108. #define mUSB_SYNC_FRAME 0x0c
  109. // CH375控制传输的厂商专用请求类型
  110. #define mCH375_VENDOR_READ 0xc0 // 通过控制传输实现的CH375厂商专用读操作
  111. #define mCH375_VENDOR_WRITE 0x40 // 通过控制传输实现的CH375厂商专用写操作
  112. // CH375控制传输的厂商专用请求代码
  113. #define mCH375_SET_CONTROL 0x51 // 输出控制信号
  114. #define mCH375_GET_STATUS 0x52 // 输入状态信号
  115. // 寄存器的位定义
  116. #define mBitInputRxd 0x02 // 只读,RXD#引脚输入状态,1:高电平,0:低电平
  117. #define mBitInputReq 0x04 // 只读,REQ#引脚输入状态,1:高电平,0:低电平
  118. // 直接输入的状态信号的位定义
  119. #define mStateRXD 0x00000200 // RXD#引脚输入状态,1:高电平,0:低电平
  120. #define mStateREQ 0x00000400 // REQ#引脚输入状态,1:高电平,0:低电平
  121. #define MAX_DEVICE_PATH_SIZE 128 // 设备名称的最大字符数
  122. #define MAX_DEVICE_ID_SIZE 64 // 设备ID的最大字符数
  123. typedef VOID ( CALLBACK * mPCH375_INT_ROUTINE ) ( // 中断服务回调程序
  124. PUCHAR iBuffer ); // 指向一个缓冲区,提供当前的中断特征数据
  125. HANDLE WINAPI CH375OpenDevice( // 打开CH375设备,返回句柄,出错则无效
  126. ULONG iIndex ); // 指定CH375设备序号,0对应第一个设备,-1则自动搜索一个可以被打开的设备并返回序号
  127. VOID WINAPI CH375CloseDevice( // 关闭CH375设备
  128. ULONG iIndex ); // 指定CH375设备序号
  129. ULONG WINAPI CH375GetVersion( ); // 获得DLL版本号,返回版本号
  130. ULONG WINAPI CH375DriverCommand( // 直接传递命令给驱动程序,出错则返回0,否则返回数据长度
  131. ULONG iIndex, // 指定CH375设备序号,V1.6以上DLL也可以是设备打开后的句柄
  132. mPWIN32_COMMAND ioCommand ); // 命令结构的指针
  133. // 该程序在调用后返回数据长度,并且仍然返回命令结构,如果是读操作,则数据返回在命令结构中,
  134. // 返回的数据长度在操作失败时为0,操作成功时为整个命令结构的长度,例如读一个字节,则返回mWIN32_COMMAND_HEAD+1,
  135. // 命令结构在调用前,分别提供:管道号或者命令功能代码,存取数据的长度(可选),数据(可选)
  136. // 命令结构在调用后,分别返回:操作状态代码,后续数据的长度(可选),
  137. // 操作状态代码是由WINDOWS定义的代码,可以参考NTSTATUS.H,
  138. // 后续数据的长度是指读操作返回的数据长度,数据存放在随后的缓冲区中,对于写操作一般为0
  139. ULONG WINAPI CH375GetDrvVersion( ); // 获得驱动程序版本号,返回版本号,出错则返回0
  140. BOOL WINAPI CH375ResetDevice( // 复位USB设备
  141. ULONG iIndex ); // 指定CH375设备序号
  142. BOOL WINAPI CH375GetDeviceDescr( // 读取设备描述符
  143. ULONG iIndex, // 指定CH375设备序号
  144. PVOID oBuffer, // 指向一个足够大的缓冲区,用于保存描述符
  145. PULONG ioLength ); // 指向长度单元,输入时为准备读取的长度,返回后为实际读取的长度
  146. BOOL WINAPI CH375GetConfigDescr( // 读取配置描述符
  147. ULONG iIndex, // 指定CH375设备序号
  148. PVOID oBuffer, // 指向一个足够大的缓冲区,用于保存描述符
  149. PULONG ioLength ); // 指向长度单元,输入时为准备读取的长度,返回后为实际读取的长度
  150. BOOL WINAPI CH375SetIntRoutine( // 设定中断服务程序
  151. ULONG iIndex, // 指定CH375设备序号
  152. mPCH375_INT_ROUTINE iIntRoutine ); // 指定中断服务回调程序,为NULL则取消中断服务,否则在中断时调用该程序
  153. BOOL WINAPI CH375ReadInter( // 读取中断数据
  154. ULONG iIndex, // 指定CH375设备序号
  155. PVOID oBuffer, // 指向一个足够大的缓冲区,用于保存读取的中断数据
  156. PULONG ioLength ); // 指向长度单元,输入时为准备读取的长度,返回后为实际读取的长度
  157. BOOL WINAPI CH375AbortInter( // 放弃中断数据读操作
  158. ULONG iIndex ); // 指定CH375设备序号
  159. BOOL WINAPI CH375ReadData( // 读取数据块
  160. ULONG iIndex, // 指定CH375设备序号
  161. PVOID oBuffer, // 指向一个足够大的缓冲区,用于保存读取的数据
  162. PULONG ioLength ); // 指向长度单元,输入时为准备读取的长度,返回后为实际读取的长度
  163. BOOL WINAPI CH375AbortRead( // 放弃数据块读操作
  164. ULONG iIndex ); // 指定CH375设备序号
  165. BOOL WINAPI CH375WriteData( // 写出数据块
  166. ULONG iIndex, // 指定CH375设备序号
  167. PVOID iBuffer, // 指向一个缓冲区,放置准备写出的数据
  168. PULONG ioLength ); // 指向长度单元,输入时为准备写出的长度,返回后为实际写出的长度
  169. BOOL WINAPI CH375AbortWrite( // 放弃数据块写操作
  170. ULONG iIndex ); // 指定CH375设备序号
  171. BOOL WINAPI CH375WriteRead( // 先写出标准的数据块(命令),再读取标准的数据块(应答)
  172. ULONG iIndex, // 指定CH375设备序号
  173. PVOID iBuffer, // 指向一个缓冲区,放置准备写出的数据,长度不大于mCH375_PACKET_LENGTH
  174. PVOID oBuffer, // 指向一个足够大的缓冲区,长度不小于mCH375_PACKET_LENGTH,用于保存读取的数据
  175. PULONG ioLength ); // 指向长度单元,不大于mCH375_PACKET_LENGTH,输入时为准备写出的长度,返回后为实际读取的长度
  176. BOOL WINAPI CH375GetStatus( // 通过CH375直接输入数据和状态
  177. ULONG iIndex, // 指定CH375设备序号
  178. PULONG iStatus ); // 指向一个双字单元,用于保存状态数据
  179. // 位7-位0对应CH375的D7-D0引脚,位9对应CH375的RXD#引脚,位10对应CH375的REQ#引脚
  180. BOOL WINAPI CH375SetTimeout( // 设置USB数据读写的超时
  181. ULONG iIndex, // 指定CH375设备序号
  182. ULONG iWriteTimeout, // 指定USB写出数据块的超时时间,以毫秒mS为单位,0xFFFFFFFF指定不超时(默认值)
  183. ULONG iReadTimeout ); // 指定USB读取数据块的超时时间,以毫秒mS为单位,0xFFFFFFFF指定不超时(默认值)
  184. BOOL WINAPI CH375WriteAuxData( // 写出辅助数据
  185. ULONG iIndex, // 指定CH375设备序号
  186. PVOID iBuffer, // 指向一个缓冲区,放置准备写出的数据
  187. PULONG ioLength ); // 指向长度单元,输入时为准备写出的长度,返回后为实际写出的长度
  188. BOOL WINAPI CH375SetExclusive( // 设置独占使用当前CH375设备
  189. ULONG iIndex, // 指定CH375设备序号
  190. ULONG iExclusive ); // 为0则设备可以共享使用,非0则独占使用
  191. ULONG WINAPI CH375GetUsbID( // 获取USB设备ID,返回数据中,低16位为厂商ID,高16位为产品ID,错误时返回全0(无效ID)
  192. ULONG iIndex ); // 指定CH375设备序号
  193. PVOID WINAPI CH375GetDeviceName( // 返回指向CH375设备名称的缓冲区,出错则返回NULL
  194. ULONG iIndex ); // 指定CH375设备序号,0对应第一个设备
  195. BOOL WINAPI CH375SetBufUpload( // 设定内部缓冲上传模式
  196. ULONG iIndex, // 指定CH375设备序号,0对应第一个设备
  197. ULONG iEnableOrClear ); // 为0则禁止内部缓冲上传模式,使用直接上传,非0则启用内部缓冲上传模式并清除缓冲区中的已有数据
  198. // 如果启用内部缓冲上传模式,那么CH375驱动程序创建线程自动接收USB上传数据到内部缓冲区,同时清除缓冲区中的已有数据,当应用程序调用CH375ReadData后将立即返回缓冲区中的已有数据
  199. LONG WINAPI CH375QueryBufUpload( // 查询内部上传缓冲区中的已有数据包个数,成功返回数据包个数,出错返回-1
  200. ULONG iIndex ); // 指定CH375设备序号,0对应第一个设备
  201. BOOL WINAPI CH375SetBufDownload( // 设定内部缓冲下传模式
  202. ULONG iIndex, // 指定CH375设备序号,0对应第一个设备
  203. ULONG iEnableOrClear ); // 为0则禁止内部缓冲下传模式,使用直接下传,非0则启用内部缓冲下传模式并清除缓冲区中的已有数据
  204. // 如果启用内部缓冲下传模式,那么当应用程序调用CH375WriteData后将仅仅是将USB下传数据放到内部缓冲区并立即返回,而由CH375驱动程序创建的线程自动发送直到完毕
  205. LONG WINAPI CH375QueryBufDownload( // 查询内部下传缓冲区中的剩余数据包个数(尚未发送),成功返回数据包个数,出错返回-1
  206. ULONG iIndex ); // 指定CH375设备序号,0对应第一个设备
  207. BOOL WINAPI CH375ResetInter( // 复位中断数据读操作
  208. ULONG iIndex ); // 指定CH375设备序号
  209. BOOL WINAPI CH375ResetAux( // 复位辅助数据写操作
  210. ULONG iIndex ); // 指定CH375设备序号
  211. BOOL WINAPI CH375ResetRead( // 复位数据块读操作
  212. ULONG iIndex ); // 指定CH375设备序号
  213. BOOL WINAPI CH375ResetWrite( // 复位数据块写操作
  214. ULONG iIndex ); // 指定CH375设备序号
  215. typedef VOID ( CALLBACK * mPCH375_NOTIFY_ROUTINE ) ( // 设备事件通知回调程序
  216. ULONG iEventStatus ); // 设备事件和当前状态(在下行定义): 0=设备拔出事件, 3=设备插入事件
  217. #define CH375_DEVICE_ARRIVAL 3 // 设备插入事件,已经插入
  218. #define CH375_DEVICE_REMOVE_PEND 1 // 设备将要拔出
  219. #define CH375_DEVICE_REMOVE 0 // 设备拔出事件,已经拔出
  220. BOOL WINAPI CH375SetDeviceNotify( // 设定设备事件通知程序
  221. ULONG iIndex, // 指定CH375设备序号,0对应第一个设备
  222. PCHAR iDeviceID, // 可选参数,指向字符串,指定被监控的设备的ID,字符串以\0终止
  223. mPCH375_NOTIFY_ROUTINE iNotifyRoutine ); // 指定设备事件回调程序,为NULL则取消事件通知,否则在检测到事件时调用该程序
  224. BOOL WINAPI CH375SetTimeoutEx( // 设置USB数据读写的超时
  225. ULONG iIndex, // 指定CH375设备序号
  226. ULONG iWriteTimeout, // 指定USB写出数据块的超时时间,以毫秒mS为单位,0xFFFFFFFF指定不超时(默认值)
  227. ULONG iReadTimeout, // 指定USB读取数据块的超时时间,以毫秒mS为单位,0xFFFFFFFF指定不超时(默认值)
  228. ULONG iAuxTimeout, // 指定USB辅助下传数据的超时时间,以毫秒mS为单位,0xFFFFFFFF指定不超时(默认值)
  229. ULONG iInterTimeout ); // 指定USB中断上传数据的超时时间,以毫秒mS为单位,0xFFFFFFFF指定不超时(默认值)
  230. #ifdef __cplusplus
  231. }
  232. #endif
  233. #endif // _CH375_DLL_H