?? ch375dll.h
字號:
// 2003.09.08, 2003.12.28, 2004.10.15, 2004.12.05, 2004.12.10, 2005.01.20, 2005.02.23, 2005.07.15
//****************************************
//** Copyright (C) W.ch 1999-2005 **
//** Web: http://www.winchiphead.com **
//****************************************
//** DLL for USB interface chip CH375 **
//** C, VC5.0 **
//****************************************
//
// USB總線接口芯片CH375的應用層接口庫 V2.1
// 南京沁恒電子有限公司 作者: W.ch 2005.07
// CH375-DLL V2.1 , Support: Ctrl/Bulk/Int
// 運行環境: Windows 98/ME, Windows 2000/XP
// support USB chip: CH372/CH375
//
#ifndef _CH375_DLL_H
#define _CH375_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 mCH375_PACKET_LENGTH 64 // CH375支持的數據包的長度
#define mCH375_PKT_LEN_SHORT 8 // CH375支持的短數據包的長度
typedef struct _WIN32_COMMAND { // 定義WIN32命令接口結構
union {
ULONG mFunction; // 輸入時指定功能代碼或者管道號
NTSTATUS mStatus; // 輸出時返回操作狀態
};
ULONG mLength; // 存取長度,返回后續數據的長度
union {
mUSB_SETUP_PKT mSetupPkt; // USB控制傳輸的建立階段的數據請求
UCHAR mBuffer[ mCH375_PACKET_LENGTH ]; // 數據緩沖區,長度為0至255B
};
} mWIN32_COMMAND, *mPWIN32_COMMAND;
// WIN32應用層接口命令
#define IOCTL_CH375_COMMAND ( FILE_DEVICE_UNKNOWN << 16 | FILE_ANY_ACCESS << 14 | 0x0f37 << 2 | METHOD_BUFFERED ) // 專用接口
#define mWIN32_COMMAND_HEAD mOFFSET( mWIN32_COMMAND, mBuffer ) // WIN32命令接口的頭長度
#define mCH375_MAX_NUMBER 16 // 最多同時連接的CH375數
#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 ) // 默認數據長度加上命令結構頭的長度
// CH375端點地址
#define mCH375_ENDP_INTER_UP 0x81 // CH375的中斷數據上傳端點的地址
#define mCH375_ENDP_AUX_DOWN 0x01 // CH375的輔助數據下傳端點的地址
#define mCH375_ENDP_DATA_UP 0x82 // CH375的數據塊上傳端點的地址
#define mCH375_ENDP_DATA_DOWN 0x02 // CH375的數據塊下傳端點的地址
// 設備層接口提供的管道操作命令
#define mPipeDeviceCtrl 0x00000004 // CH375的綜合控制管道
#define mPipeInterUp 0x00000005 // CH375的中斷數據上傳管道
#define mPipeDataUp 0x00000006 // CH375的數據塊上傳管道
#define mPipeDataDown 0x00000007 // CH375的數據塊下傳管道
#define mPipeAuxDown 0x00000008 // CH375的輔助數據下傳管道
// 應用層接口的功能代碼
#define mFuncNoOperation 0x00000000 // 無操作
#define mFuncGetVersion 0x00000001 // 獲取驅動程序版本號
#define mFuncGetConfig 0x00000002 // 獲取USB設備配置描述符
#define mFuncSetExclusive 0x0000000b // 設置獨占使用
#define mFuncResetDevice 0x0000000c // 復位USB設備
#define mFuncResetPipe 0x0000000d // 復位USB管道
#define mFuncAbortPipe 0x0000000e // 取消USB管道的數據請求
#define mFuncSetTimeout 0x0000000f // 設置USB通訊超時
#define mFuncBufferMode 0x00000010 // 設定緩沖上傳模式及查詢緩沖區中的數據長度
#define mFuncBufferModeDn 0x00000011 // 設定緩沖下傳模式及查詢緩沖區中的數據長度
// 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
// CH375控制傳輸的廠商專用請求類型
#define mCH375_VENDOR_READ 0xc0 // 通過控制傳輸實現的CH375廠商專用讀操作
#define mCH375_VENDOR_WRITE 0x40 // 通過控制傳輸實現的CH375廠商專用寫操作
// CH375控制傳輸的廠商專用請求代碼
#define mCH375_SET_CONTROL 0x51 // 輸出控制信號
#define mCH375_GET_STATUS 0x52 // 輸入狀態信號
// 寄存器的位定義
#define mBitInputRxd 0x02 // 只讀,RXD#引腳輸入狀態,1:高電平,0:低電平
#define mBitInputReq 0x04 // 只讀,REQ#引腳輸入狀態,1:高電平,0:低電平
// 直接輸入的狀態信號的位定義
#define mStateRXD 0x00000200 // RXD#引腳輸入狀態,1:高電平,0:低電平
#define mStateREQ 0x00000400 // REQ#引腳輸入狀態,1:高電平,0:低電平
#define MAX_DEVICE_PATH_SIZE 128 // 設備名稱的最大字符數
#define MAX_DEVICE_ID_SIZE 64 // 設備ID的最大字符數
typedef VOID ( CALLBACK * mPCH375_INT_ROUTINE ) ( // 中斷服務回調程序
PUCHAR iBuffer ); // 指向一個緩沖區,提供當前的中斷特征數據
HANDLE WINAPI CH375OpenDevice( // 打開CH375設備,返回句柄,出錯則無效
ULONG iIndex ); // 指定CH375設備序號,0對應第一個設備,-1則自動搜索一個可以被打開的設備并返回序號
VOID WINAPI CH375CloseDevice( // 關閉CH375設備
ULONG iIndex ); // 指定CH375設備序號
ULONG WINAPI CH375GetVersion( ); // 獲得DLL版本號,返回版本號
ULONG WINAPI CH375DriverCommand( // 直接傳遞命令給驅動程序,出錯則返回0,否則返回數據長度
ULONG iIndex, // 指定CH375設備序號,V1.6以上DLL也可以是設備打開后的句柄
mPWIN32_COMMAND ioCommand ); // 命令結構的指針
// 該程序在調用后返回數據長度,并且仍然返回命令結構,如果是讀操作,則數據返回在命令結構中,
// 返回的數據長度在操作失敗時為0,操作成功時為整個命令結構的長度,例如讀一個字節,則返回mWIN32_COMMAND_HEAD+1,
// 命令結構在調用前,分別提供:管道號或者命令功能代碼,存取數據的長度(可選),數據(可選)
// 命令結構在調用后,分別返回:操作狀態代碼,后續數據的長度(可選),
// 操作狀態代碼是由WINDOWS定義的代碼,可以參考NTSTATUS.H,
// 后續數據的長度是指讀操作返回的數據長度,數據存放在隨后的緩沖區中,對于寫操作一般為0
ULONG WINAPI CH375GetDrvVersion( ); // 獲得驅動程序版本號,返回版本號,出錯則返回0
BOOL WINAPI CH375ResetDevice( // 復位USB設備
ULONG iIndex ); // 指定CH375設備序號
BOOL WINAPI CH375GetDeviceDescr( // 讀取設備描述符
ULONG iIndex, // 指定CH375設備序號
PVOID oBuffer, // 指向一個足夠大的緩沖區,用于保存描述符
PULONG ioLength ); // 指向長度單元,輸入時為準備讀取的長度,返回后為實際讀取的長度
BOOL WINAPI CH375GetConfigDescr( // 讀取配置描述符
ULONG iIndex, // 指定CH375設備序號
PVOID oBuffer, // 指向一個足夠大的緩沖區,用于保存描述符
PULONG ioLength ); // 指向長度單元,輸入時為準備讀取的長度,返回后為實際讀取的長度
BOOL WINAPI CH375SetIntRoutine( // 設定中斷服務程序
ULONG iIndex, // 指定CH375設備序號
mPCH375_INT_ROUTINE iIntRoutine ); // 指定中斷服務回調程序,為NULL則取消中斷服務,否則在中斷時調用該程序
BOOL WINAPI CH375ReadInter( // 讀取中斷數據
ULONG iIndex, // 指定CH375設備序號
PVOID oBuffer, // 指向一個足夠大的緩沖區,用于保存讀取的中斷數據
PULONG ioLength ); // 指向長度單元,輸入時為準備讀取的長度,返回后為實際讀取的長度
BOOL WINAPI CH375AbortInter( // 放棄中斷數據讀操作
ULONG iIndex ); // 指定CH375設備序號
BOOL WINAPI CH375ReadData( // 讀取數據塊
ULONG iIndex, // 指定CH375設備序號
PVOID oBuffer, // 指向一個足夠大的緩沖區,用于保存讀取的數據
PULONG ioLength ); // 指向長度單元,輸入時為準備讀取的長度,返回后為實際讀取的長度
BOOL WINAPI CH375AbortRead( // 放棄數據塊讀操作
ULONG iIndex ); // 指定CH375設備序號
BOOL WINAPI CH375WriteData( // 寫出數據塊
ULONG iIndex, // 指定CH375設備序號
PVOID iBuffer, // 指向一個緩沖區,放置準備寫出的數據
PULONG ioLength ); // 指向長度單元,輸入時為準備寫出的長度,返回后為實際寫出的長度
BOOL WINAPI CH375AbortWrite( // 放棄數據塊寫操作
ULONG iIndex ); // 指定CH375設備序號
BOOL WINAPI CH375WriteRead( // 先寫出標準的數據塊(命令),再讀取標準的數據塊(應答)
ULONG iIndex, // 指定CH375設備序號
PVOID iBuffer, // 指向一個緩沖區,放置準備寫出的數據,長度不大于mCH375_PACKET_LENGTH
PVOID oBuffer, // 指向一個足夠大的緩沖區,長度不小于mCH375_PACKET_LENGTH,用于保存讀取的數據
PULONG ioLength ); // 指向長度單元,不大于mCH375_PACKET_LENGTH,輸入時為準備寫出的長度,返回后為實際讀取的長度
BOOL WINAPI CH375GetStatus( // 通過CH375直接輸入數據和狀態
ULONG iIndex, // 指定CH375設備序號
PULONG iStatus ); // 指向一個雙字單元,用于保存狀態數據
// 位7-位0對應CH375的D7-D0引腳,位9對應CH375的RXD#引腳,位10對應CH375的REQ#引腳
BOOL WINAPI CH375SetTimeout( // 設置USB數據讀寫的超時
ULONG iIndex, // 指定CH375設備序號
ULONG iWriteTimeout, // 指定USB寫出數據塊的超時時間,以毫秒mS為單位,0xFFFFFFFF指定不超時(默認值)
ULONG iReadTimeout ); // 指定USB讀取數據塊的超時時間,以毫秒mS為單位,0xFFFFFFFF指定不超時(默認值)
BOOL WINAPI CH375WriteAuxData( // 寫出輔助數據
ULONG iIndex, // 指定CH375設備序號
PVOID iBuffer, // 指向一個緩沖區,放置準備寫出的數據
PULONG ioLength ); // 指向長度單元,輸入時為準備寫出的長度,返回后為實際寫出的長度
BOOL WINAPI CH375SetExclusive( // 設置獨占使用當前CH375設備
ULONG iIndex, // 指定CH375設備序號
ULONG iExclusive ); // 為0則設備可以共享使用,非0則獨占使用
ULONG WINAPI CH375GetUsbID( // 獲取USB設備ID,返回數據中,低16位為廠商ID,高16位為產品ID,錯誤時返回全0(無效ID)
ULONG iIndex ); // 指定CH375設備序號
PVOID WINAPI CH375GetDeviceName( // 返回指向CH375設備名稱的緩沖區,出錯則返回NULL
ULONG iIndex ); // 指定CH375設備序號,0對應第一個設備
BOOL WINAPI CH375SetBufUpload( // 設定內部緩沖上傳模式
ULONG iIndex, // 指定CH375設備序號,0對應第一個設備
ULONG iEnableOrClear ); // 為0則禁止內部緩沖上傳模式,使用直接上傳,非0則啟用內部緩沖上傳模式并清除緩沖區中的已有數據
// 如果啟用內部緩沖上傳模式,那么CH375驅動程序創建線程自動接收USB上傳數據到內部緩沖區,同時清除緩沖區中的已有數據,當應用程序調用CH375ReadData后將立即返回緩沖區中的已有數據
LONG WINAPI CH375QueryBufUpload( // 查詢內部上傳緩沖區中的已有數據包個數,成功返回數據包個數,出錯返回-1
ULONG iIndex ); // 指定CH375設備序號,0對應第一個設備
BOOL WINAPI CH375SetBufDownload( // 設定內部緩沖下傳模式
ULONG iIndex, // 指定CH375設備序號,0對應第一個設備
ULONG iEnableOrClear ); // 為0則禁止內部緩沖下傳模式,使用直接下傳,非0則啟用內部緩沖下傳模式并清除緩沖區中的已有數據
// 如果啟用內部緩沖下傳模式,那么當應用程序調用CH375WriteData后將僅僅是將USB下傳數據放到內部緩沖區并立即返回,而由CH375驅動程序創建的線程自動發送直到完畢
LONG WINAPI CH375QueryBufDownload( // 查詢內部下傳緩沖區中的剩余數據包個數(尚未發送),成功返回數據包個數,出錯返回-1
ULONG iIndex ); // 指定CH375設備序號,0對應第一個設備
BOOL WINAPI CH375ResetInter( // 復位中斷數據讀操作
ULONG iIndex ); // 指定CH375設備序號
BOOL WINAPI CH375ResetAux( // 復位輔助數據寫操作
ULONG iIndex ); // 指定CH375設備序號
BOOL WINAPI CH375ResetRead( // 復位數據塊讀操作
ULONG iIndex ); // 指定CH375設備序號
BOOL WINAPI CH375ResetWrite( // 復位數據塊寫操作
ULONG iIndex ); // 指定CH375設備序號
typedef VOID ( CALLBACK * mPCH375_NOTIFY_ROUTINE ) ( // 設備事件通知回調程序
ULONG iEventStatus ); // 設備事件和當前狀態(在下行定義): 0=設備拔出事件, 3=設備插入事件
#define CH375_DEVICE_ARRIVAL 3 // 設備插入事件,已經插入
#define CH375_DEVICE_REMOVE_PEND 1 // 設備將要拔出
#define CH375_DEVICE_REMOVE 0 // 設備拔出事件,已經拔出
BOOL WINAPI CH375SetDeviceNotify( // 設定設備事件通知程序
ULONG iIndex, // 指定CH375設備序號,0對應第一個設備
PCHAR iDeviceID, // 可選參數,指向字符串,指定被監控的設備的ID,字符串以\0終止
mPCH375_NOTIFY_ROUTINE iNotifyRoutine ); // 指定設備事件回調程序,為NULL則取消事件通知,否則在檢測到事件時調用該程序
#ifdef __cplusplus
}
#endif
#endif // _CH375_DLL_H
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -