高速PCI信號采集卡設計與實(shí)現綜合實(shí)例之:主機應用程序和驅動(dòng)程序的接口設計
13.5主機應用程序和驅動(dòng)程序的接口設計
13.5.1驅動(dòng)程序例程的封裝
通過(guò)調用PCI設備驅動(dòng)程序的例程,我們可以實(shí)現操作系統對PCI設備的控制。但是直接調用例程進(jìn)行編程往往顯得不夠直接,也不具有足夠的針對性。因此在高級語(yǔ)言里面對PCI設備或者信號采集設備的控制,往往是調用已經(jīng)封裝過(guò)的例程。
將例程進(jìn)行封裝,形成一些可以調用的具有針對性的PCI信號采集設備API函數,是驅動(dòng)開(kāi)發(fā)者比較頭疼的問(wèn)題。因為這個(gè)過(guò)程需要了解WindowsWDM模型,熟悉WindowsDDK的開(kāi)發(fā)過(guò)程,而這些往往需要花費硬件開(kāi)發(fā)者的大量時(shí)間。
幸運的是,有一些很好的集成開(kāi)發(fā)環(huán)境幫助我們完成了這個(gè)工作。用戶(hù)只需要將具體設備的參數導入開(kāi)發(fā)工具的向導中,即可自動(dòng)生成對應該設備的驅動(dòng)程序。這些開(kāi)發(fā)工具包括DriverStudio、Windriver等。
另外,針對基于PCI9054的PCI設備,PLX公司已經(jīng)為用戶(hù)提供了較為完備的API函數包。用戶(hù)只需要根據需要調用其中的API函數,即可輕松實(shí)現對PCI9054采集設備的控制。下面介紹幾個(gè)常用的PLXAPI函數。
13.5.2PLXAPI函數
PLX公司為其提供的動(dòng)態(tài)鏈接庫中包含了豐富的API函數,可以用于PCI9054卡的控制與傳輸。在這些API函數中,有如下的幾個(gè)是常常用到的(注:在2007年5月提供的PLXSDKVersion5.0中,API函數名有所更新,下面仍然按照V5版之前的函數名進(jìn)行介紹)。
1.PlxPciDeviceOpen函數
用于設備啟動(dòng),在對設備進(jìn)行任何操作之前都應該先打開(kāi)設備,其函數原型為:
RETURN_CODEPlxPciDeviceOpen(
DEVICE_LOCATION*pDevice,//指向包含設備信息的數據結構的指針
HANDLE*pHandle //指向用于存放已打開(kāi)設備的句柄的指針
);
DEVICE_LOCATION數據結構的定義如下:
typedefstruct_DEVICE_LOCATION{
U8BusNumber;//PCI設備所在的總線(xiàn)號
U8SlotNumber;//PCI設備所在的插槽號
U16DeviceId;//PCI設備的設備號
U16VendorId;//PCI設備的廠(chǎng)商號
U8SerialNumber[12];//PCI設備的惟一標識碼
}DEVICE_LOCATION;
對于PCI9054來(lái)說(shuō),DeviceId為10b5,VendorId為5406(不同的版本可能為9054)。SerialBumber的格式為“devicename>-indexnumber>”。如:有PLX9054的PCI卡,如果它的序列號為“Pci9054-1”,表示這是第二個(gè)PLX9054設備,第一個(gè)為“Pci9054-0”。
2.PlxPciDeviceClose函數
用于關(guān)閉已打開(kāi)的PCI設備,其函數原型為:
RETURN_CODEPlxPciDeviceClose(HANDLEhDevice);//已打開(kāi)的PCI設備的句柄
3.PlxPciBoardReset函數
用于復位已經(jīng)打開(kāi)的PCI設備,其函數原型為:
VOIDPlxPciBoardReset(HANDLEhDevice);//已打開(kāi)的PCI設備的句柄
4.PlxBusIopRead函數
用于從本地總線(xiàn)讀取數據(常指DirectSlave讀模式),其函數原型為:
RETURN_CODEPlxBusIopRead(
HANDLEhDevice,//已打開(kāi)的PCI設備的句柄
IOP_SPACEIopSpace,//PCI總線(xiàn)至本地總線(xiàn),映射空間0/1
U32address,//若bRemap=FALSE,代表IOPSpace相對地址,否則是絕對地址
BOOLEANbRemap,//絕對地址與相對地址布爾值
VOID*pBuffer,//指向用戶(hù)用于存放讀取數據的緩沖區
U32ByteCount,
ACCESS_TYPEAccessType);//讀數據方式,支持本地總線(xiàn)使用8位、16位或32位進(jìn)行傳輸
5.PlxBusIopWrite函數
用于從本地總線(xiàn)寫(xiě)數據(常指DirectSlave寫(xiě)模式),其函數原型為:
RETURN_CODEPlxBusIopWrite(
HANDLEhDevice,//已打開(kāi)的PCI設備的句柄
IOP_SPACEIopSpace,//PCI總線(xiàn)至本地總線(xiàn),映射空間0/1
U32address,//若bRemap=FALSE,代表IOPSpace相對地址,否則是絕對地址
BOOLEANbRemap,//絕對地址與相對地址布爾值
VOID*pBuffer,//指向用戶(hù)用于存放讀取數據的緩沖區
U32ByteCount,//讀取的數據量大小
ACCESS_TYPEAccessType);//讀數據方式,支持本地總線(xiàn)使用8位、16位或32位進(jìn)行傳輸
6.PlxIntrAttach函數
用于鏈接中斷,當有效中斷產(chǎn)生時(shí),將事件傳遞給指針句柄,其函數原型為:
RETURN_CODEPlxIntrAttach(
HANDLEhDevice,//已打開(kāi)的PCI設備的句柄
PLX_INTRintrTypes,//含有需要指定的中斷信息的數據結構(PLX_INTR)
HANDLE*pEventHdl);//指向接收中斷事件的指針句柄
7.PlxIntrDisable函數
用于禁止某類(lèi)中斷,其函數原型為:
RETURN_CODEPlxIntrDisable(
HANDLEhDevice,//已打開(kāi)的PCI設備的句柄
PLX_INTR*pPlxIntr); //含有需要指定的中斷信息的數據結構(PLX_INTR)
8.PlxIntrEnable函數
用于使能某類(lèi)中斷,其函數原型為:
RETURN_CODEPlxIntrEnable(
HANDLEhDevice,//已打開(kāi)的PCI設備的句柄
PLX_INTR*pPlxIntr); //含有需要指定的中斷信息的數據結構(PLX_INTR)
9.PlxIntrStatusGet函數
用于返回當前終端狀態(tài),其函數原型為:
RETURN_CODEPlxIntrStatusGet(
HANDLEhDevice,//已打開(kāi)的PCI設備的句柄
PLX_INTR*pPlxIntr); //含有需要指定的中斷信息的數據結構(PLX_INTR)
10.PlxIntrWait函數
用于等待中斷,并可設定等待時(shí)間長(cháng)度,其函數原型為:
RETURN_CODEPlxIntrWait(
HANDLEhDevice,//已打開(kāi)的PCI設備的句柄
HANDLEhEvent,//被等待的事件句柄
U32Timeout_ms//為等待的時(shí)間長(cháng)度,單位為ms
);
由于此函數只能用在Linux系統中,因此在Windows系統中使用PLXAPI函數包等待中斷時(shí),使用另外兩個(gè)WindowsAPI函數進(jìn)行中斷等待,即WaitSingleObject()函數和WaitMultipleObject()函數。
11.PlxDmaSglChannelOpen函數
用于開(kāi)啟Scatter/Gather模式DMA通道,其函數原型為:
RETURN_CODEPlxDmaSglChannelOpen(
HANDLEhDevice,//已打開(kāi)的PCI設備的句柄
DMA_CHANNELchannel,//為被開(kāi)啟的DMA通道
DMA_CHANNEL_DESC*pDesc);//包含DMA通道的參數描述結構體(DMA_CHANNEL_DESC)指針
12.PlxDmaSglChannelClose函數
用于關(guān)閉已經(jīng)打開(kāi)的Scatter/Gather模式DMA通道,其函數原型為:
RETURN_CODEPlxDmaSglChanneClose(
HANDLEhDevice,//已打開(kāi)的PCI設備的句柄
DMA_CHANNELchannel);//將要關(guān)閉的已被開(kāi)啟的DMA通道
13.PlxDmaSglTransfer函數
用于開(kāi)始進(jìn)行Scatter/Gather模式的DMA傳輸,其函數原型為:
RETURN_CODEPlxDmaSglTransfer(
HANDLEhDevice, //已打開(kāi)的PCI設備的句柄
DMA_CHANNELchannel, //進(jìn)行Scatter/Gather模式DMA傳輸的通道
DMA_TRANSFER_ELEMENT*dmaData, //指向用于DMA數據緩沖區結構(DMA_TRANSFER_
//ELEMENT)指針
BOOLEANreturnImmediate); //取值為FALSE表示程序等待DMA傳輸結束后再執行下一
//條指令
//,反之,則不等待結束就執行下一條指令
13.5.3API函數調用
有了這些豐富的API函數資源,用戶(hù)即可根據自己的需要為信號采集設備設計功能多樣的應用程序。在進(jìn)行應用程序的設計時(shí),只需要將API函數庫包含在用戶(hù)的程序中即可。
PLX公司提供的PLXSDK開(kāi)發(fā)包中包含了完整的API函數庫文件。將這些API庫文件復制到用戶(hù)的應用程序目錄下,并在程序中include進(jìn)去,即可調用這些API函數。更多的函數及用法詳見(jiàn)PLXSDK的編程者開(kāi)發(fā)手冊。
13.5.4PCI9054驅動(dòng)程序安裝
INF文件是安裝設備驅動(dòng)程序時(shí)必須使用的文件,其擴展名為.inf。驅動(dòng)程序安裝后將它保存在windows/inf目錄中,是Winodws操作系統下用來(lái)描述設備或文件等數據信息的文件。
INF文件全稱(chēng)InformationFile文件。在操作系統發(fā)現新硬件之后向系統指明應該安裝的驅動(dòng)程序,系統為設備提供的服務(wù)以及注冊表項要修改的內容。它為該設備提供一個(gè)全面描述硬件參數和相應驅動(dòng)文件(動(dòng)態(tài)鏈接庫等文件)的信息。
驅動(dòng)程序安裝的最終結果包括對系統的兩個(gè)永久更改。
·描述驅動(dòng)程序的系統注冊表項、它的卸載順序以及任何正確的配置資料。
·將驅動(dòng)程序文件復制到一個(gè)指定的系統目錄中。
INF文件是由標準的ASCII碼組成,可以用任何一款文字編輯器查看修改其中的內容。它是分節的,每節以“[]”擴起來(lái),每一個(gè)節名最長(cháng)為255個(gè)字符(Windows2000/XP/2003操作系統中)或28個(gè)字符(Windows98操作系統中)。
節與節之間的內容叫條目,每一個(gè)節是由許多的條目組成的。每一個(gè)條目都由“=”分開(kāi),如“a=b”。如果每一個(gè)條目的等號后有多個(gè)值,則每一個(gè)值之間用逗號分隔開(kāi)。INF對大小寫(xiě)不敏感,行注釋語(yǔ)句命令是“;”,類(lèi)似VisualBasic里的“’”。如果一行寫(xiě)不下,使用“”來(lái)?yè)Q行。更多關(guān)于INF文件的規則和說(shuō)明可以查看WindowsDDK的說(shuō)明,這里不再詳述。
通過(guò)INF文件,用戶(hù)可以允許系統自動(dòng)安裝信號采集設備的驅動(dòng)程序,或者在對話(huà)支持下按照系統安裝向導一步一步完成驅動(dòng)程序安裝過(guò)程。
評論