?? ch375dll.pas
字號:
unit CH375DLL;
interface
// 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
//
uses main,SysUtils,unit1;
Const
mCH375_PACKET_LENGTH = 64; // CH375支持的數據包的長度
mCH375_MAX_NUMBER = 16; // 最多同時連接的CH375數
mMAX_BUFFER_LENGTH = $1000; // 數據緩沖區最大長度
mDEFAULT_BUFFER_LEN = $400; // 數據緩沖區默認長度1024
// CH375端點地址
mCH375_ENDP_INTER_UP = $81; // CH375的中斷數據上傳端點的地址
mCH375_ENDP_INTER_DOWN = $1; // CH375的中斷數據下傳端點的地址
mCH375_ENDP_DATA_UP = $82; // CH375的數據塊上傳端點的地址
mCH375_ENDP_DATA_DOWN = $2; //CH375的數據塊下傳端點的地址
// 設備層接口提供的管道操作命令
mPipeDeviceCtrl = $4; // CH375的綜合控制管道;
mPipeInterUp = $5; //CH375的中斷數據上傳管道;
mPipeDataUp = $6; //CH375的數據塊上傳管道
mPipeDataDown = $7; //CH375的數據塊下傳管道
mPipeAuxDown =$8; // CH375的輔助數據下傳管道
// 應用層接口的功能代碼
mFuncNoOperation = $H0; // 無操作
mFuncGetVersion = $1; // 獲取驅動程序版本號
mFuncGetConfig = $2; // 獲取USB設備配置描述符
mFuncSetExclusive = $b; // 設置獨占使用
mFuncResetDevice = $C; // 復位USB設備
mFuncResetPipe = $D; // 復位USB管道
mFuncAbortPipe = $E; // 取消USB管道的數據請求
mFuncSetTimeout = $0f; // 設置USB通訊超時
mFuncBufferMode = $10; // 設定緩沖上傳模式及查詢緩沖區中的數據長度
// USB設備標準請求代碼
mUSB_CLR_FEATURE = $1;
mUSB_SET_FEATURE = $3;
mUSB_GET_STATUS = $0 ;
mUSB_SET_ADDRESS = $5;
mUSB_GET_DESCR = $6;
mUSB_SET_DESCR = $7;
mUSB_GET_CONFIG = $8;
mUSB_SET_CONFIG = $9;
mUSB_GET_INTERF = $A;
mUSB_SET_INTERF = $B;
mUSB_SYNC_FRAME = $C;
// CH375控制傳輸的廠商專用請求類型
mCH375_VENDOR_READ = $C0; //通過控制傳輸實現的CH375供應商專用讀操作
mCH375_VENDOR_WRITE = $40; //通過控制傳輸實現的CH375供應商專用寫操作
// CH375控制傳輸的供應商專用請求代碼
mCH375_SET_CONTROL = $51; // 輸出控制信號
mCH375_GET_STATUS = $52; // 輸入狀態信號
// 寄存器的位定義
mBitInputRxd = $2; // 只讀,RXD#引腳輸入狀態,1:高電平,0:低電平
mBitInputReq = $4; // 只讀,REQ#引腳輸入狀態,1:高電平,0:低電平
// 直接輸入的狀態信號的位定義
mStateRXD = $200; // RXD#引腳輸入狀態,1:高電平,0:低電平
mStateREQ = $400; // REQ#引腳輸入狀態,1:高電平,0:低電平
type
PVOID =Pointer;
plong=pcardinal;
TiIntRoutine=procedure(mbuffer:pbytearray);stdcall;
Type
mUspValue=record
mUspValueLow : Byte;
mUspValueHigh : Byte;
End;
Type
mUspIndex=record
mUspIndexLow : Byte;
mUspIndexHigh : Byte;
End ;
Type
USB_SETUP_PKT=record
mUspReqType : Byte;
mUspRequest : Byte;
mUspValue : mUspValue;
mUspIndex : mUspIndex;
mLength : Integer;
End ;
Type
WIN32_COMMAND=record //定義WIN32命令接口結構
mFunction : cardinal; //輸入時指定功能代碼或者管道號
//輸出時返回操作狀態
mLength : cardinal; //存取長度,返回后續數據的長度
mBuffer:array[0..(mCH375_PACKET_LENGTH-1)] of Byte; //數據緩沖區,長度為0至255B '數據緩沖區,長度為0至255B
End ;
var
mUSB_SETUP_PKT :USB_SETUP_PKT;
mWIN32_COMMAND : WIN32_COMMAND;
mm:procedure(mbuffer:pbytearray);stdcall;
Function CH375OpenDevice(iIndex :cardinal):cardinal ;Stdcall; external 'CH375DLL.DLL' ;
//打開CH375設備,返回句柄,出錯則無效. 指定CH375設備序號,0對應第一個設備
procedure CH375CloseDevice(iIndex :cardinal) ;Stdcall; external 'CH375DLL.DLL';
//關閉CH375設備,指定CH375設備序號
Function CH375GetVersion():cardinal ;Stdcall; external 'CH375DLL.DLL';
//獲得DLL版本號,返回版本號
Function CH375DriverCommand ( // 直接傳遞命令給驅動程序,出錯則返回0,否則返回數據長度
iIndex:cardinal; // 指定CH375設備序號,V1.6以上DLL也可以是設備打開后的句柄
ioCommand:WIN32_COMMAND // 命令結構的指針
):cardinal;Stdcall;external 'CH375DLL.DLL';
// 該程序在調用后返回數據長度,并且仍然返回命令結構,如果是讀操作,則數據返回在命令結構中,
// 返回的數據長度在操作失敗時為0,操作成功時為整個命令結構的長度,例如讀一個字節,則返回mWIN32_COMMAND_HEAD+1,
// 命令結構在調用前,分別提供:管道號或者命令功能代碼,存取數據的長度(可選),數據(可選)
// 命令結構在調用后,分別返回:操作狀態代碼,后續數據的長度(可選),
// 操作狀態代碼是由WINDOWS定義的代碼,可以參考NTSTATUS.H,
// 后續數據的長度是指讀操作返回的數據長度,數據存放在隨后的緩沖區中,對于寫操作一般為0
Function CH375GetDrvVersion:cardinal;Stdcall; external'CH375DLL.DLL';
//獲得驅動程序版本號,返回版本號,出錯則返回0
Function CH375ResetDevice(iIndex:cardinal) : Boolean ;Stdcall; external 'CH375DLL.DLL';
//復位USB設備, iIndex 指定CH375設備序號
Function CH375GetDeviceDescr (iIndex :cardinal;oBuffer:pvoid;ioLength:plong) : Boolean ;Stdcall; external'CH375DLL.DLL';
//讀取設備描述符
//iIndex指定CH375設備序號
//oBuffer指向一個足夠大的緩沖區,用于保存描述符
//ioLength指向長度單元,輸入時為準備讀取的長度,返回后為實際讀取的長度
Function CH375GetConfigDescr(iIndex :cardinal; oBuffer :pvoid; ioLength:plong) : Boolean ;Stdcall; external 'CH375DLL.DLL' ;
//讀取配置描述符
//iIndex指定CH375設備序號
//oBuffer指向一個足夠大的緩沖區,用于保存描述符
//ioLength 指向長度單元,輸入時為準備讀取的長度,返回后為實際讀取的長度
Function CH375SetIntRoutine (iIndex:cardinal;iIntRoutine :TiIntRoutine) :boolean ;Stdcall; external 'CH375DLL.DLL';
//設定中斷服務程序
//iIndex指定CH375設備序號
//iIntRoutine指定中斷服務程序,為NULL則取消中斷服務,否則在中斷時調用該程序
//"TiIntRoutine"過程傳遞參數要用非默認的'Register'方式傳遞.
Function CH375ReadInter(iIndex:cardinal;oBuffer:pvoid;ioLength :plong) :Boolean ; Stdcall;external 'CH375DLL.DLL';
//讀取中斷數據
//iIndex指定CH375設備序號
//oBuffer指向一個足夠大的緩沖區,用于保存描述符
//ioLength指向長度單元,輸入時為準備讀取的長度,返回后為實際讀取的長度
Function CH375AbortInter (iIndex :cardinal) :Boolean ;Stdcall; external 'CH375DLL.DLL';
//放棄中斷數據讀操作
//iIndex 指定CH375設備序號
Function CH375ReadData (iIndex :cardinal;oBuffer :pvoid;ioLength :plong):Boolean ;Stdcall; external 'CH375DLL.DLL'; //讀取數據塊
//iIndex指定CH375設備序號,oBuffer指向一個足夠大的緩沖區,用于保存描述符,ioLength指向長度單元,輸入時為準備讀取的長度,返回后為實際讀取的長度
function CH375AbortRead(iIndex:cardinal):boolean ;Stdcall; external 'CH375DLL.DLL' ;
//放棄數據塊讀操作
//iIndex 指定CH375設備序號
Function CH375WriteData(iIndex :cardinal;iBuffer :pvoid;ioLength :plong):longbool ;Stdcall; external 'CH375DLL.DLL';
//先寫出標準的數據塊(命令,長度不超過8字節),再讀取標準的數據塊(應答,長度不超過8字節)
//iIndex指定CH375設備序號,oBuffer指向一個足夠大的緩沖區,用于保存描述符,ioLength指向長度單元,輸入時為準備讀取的長度,返回后為實際讀取的長度
Function CH375AbortWrite (iIndex:cardinal):boolean ;Stdcall; external 'CH375DLL.DLL';
//放棄數據塊寫操作
//iIndex 指定CH375設備序號
Function CH375WriteRead (iIndex:cardinal;iBuffer:byte;oBuffer :pvoid;ioLength:plong):Boolean ;Stdcall; external 'CH375DLL.DLL'; //寫出數據塊
//iIndex指定CH375設備序號,iBuffer指向一個緩沖區,放置準備寫出的數據,長度不大于mCH375_PACKET_LENGTH,oBuffer指向一個足夠大的緩沖區,用于保存描述符,ioLength指向長度單元,輸入時為準備讀取的長度,返回后為實際讀取的長度
Function CH375GetStatus(iIndex:cardinal;var iStatus:plong):boolean ;Stdcall; external 'CH375DLL.DLL';
//通過CH375直接輸入數據和狀態
//iIndex 指定CH375設備序號
//iStatus 指向一個雙字單元,用于保存狀態數據
//位7-位0對應CH375的D7-D0引腳,位9對應CH375的RXD#引腳,位10對應CH375的REQ#引腳
Function CH375SetTimeout( // 設置USB數據讀寫的超時
iIndex:cardinal; // 指定CH375設備序號
iWriteTimeout:cardinal; // 指定USB寫出數據塊的超時時間,以毫秒mS為單位,0xFFFFFFFF指定不超時(默認值)
iReadTimeout:cardinal // 指定USB讀取數據塊的超時時間,以毫秒mS為單位,0xFFFFFFFF指定不超時(默認值)
):boolean;Stdcall; external 'CH375DLL.DLL';
Function CH375WriteAuxData( // 寫出輔助數據
iIndex:cardinal; // 指定CH375設備序號
iBuffer:pvoid; // 指向一個緩沖區,放置準備寫出的數據
ioLength:plong // 指向長度單元,輸入時為準備寫出的長度,返回后為實際寫出的長度
):boolean;Stdcall; external 'CH375DLL.DLL';
Function CH375SetExclusive( // 設置獨占使用當前CH375設備
iIndex:cardinal; // 指定CH375設備序號
iExclusive:cardinal // 為0則設備可以共享使用,非0則獨占使用
):boolean;Stdcall; external 'CH375DLL.DLL';
Function CH375GetUsbID( // 獲取USB設備ID,返回數據中,低16位為廠商ID,高16位為產品ID,錯誤時返回全0(無效ID)
iIndex:cardinal // 指定CH375設備序號
):cardinal;Stdcall; external 'CH375DLL.DLL';
Function CH375GetDeviceName( // 返回指向CH375設備名稱的緩沖區,出錯則返回NULL
iIndex:cardinal // 指定CH375設備序號,0對應第一個設備
):pvoid;Stdcall; external 'CH375DLL.DLL';
Function CH375SetBufUpload( // 設定內部緩沖上傳模式
iIndex:cardinal; // 指定CH375設備序號,0對應第一個設備
iEnableOrClear:cardinal ):longbool;Stdcall; external 'CH375DLL.DLL'; // 為0則禁止內部緩沖上傳模式,使用直接上傳,非0則啟用內部緩沖上傳模式并清除緩沖區中的已有數據
// 如果啟用內部緩沖上傳模式,那么CH375驅動程序創建線程自動接收USB上傳數據到內部緩沖區,同時清除緩沖區中的已有數據,當應用程序調用CH375ReadData后將立即返回緩沖區中的已有數據
Function CH375QueryBufUpload( // 查詢內部上傳緩沖區中的已有數據包個數,成功返回數據包個數,出錯返回-1
iIndex:cardinal ):integer;Stdcall; external 'CH375DLL.DLL'; // 指定CH375設備序號,0對應第一個設備
Function CH375SetBufDownload( // 設定內部緩沖下傳模式
iIndex:cardinal; // 指定CH375設備序號,0對應第一個設備
iEnableOrClear:cardinal ):longbool;Stdcall; external 'CH375DLL.DLL'; // 為0則禁止內部緩沖下傳模式,使用直接下傳,非0則啟用內部緩沖下傳模式并清除緩沖區中的已有數據
// 如果啟用內部緩沖下傳模式,那么當應用程序調用CH375WriteData后將僅僅是將USB下傳數據放到內部緩沖區并立即返回,而由CH375驅動程序創建的線程自動發送直到完畢
Function CH375QueryBufDownload( // 查詢內部下傳緩沖區中的剩余數據包個數(尚未發送),成功返回數據包個數,出錯返回-1
iIndex:cardinal ):integer;Stdcall; external 'CH375DLL.DLL'; // 指定CH375設備序號,0對應第一個設備
Function CH375ResetInter( // 復位中斷數據讀操作
iIndex:cardinal ):longbool;Stdcall; external 'CH375DLL.DLL'; // 指定CH375設備序號
Function CH375ResetAux( // 復位輔助數據寫操作
iIndex:cardinal ):longbool;Stdcall; external 'CH375DLL.DLL'; // 指定CH375設備序號
Function CH375ResetRead( // 復位數據塊讀操作
iIndex:cardinal ):longbool;Stdcall; external 'CH375DLL.DLL'; // 指定CH375設備序號
Function CH375ResetWrite( // 復位數據塊寫操作
iIndex:cardinal ):longbool;Stdcall; external 'CH375DLL.DLL'; // 指定CH375設備序號
type
mPCH375_NOTIFY_ROUTINE=Procedure (iEventStatus:cardinal );stdcall; // 設備事件通知回調程序
// 設備事件和當前狀態(在下行定義): 0=設備拔出事件, 3=設備插入事件
const CH375_DEVICE_ARRIVAL= 3; // 設備插入事件,已經插入
CH375_DEVICE_REMOVE_PEND=1; // 設備將要拔出
CH375_DEVICE_REMOVE=0; // 設備拔出事件,已經拔出
Function CH375SetDeviceNotify( // 設定設備事件通知程序
iIndex:cardinal; // 指定CH375設備序號,0對應第一個設備
iDeviceID:PCHAR; // 可選參數,指向字符串,指定被監控的設備的ID,字符串以\0終止
iNotifyRoutine:mPCH375_NOTIFY_ROUTINE ):longbool;Stdcall; external 'CH375DLL.DLL'; // 指定設備事件回調程序,為NULL則取消事件通知,否則在檢測到事件時調用該程序
implementation
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -