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