加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
    • 13.5  主機(jī)應(yīng)用程序和驅(qū)動(dòng)程序的接口設(shè)計(jì)
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

高速PCI信號(hào)采集卡設(shè)計(jì)與實(shí)現(xiàn)綜合實(shí)例之:主機(jī)應(yīng)用程序和驅(qū)動(dòng)程序的接口設(shè)計(jì)

2013/08/30
閱讀需 17 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

 

13.5  主機(jī)應(yīng)用程序和驅(qū)動(dòng)程序的接口設(shè)計(jì)

13.5.1  驅(qū)動(dòng)程序例程的封裝

通過(guò)調(diào)用PCI設(shè)備驅(qū)動(dòng)程序的例程,我們可以實(shí)現(xiàn)操作系統(tǒng)對(duì)PCI設(shè)備的控制。但是直接調(diào)用例程進(jìn)行編程往往顯得不夠直接,也不具有足夠的針對(duì)性。因此在高級(jí)語(yǔ)言里面對(duì)PCI設(shè)備或者信號(hào)采集設(shè)備的控制,往往是調(diào)用已經(jīng)封裝過(guò)的例程。

將例程進(jìn)行封裝,形成一些可以調(diào)用的具有針對(duì)性的PCI信號(hào)采集設(shè)備API函數(shù),是驅(qū)動(dòng)開(kāi)發(fā)者比較頭疼的問(wèn)題。因?yàn)檫@個(gè)過(guò)程需要了解Windows WDM模型,熟悉Windows DDK的開(kāi)發(fā)過(guò)程,而這些往往需要花費(fèi)硬件開(kāi)發(fā)者的大量時(shí)間。

幸運(yùn)的是,有一些很好的集成開(kāi)發(fā)環(huán)境幫助我們完成了這個(gè)工作。用戶只需要將具體設(shè)備的參數(shù)導(dǎo)入開(kāi)發(fā)工具的向?qū)е?,即可自?dòng)生成對(duì)應(yīng)該設(shè)備的驅(qū)動(dòng)程序。這些開(kāi)發(fā)工具包括Driver Studio、Windriver等。

另外,針對(duì)基于PCI9054的PCI設(shè)備,PLX公司已經(jīng)為用戶提供了較為完備的API函數(shù)包。用戶只需要根據(jù)需要調(diào)用其中的API函數(shù),即可輕松實(shí)現(xiàn)對(duì)PCI9054采集設(shè)備的控制。下面介紹幾個(gè)常用的PLX API函數(shù)。

13.5.2  PLX API函數(shù)

PLX公司為其提供的動(dòng)態(tài)鏈接庫(kù)中包含了豐富的API函數(shù),可以用于PCI9054卡的控制與傳輸。在這些API函數(shù)中,有如下的幾個(gè)是常常用到的(注:在2007年5月提供的PLX SDK Version 5.0中,API函數(shù)名有所更新,下面仍然按照V5版之前的函數(shù)名進(jìn)行介紹)。

1.PlxPciDeviceOpen函數(shù)

用于設(shè)備啟動(dòng),在對(duì)設(shè)備進(jìn)行任何操作之前都應(yīng)該先打開(kāi)設(shè)備,其函數(shù)原型為:

RETURN_CODE PlxPciDeviceOpen(

DEVICE_LOCATION *pDevice,        //指向包含設(shè)備信息的數(shù)據(jù)結(jié)構(gòu)的指針

HANDLE *pHandle                    //指向用于存放已打開(kāi)設(shè)備的句柄的指針

);

DEVICE_LOCATION數(shù)據(jù)結(jié)構(gòu)的定義如下:

typedef struct _DEVICE_LOCATION{

U8 BusNumber;           //PCI設(shè)備所在的總線號(hào)

U8 SlotNumber;          //PCI設(shè)備所在的插槽號(hào)

U16 DeviceId;           //PCI設(shè)備的設(shè)備號(hào)

U16 VendorId;           //PCI設(shè)備的廠商號(hào)

U8 SerialNumber[12];  //PCI設(shè)備的惟一標(biāo)識(shí)碼

} DEVICE_LOCATION; 

對(duì)于PCI9054來(lái)說(shuō),DeviceId為10b5,VendorId為5406(不同的版本可能為9054)。SerialBumber的格式為“<device name> - <index number>”。如:有PLX9054的PCI卡,如果它的序列號(hào)為“Pci9054-1”,表示這是第二個(gè)PLX9054設(shè)備,第一個(gè)為“Pci9054-0”。

2.PlxPciDeviceClose函數(shù)

用于關(guān)閉已打開(kāi)的PCI設(shè)備,其函數(shù)原型為:

RETURN_CODE PlxPciDeviceClose (HANDLE hDevice); //已打開(kāi)的PCI設(shè)備的句柄

3.PlxPciBoardReset函數(shù)

用于復(fù)位已經(jīng)打開(kāi)的PCI設(shè)備,其函數(shù)原型為:

VOID PlxPciBoardReset (HANDLE hDevice);      //已打開(kāi)的PCI設(shè)備的句柄

4.PlxBusIopRead函數(shù)

用于從本地總線讀取數(shù)據(jù)(常指Direct Slave讀模式),其函數(shù)原型為:

RETURN_CODE PlxBusIopRead (

HANDLE hDevice,         //已打開(kāi)的PCI設(shè)備的句柄

IOP_SPACE IopSpace,    //PCI總線至本地總線,映射空間0/1

U32 address,            //若bRemap = FALSE,代表IOPSpace相對(duì)地址,否則是絕對(duì)地址

BOOLEAN bRemap,        //絕對(duì)地址與相對(duì)地址布爾值

VOID *pBuffer,         //指向用戶用于存放讀取數(shù)據(jù)的緩沖區(qū)

U32 ByteCount,        

ACCESS_TYPE AccessType);//讀數(shù)據(jù)方式,支持本地總線使用8位、16位或32位進(jìn)行傳輸

 

5.PlxBusIopWrite函數(shù)

用于從本地總線寫(xiě)數(shù)據(jù)(常指Direct Slave寫(xiě)模式),其函數(shù)原型為:

RETURN_CODE PlxBusIopWrite (

HANDLE hDevice,         //已打開(kāi)的PCI 設(shè)備的句柄

IOP_SPACE IopSpace,    //PCI總線至本地總線,映射空間0/1

U32 address,            //若bRemap = FALSE,代表IOPSpace相對(duì)地址,否則是絕對(duì)地址

BOOLEAN bRemap,        //絕對(duì)地址與相對(duì)地址布爾值

VOID *pBuffer,         //指向用戶用于存放讀取數(shù)據(jù)的緩沖區(qū)

U32 ByteCount,         //讀取的數(shù)據(jù)量大小

ACCESS_TYPE AccessType);//讀數(shù)據(jù)方式,支持本地總線使用8位、16位或32位進(jìn)行傳輸

6.PlxIntrAttach函數(shù)

用于鏈接中斷,當(dāng)有效中斷產(chǎn)生時(shí),將事件傳遞給指針句柄,其函數(shù)原型為:

RETURN_CODE PlxIntrAttach (

HANDLE hDevice,            //已打開(kāi)的PCI 設(shè)備的句柄

PLX_INTR intrTypes,      //含有需要指定的中斷信息的數(shù)據(jù)結(jié)構(gòu)(PLX_INTR)

HANDLE *pEventHdl);     //指向接收中斷事件的指針句柄

7.PlxIntrDisable函數(shù)

用于禁止某類中斷,其函數(shù)原型為:

RETURN_CODE PlxIntrDisable (

HANDLE hDevice,          //已打開(kāi)的PCI設(shè)備的句柄

PLX_INTR *pPlxIntr); //含有需要指定的中斷信息的數(shù)據(jù)結(jié)構(gòu)(PLX_INTR)

8.PlxIntrEnable函數(shù)

用于使能某類中斷,其函數(shù)原型為:

RETURN_CODE PlxIntrEnable (

HANDLE hDevice,           //已打開(kāi)的PCI設(shè)備的句柄

PLX_INTR *pPlxIntr);  //含有需要指定的中斷信息的數(shù)據(jù)結(jié)構(gòu)(PLX_INTR)

9.PlxIntrStatusGet函數(shù)

用于返回當(dāng)前終端狀態(tài),其函數(shù)原型為:

RETURN_CODE PlxIntrStatusGet (

HANDLE hDevice,           //已打開(kāi)的PCI設(shè)備的句柄

PLX_INTR *pPlxIntr); //含有需要指定的中斷信息的數(shù)據(jù)結(jié)構(gòu)(PLX_INTR)

10.PlxIntrWait函數(shù)

用于等待中斷,并可設(shè)定等待時(shí)間長(zhǎng)度,其函數(shù)原型為:

RETURN_CODE PlxIntrWait (

HANDLE hDevice,          //已打開(kāi)的PCI設(shè)備的句柄

HANDLE hEvent,           //被等待的事件句柄

U32 Timeout_ms           //為等待的時(shí)間長(zhǎng)度,單位為ms

);

由于此函數(shù)只能用在Linux系統(tǒng)中,因此在Windows系統(tǒng)中使用PLX API函數(shù)包等待中斷時(shí),使用另外兩個(gè)Windows API函數(shù)進(jìn)行中斷等待,即WaitSingleObject()函數(shù)和WaitMultipleObject()函數(shù)。

11.PlxDmaSglChannelOpen函數(shù)

用于開(kāi)啟Scatter/Gather模式DMA通道,其函數(shù)原型為:

RETURN_CODE PlxDmaSglChannelOpen (

HANDLE hDevice,             //已打開(kāi)的PCI設(shè)備的句柄

DMA_CHANNEL channel,       //為被開(kāi)啟的DMA通道

DMA_CHANNEL_DESC *pDesc); //包含DMA通道的參數(shù)描述結(jié)構(gòu)體(DMA_CHANNEL_DESC)指針

12.PlxDmaSglChannelClose函數(shù)

用于關(guān)閉已經(jīng)打開(kāi)的Scatter/Gather模式DMA通道,其函數(shù)原型為:

RETURN_CODE PlxDmaSglChanneClose (

HANDLE hDevice,             //已打開(kāi)的PCI設(shè)備的句柄

DMA_CHANNEL channel);     //將要關(guān)閉的已被開(kāi)啟的DMA通道

13.PlxDmaSglTransfer函數(shù)

用于開(kāi)始進(jìn)行Scatter/Gather模式的DMA傳輸,其函數(shù)原型為:

RETURN_CODE PlxDmaSglTransfer (

HANDLE hDevice,                   //已打開(kāi)的PCI設(shè)備的句柄

DMA_CHANNEL channel,             //進(jìn)行Scatter/Gather模式DMA傳輸?shù)耐ǖ?/p>

DMA_TRANSFER_ELEMENT *dmaData, //指向用于DMA數(shù)據(jù)緩沖區(qū)結(jié)構(gòu)(DMA_TRANSFER_ 

//ELEMENT)指針

BOOLEAN returnImmediate);        //取值為FALSE表示程序等待DMA傳輸結(jié)束后再執(zhí)行下一

//條指令

                                     //,反之,則不等待結(jié)束就執(zhí)行下一條指令

 

13.5.3  API函數(shù)調(diào)用

有了這些豐富的API函數(shù)資源,用戶即可根據(jù)自己的需要為信號(hào)采集設(shè)備設(shè)計(jì)功能多樣的應(yīng)用程序。在進(jìn)行應(yīng)用程序的設(shè)計(jì)時(shí),只需要將API函數(shù)庫(kù)包含在用戶的程序中即可。

PLX公司提供的PLX SDK開(kāi)發(fā)包中包含了完整的API函數(shù)庫(kù)文件。將這些API庫(kù)文件復(fù)制到用戶的應(yīng)用程序目錄下,并在程序中include進(jìn)去,即可調(diào)用這些API函數(shù)。更多的函數(shù)及用法詳見(jiàn)PLX SDK的編程者開(kāi)發(fā)手冊(cè)。

13.5.4  PCI9054驅(qū)動(dòng)程序安裝

INF文件是安裝設(shè)備驅(qū)動(dòng)程序時(shí)必須使用的文件,其擴(kuò)展名為.inf。驅(qū)動(dòng)程序安裝后將它保存在windows/inf目錄中,是Winodws操作系統(tǒng)下用來(lái)描述設(shè)備或文件等數(shù)據(jù)信息的文件。

INF文件全稱Information File文件。在操作系統(tǒng)發(fā)現(xiàn)新硬件之后向系統(tǒng)指明應(yīng)該安裝的驅(qū)動(dòng)程序,系統(tǒng)為設(shè)備提供的服務(wù)以及注冊(cè)表項(xiàng)要修改的內(nèi)容。它為該設(shè)備提供一個(gè)全面描述硬件參數(shù)和相應(yīng)驅(qū)動(dòng)文件(動(dòng)態(tài)鏈接庫(kù)等文件)的信息。

驅(qū)動(dòng)程序安裝的最終結(jié)果包括對(duì)系統(tǒng)的兩個(gè)永久更改。

·  描述驅(qū)動(dòng)程序的系統(tǒng)注冊(cè)表項(xiàng)、它的卸載順序以及任何正確的配置資料。

·  將驅(qū)動(dòng)程序文件復(fù)制到一個(gè)指定的系統(tǒng)目錄中。

INF文件是由標(biāo)準(zhǔn)的ASCII碼組成,可以用任何一款文字編輯器查看修改其中的內(nèi)容。它是分節(jié)的,每節(jié)以“[ ]”擴(kuò)起來(lái),每一個(gè)節(jié)名最長(zhǎng)為255個(gè)字符(Windows 2000/XP/2003操作系統(tǒng)中)或28個(gè)字符(Windows 98操作系統(tǒng)中)。

節(jié)與節(jié)之間的內(nèi)容叫條目,每一個(gè)節(jié)是由許多的條目組成的。每一個(gè)條目都由“=”分開(kāi),如“a=b”。如果每一個(gè)條目的等號(hào)后有多個(gè)值,則每一個(gè)值之間用逗號(hào)分隔開(kāi)。INF對(duì)大小寫(xiě)不敏感,行注釋語(yǔ)句命令是“;”,類似Visual Basic里的“’”。如果一行寫(xiě)不下,使用“”來(lái)?yè)Q行。更多關(guān)于INF文件的規(guī)則和說(shuō)明可以查看Windows DDK的說(shuō)明,這里不再詳述。

通過(guò)INF文件,用戶可以允許系統(tǒng)自動(dòng)安裝信號(hào)采集設(shè)備的驅(qū)動(dòng)程序,或者在對(duì)話支持下按照系統(tǒng)安裝向?qū)б徊揭徊酵瓿沈?qū)動(dòng)程序安裝過(guò)程。

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

華清遠(yuǎn)見(jiàn)(www.farsight.com.cn)是國(guó)內(nèi)領(lǐng)先嵌入師培訓(xùn)機(jī)構(gòu),2004年注冊(cè)于中國(guó)北京海淀高科技園區(qū),除北京總部外,上海、深圳、成都、南京、武漢、西安、廣州均有直營(yíng)分公司。華清遠(yuǎn)見(jiàn)除提供嵌入式相關(guān)的長(zhǎng)期就業(yè)培訓(xùn)、短期高端培訓(xùn)、師資培訓(xùn)及企業(yè)員工內(nèi)訓(xùn)等業(yè)務(wù)外,其下屬研發(fā)中心還負(fù)責(zé)嵌入式、Android及物聯(lián)網(wǎng)方向的教學(xué)實(shí)驗(yàn)平臺(tái)的研發(fā)及培訓(xùn)教材的出版,截止目前為止已公開(kāi)出版70余本嵌入式/移動(dòng)開(kāi)發(fā)/物聯(lián)網(wǎng)相關(guān)圖書(shū)。企業(yè)理念:專業(yè)始于專注 卓識(shí)源于遠(yuǎn)見(jiàn)。企業(yè)價(jià)值觀:做良心教育、做專業(yè)教育,更要做受人尊敬的職業(yè)教育。