国产久操视频-国产久草视频-国产久热精品-国产久热香蕉在线观看-青青青青娱乐-青青青青在线成人视99

  • 正文
    • 13.5  主機應用程序和驅動程序的接口設計
  • 相關推薦
申請入駐 產業(yè)圖譜

高速PCI信號采集卡設計與實現綜合實例之:主機應用程序和驅動程序的接口設計

2013/08/30
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

 

13.5  主機應用程序和驅動程序的接口設計

13.5.1  驅動程序例程的封裝

通過調用PCI設備驅動程序的例程,我們可以實現操作系統對PCI設備的控制。但是直接調用例程進行編程往往顯得不夠直接,也不具有足夠的針對性。因此在高級語言里面對PCI設備或者信號采集設備的控制,往往是調用已經封裝過的例程。

將例程進行封裝,形成一些可以調用的具有針對性的PCI信號采集設備API函數,是驅動開發(fā)者比較頭疼的問題。因為這個過程需要了解Windows WDM模型,熟悉Windows DDK的開發(fā)過程,而這些往往需要花費硬件開發(fā)者的大量時間。

幸運的是,有一些很好的集成開發(fā)環(huán)境幫助我們完成了這個工作。用戶只需要將具體設備的參數導入開發(fā)工具的向導中,即可自動生成對應該設備的驅動程序。這些開發(fā)工具包括Driver Studio、Windriver等。

另外,針對基于PCI9054的PCI設備,PLX公司已經為用戶提供了較為完備的API函數包。用戶只需要根據需要調用其中的API函數,即可輕松實現對PCI9054采集設備的控制。下面介紹幾個常用的PLX API函數。

13.5.2  PLX API函數

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

1.PlxPciDeviceOpen函數

用于設備啟動,在對設備進行任何操作之前都應該先打開設備,其函數原型為:

RETURN_CODE PlxPciDeviceOpen(

DEVICE_LOCATION *pDevice,        //指向包含設備信息的數據結構的指針

HANDLE *pHandle                    //指向用于存放已打開設備的句柄的指針

);

DEVICE_LOCATION數據結構的定義如下:

typedef struct _DEVICE_LOCATION{

U8 BusNumber;           //PCI設備所在的總線

U8 SlotNumber;          //PCI設備所在的插槽號

U16 DeviceId;           //PCI設備的設備號

U16 VendorId;           //PCI設備的廠商號

U8 SerialNumber[12];  //PCI設備的惟一標識碼

} DEVICE_LOCATION; 

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

2.PlxPciDeviceClose函數

用于關閉已打開的PCI設備,其函數原型為:

RETURN_CODE PlxPciDeviceClose (HANDLE hDevice); //已打開的PCI設備的句柄

3.PlxPciBoardReset函數

用于復位已經打開的PCI設備,其函數原型為:

VOID PlxPciBoardReset (HANDLE hDevice);      //已打開的PCI設備的句柄

4.PlxBusIopRead函數

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

RETURN_CODE PlxBusIopRead (

HANDLE hDevice,         //已打開的PCI設備的句柄

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

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

BOOLEAN bRemap,        //絕對地址與相對地址布爾值

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

U32 ByteCount,        

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

 

5.PlxBusIopWrite函數

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

RETURN_CODE PlxBusIopWrite (

HANDLE hDevice,         //已打開的PCI 設備的句柄

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

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

BOOLEAN bRemap,        //絕對地址與相對地址布爾值

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

U32 ByteCount,         //讀取的數據量大小

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

6.PlxIntrAttach函數

用于鏈接中斷,當有效中斷產生時,將事件傳遞給指針句柄,其函數原型為:

RETURN_CODE PlxIntrAttach (

HANDLE hDevice,            //已打開的PCI 設備的句柄

PLX_INTR intrTypes,      //含有需要指定的中斷信息的數據結構(PLX_INTR)

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

7.PlxIntrDisable函數

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

RETURN_CODE PlxIntrDisable (

HANDLE hDevice,          //已打開的PCI設備的句柄

PLX_INTR *pPlxIntr); //含有需要指定的中斷信息的數據結構(PLX_INTR)

8.PlxIntrEnable函數

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

RETURN_CODE PlxIntrEnable (

HANDLE hDevice,           //已打開的PCI設備的句柄

PLX_INTR *pPlxIntr);  //含有需要指定的中斷信息的數據結構(PLX_INTR)

9.PlxIntrStatusGet函數

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

RETURN_CODE PlxIntrStatusGet (

HANDLE hDevice,           //已打開的PCI設備的句柄

PLX_INTR *pPlxIntr); //含有需要指定的中斷信息的數據結構(PLX_INTR)

10.PlxIntrWait函數

用于等待中斷,并可設定等待時間長度,其函數原型為:

RETURN_CODE PlxIntrWait (

HANDLE hDevice,          //已打開的PCI設備的句柄

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

U32 Timeout_ms           //為等待的時間長度,單位為ms

);

由于此函數只能用在Linux系統中,因此在Windows系統中使用PLX API函數包等待中斷時,使用另外兩個Windows API函數進行中斷等待,即WaitSingleObject()函數和WaitMultipleObject()函數。

11.PlxDmaSglChannelOpen函數

用于開啟Scatter/Gather模式DMA通道,其函數原型為:

RETURN_CODE PlxDmaSglChannelOpen (

HANDLE hDevice,             //已打開的PCI設備的句柄

DMA_CHANNEL channel,       //為被開啟的DMA通道

DMA_CHANNEL_DESC *pDesc); //包含DMA通道的參數描述結構體(DMA_CHANNEL_DESC)指針

12.PlxDmaSglChannelClose函數

用于關閉已經打開的Scatter/Gather模式DMA通道,其函數原型為:

RETURN_CODE PlxDmaSglChanneClose (

HANDLE hDevice,             //已打開的PCI設備的句柄

DMA_CHANNEL channel);     //將要關閉的已被開啟的DMA通道

13.PlxDmaSglTransfer函數

用于開始進行Scatter/Gather模式的DMA傳輸,其函數原型為:

RETURN_CODE PlxDmaSglTransfer (

HANDLE hDevice,                   //已打開的PCI設備的句柄

DMA_CHANNEL channel,             //進行Scatter/Gather模式DMA傳輸的通道

DMA_TRANSFER_ELEMENT *dmaData, //指向用于DMA數據緩沖區(qū)結構(DMA_TRANSFER_ 

//ELEMENT)指針

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

//條指令

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

 

13.5.3  API函數調用

有了這些豐富的API函數資源,用戶即可根據自己的需要為信號采集設備設計功能多樣的應用程序。在進行應用程序的設計時,只需要將API函數庫包含在用戶的程序中即可。

PLX公司提供的PLX SDK開發(fā)包中包含了完整的API函數庫文件。將這些API庫文件復制到用戶的應用程序目錄下,并在程序中include進去,即可調用這些API函數。更多的函數及用法詳見PLX SDK的編程者開發(fā)手冊。

13.5.4  PCI9054驅動程序安裝

INF文件是安裝設備驅動程序時必須使用的文件,其擴展名為.inf。驅動程序安裝后將它保存在windows/inf目錄中,是Winodws操作系統下用來描述設備或文件等數據信息的文件。

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

驅動程序安裝的最終結果包括對系統的兩個永久更改。

·  描述驅動程序的系統注冊表項、它的卸載順序以及任何正確的配置資料。

·  將驅動程序文件復制到一個指定的系統目錄中。

INF文件是由標準的ASCII碼組成,可以用任何一款文字編輯器查看修改其中的內容。它是分節(jié)的,每節(jié)以“[ ]”擴起來,每一個節(jié)名最長為255個字符(Windows 2000/XP/2003操作系統中)或28個字符(Windows 98操作系統中)。

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

通過INF文件,用戶可以允許系統自動安裝信號采集設備的驅動程序,或者在對話支持下按照系統安裝向導一步一步完成驅動程序安裝過程。

相關推薦

登錄即可解鎖
  • 海量技術文章
  • 設計資源下載
  • 產業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

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

南和县| 鹿邑县| 大荔县| 井研县| 奈曼旗| 泰安市| 彰武县| 英吉沙县| 平顶山市| 通榆县| 闸北区| 和静县| 西乌珠穆沁旗| 巴东县| 那坡县| 宁津县| 山阴县| 神木县| 东平县| 巩义市| 河北省| 临夏市| 大方县| 前郭尔| 义马市| 灌南县| 闻喜县| 汉源县| 通化市| 蕲春县| 衡水市| 蕉岭县| 台东县| 垫江县| 图木舒克市| 彭阳县| 阿克陶县| 鹤壁市| 天柱县| 汶上县| 甘孜县|