?? ch341dll.h
字號:
// 2004.05.28, 2004.10.20, 2005.01.08, 2005.03.25, 2005.04.28, 2005.07.18, 2005.07.28
//****************************************
//** Copyright (C) W.ch 1999-2005 **
//** Web: http://www.winchiphead.com **
//****************************************
//** DLL for USB interface chip CH341 **
//** C, VC5.0 **
//****************************************
//
// USB總線接口芯片CH341并口應用層接口庫 V1.8
// 南京沁恒電子有限公司 作者: W.ch 2005.07
// CH341-DLL V1.8
// 運行環境: Windows 98/ME, Windows 2000/XP
// support USB chip: CH341, CH341A
// USB => Parallel, I2C, SPI, JTAG ...
//
#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 mFuncSetTimeout 0x00000009 // 設置USB通訊超時
#define mFuncSetExclusive 0x0000000b // 設置獨占使用
#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
#define mFuncWriteRead 0x00000014 // 先輸出再輸入
#define mFuncBufferMode 0x00000020 // 設定緩沖上傳模式及查詢緩沖區中的數據長度
#define mFuncBufferModeDn 0x00000021 // 設定緩沖下傳模式及查詢緩沖區中的數據長度
// 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_CMD_R0 0xAC // 從并口讀數據0
#define mCH341_PARA_CMD_R1 0xAD // 從并口讀數據1
#define mCH341_PARA_CMD_W0 0xA6 // 向并口寫數據0
#define mCH341_PARA_CMD_W1 0xA7 // 向并口寫數據1
#define mCH341_PARA_CMD_STS 0xA0 // 獲取并口狀態
// CH341A并口操作命令代碼
#define mCH341A_CMD_SET_OUTPUT 0xA1 // 設置并口輸出
#define mCH341A_CMD_IO_ADDR 0xA2 // MEM帶地址讀寫/輸入輸出,從次字節開始為命令流
#define mCH341A_CMD_SPI_STREAM 0xA8 // SPI接口的命令包,從次字節開始為數據流
#define mCH341A_CMD_SIO_STREAM 0xA9 // SIO接口的命令包,從次字節開始為數據流
#define mCH341A_CMD_I2C_STREAM 0xAA // I2C接口的命令包,從次字節開始為I2C命令流
#define mCH341A_CMD_UIO_STREAM 0xAB // UIO接口的命令包,從次字節開始為命令流
// CH341A控制傳輸的廠商專用請求代碼
#define mCH341A_BUF_CLEAR 0xB2 // 清除未完成的數據
#define mCH341A_I2C_CMD_X 0x54 // 發出I2C接口的命令,立即執行
#define mCH341A_DELAY_MS 0x5E // 以亳秒為單位延時指定時間
#define mCH341A_GET_VER 0x5F // 獲取芯片版本
#define mCH341_EPP_IO_MAX ( mCH341_PACKET_LENGTH - 1 ) // CH341在EPP/MEM方式下單次讀寫數據塊的最大長度
#define mCH341A_EPP_IO_MAX 0xFF // CH341A在EPP/MEM方式下單次讀寫數據塊的最大長度
#define mCH341A_CMD_IO_ADDR_W 0x00 // MEM帶地址讀寫/輸入輸出的命令流:寫數據,位6-位0為地址,下一個字節為待寫數據
#define mCH341A_CMD_IO_ADDR_R 0x80 // MEM帶地址讀寫/輸入輸出的命令流:讀數據,位6-位0為地址,讀出數據一起返回
#define mCH341A_CMD_I2C_STM_STA 0x74 // I2C接口的命令流:產生起始位
#define mCH341A_CMD_I2C_STM_STO 0x75 // I2C接口的命令流:產生停止位
#define mCH341A_CMD_I2C_STM_OUT 0x80 // I2C接口的命令流:輸出數據,位5-位0為長度,后續字節為數據,0長度則只發送一個字節并返回應答
#define mCH341A_CMD_I2C_STM_IN 0xC0 // I2C接口的命令流:輸入數據,位5-位0為長度,0長度則只接收一個字節并發送無應答
#define mCH341A_CMD_I2C_STM_MAX ( min( 0x3F, mCH341_PACKET_LENGTH ) ) // I2C接口的命令流單個命令輸入輸出數據的最大長度
#define mCH341A_CMD_I2C_STM_SET 0x60 // I2C接口的命令流:設置參數,位2=SPI的I/O數(0=單入單出,1=雙入雙出),位1位0=I2C速度(00=低速,01=標準,10=快速,11=高速)
#define mCH341A_CMD_I2C_STM_US 0x40 // I2C接口的命令流:以微秒為單位延時,位3-位0為延時值
#define mCH341A_CMD_I2C_STM_MS 0x50 // I2C接口的命令流:以亳秒為單位延時,位3-位0為延時值
#define mCH341A_CMD_I2C_STM_DLY 0x0F // I2C接口的命令流單個命令延時的最大值
#define mCH341A_CMD_I2C_STM_END 0x00 // I2C接口的命令流:命令包提前結束
#define mCH341A_CMD_UIO_STM_IN 0x00 // UIO接口的命令流:輸入數據D7-D0
#define mCH341A_CMD_UIO_STM_DIR 0x40 // UIO接口的命令流:設定I/O方向D5-D0,位5-位0為方向數據
#define mCH341A_CMD_UIO_STM_OUT 0x80 // UIO接口的命令流:輸出數據D5-D0,位5-位0為數據
#define mCH341A_CMD_UIO_STM_US 0xC0 // UIO接口的命令流:以微秒為單位延時,位5-位0為延時值
#define mCH341A_CMD_UIO_STM_END 0x20 // UIO接口的命令流:命令包提前結束
// CH341并口工作模式
#define mCH341_PARA_MODE_EPP 0x00 // CH341并口工作模式為EPP方式
#define mCH341_PARA_MODE_EPP17 0x00 // CH341A并口工作模式為EPP方式V1.7
#define mCH341_PARA_MODE_EPP19 0x01 // CH341A并口工作模式為EPP方式V1.9
#define mCH341_PARA_MODE_MEM 0x02 // CH341并口工作模式為MEM方式
// I/O方向設置位定義,直接輸入的狀態信號的位定義,直接輸出的位數據定義
#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 mStateBitWAIT 0x00002000 // 只讀可寫,WAIT#引腳輸入狀態,1:高電平,0:低電平
#define mStateBitDATAS 0x00004000 // 只寫可讀,DATAS#/READ#引腳輸入狀態,1:高電平,0:低電平
#define mStateBitADDRS 0x00008000 // 只寫可讀,ADDRS#/ADDR/ALE引腳輸入狀態,1:高電平,0:低電平
#define mStateBitRESET 0x00010000 // 只寫,RESET#引腳輸入狀態,1:高電平,0:低電平
#define mStateBitWRITE 0x00020000 // 只寫,WRITE#引腳輸入狀態,1:高電平,0:低電平
#define mStateBitSDA 0x00800000 // 只讀,SDA引腳輸入狀態,1:高電平,0:低電平
#define MAX_DEVICE_PATH_SIZE 128 // 設備名稱的最大字符數
#define MAX_DEVICE_ID_SIZE 64 // 設備ID的最大字符數
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -