0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

采用PCI9054芯片開發(fā)數(shù)字衛(wèi)星解調(diào)卡的WDM驅(qū)動程序

電子設(shè)計 ? 來源:郭婷 ? 作者:電子設(shè)計 ? 2019-05-27 08:01 ? 次閱讀

引言

PCI是由Intel公司1991年推出的一種局部總線。從結(jié)構(gòu)上看,PCI是在CPU和原來的系統(tǒng)總線之間插入的一級總線,具體由一個橋接電路實現(xiàn)對這一層的管理,并實現(xiàn)上下之間的接口以協(xié)調(diào)數(shù)據(jù)的傳送。管理器提供了信號緩沖,使之能支持10種外設(shè),并能在高時鐘頻率下保持高性能,它為顯卡,聲卡,網(wǎng)卡,MODEM等設(shè)備提供了連接接口,它的工作頻率為33MHz/66MHz。 32 位PCI 的數(shù)據(jù)傳輸率為133MB/s,擴(kuò)展后的數(shù)據(jù)傳輸峰值速率高達(dá)264 MB/s。

數(shù)字衛(wèi)星解調(diào)卡主要用于接收衛(wèi)星發(fā)來的調(diào)制信號的數(shù)字解調(diào)。設(shè)計中的橋接芯片可采用PLX公司的PCI9054。本文主要介紹數(shù)字衛(wèi)星解調(diào)卡的WDM驅(qū)動程序開發(fā)方法。

1 PCI9054接口芯片

PCI9054是PLX公司推出的PCI接口芯片。 PLX9054作為一種接口芯片,在pci總線和local總線之間傳遞信息。PCI卡就是利用plx9054的這一特性,通過接口控制電路 ,為外圍設(shè)備和pc機(jī)間 搭建一座硬件橋,完成數(shù)據(jù)的順利傳輸。 選擇 Plx9054 本地總線可以工作在M,C,J三種模式。 9054支持主模式,從模式,dma傳輸模式,可以用于試配卡和嵌入式系統(tǒng) 。Plx9054 有一個強(qiáng)大的雙通道分散/收集dma控制器,支持pci主機(jī)和適配器內(nèi)存的高效突發(fā)傳輸。兩個獨立的dma通道能從局部總線到pci總線和從pci總線到局部總線傳輸數(shù)據(jù)。每個通道包括一個dma控制器和一個專用雙向FIFO。兩個通道都支持塊傳輸,分散/收集傳輸,應(yīng)用或者不用EOT傳輸?shù)?。模式選擇在plx9054 成為一個pci總線主設(shè)備之前由主設(shè)備使能位(pcicr)使能。另外,兩個dma通道都能編程實現(xiàn)8,16,32bit局部總線帶寬,使能/使無效內(nèi)部等待周期,使能/使無效局部總線突發(fā)傳輸;執(zhí)行pci存儲器寫并無效操作;設(shè)置pci中斷(inta)或看是否本地中斷(i.int)等 對于數(shù)據(jù)傳輸模式的選擇,主要是根據(jù)硬件制作者對硬件設(shè)計的需求而定的。 PCI9054的內(nèi)部結(jié)構(gòu)如圖1所示。

采用PCI9054芯片開發(fā)數(shù)字衛(wèi)星解調(diào)卡的WDM驅(qū)動程序

Block DMA要求PCI主機(jī)或Local主機(jī)能提供PCI和Local的起始地址、傳輸字節(jié)數(shù)和傳輸方向。主機(jī)首先設(shè)定DMA開始位并啟動數(shù)據(jù)傳輸,一旦傳輸完成,PCI9054設(shè)定將DMACSR0[4]=1或者DMACSR1 [4]=1(分別對應(yīng)通道0和通道1)來結(jié)束DMA。如果中斷Enable位DMAMODE0[10]或者DMAMODE1[10]使能,那么,在傳輸結(jié)束時,PCI9054將向主機(jī)申請中斷。在DMA傳輸中,PCI9054既是PCI總線的主控設(shè)備,又是Local總線的主控設(shè)備。另外,通過編程DMA傳輸模式還可以完成以下設(shè)置或功能:

(1)將本地總線寬度設(shè)為8位、16位或32位;

(2)設(shè)置本地總線為允許/禁止內(nèi)部等待狀態(tài),若允許,則可等待0~15個本地等待狀態(tài);

(3)設(shè)置本地總線為突發(fā)傳輸4個雙字長度;

(4)使本地地址采用固定模式或線性增長模式;

(5)完成PCI內(nèi)存寫和無效操作(commandcode=Fh)或者普通PCI內(nèi)存寫操作(commandcode=7h);

(6)使用/禁用BLAST#以暫停本地傳輸;

(7)在Scatter/Gather DMA傳輸模式中,當(dāng)DMA傳輸完成或終止計數(shù)器計數(shù)到0時,插入PCI中斷(INTA)或者本地中斷(LINT);

(8)工作于DMA清除計數(shù)模式。

2 WDM驅(qū)動程序開發(fā)工具

PCI總線的傳統(tǒng)開發(fā)工具是微軟公司提供的DDK(Device Driver Kit),包括Windows98 DDK,Windows2000 DDK和Windows XP DDK。但是,使用其開發(fā)驅(qū)動程序比較復(fù)雜且開發(fā)周期長,它只適合發(fā)行類產(chǎn)品的驅(qū)動開發(fā)。

WDM模型是Windows2k/xp中分層化的驅(qū)動程序模型,圖中左邊是一個設(shè)備對象堆棧。操作系統(tǒng)的PnP管理器按照要求構(gòu)造設(shè)備對象堆棧,當(dāng)總線驅(qū)動程序檢查到新硬件存在,PnP管理器就創(chuàng)建一個PDO (physical device object,物理設(shè)備對象),然后PnP管理器參照注冊表中的信息查找與這個PDO相關(guān)的FiDO(filter device object,過濾器設(shè)備對象)和FDO(functional device object功能設(shè)備對象),并按其次序加載直到完成整個堆棧。在這個模型中,驅(qū)動程序的層或堆棧一起工作處理I/O請求。每個影響到設(shè)備的操作都使用IRP(I/O請求包),通常IRP先被送到設(shè)備堆棧的最上層驅(qū)動程序,然后經(jīng)過逐漸過濾到下面的驅(qū)動程序。每一層驅(qū)動程序都可以決定如何處理或僅僅是向下層傳遞該IRP,這取決于設(shè)備以及IRP所攜帶的內(nèi)容。直至該IRP被完成或取消。

3 DMA模式WDM驅(qū)動程序開發(fā)

本文介紹的數(shù)字衛(wèi)星解調(diào)卡的硬件框圖如圖2所示。圖中,當(dāng)FPGA中的數(shù)據(jù)放進(jìn)FIFO后,要經(jīng)過PCI9054橋接芯片傳輸?shù)絇C機(jī)內(nèi)存中,但由于應(yīng)用程序不能直接操作硬件,所以在應(yīng)用程序和硬件之間必須安裝硬件驅(qū)動程序來完成應(yīng)用程序?qū)τ布脑L問??梢?,驅(qū)動程序?qū)τ谡麄€設(shè)計至關(guān)重要,它關(guān)系到數(shù)據(jù)能否準(zhǔn)確無誤的送到指定的目的地。

采用PCI9054芯片開發(fā)數(shù)字衛(wèi)星解調(diào)卡的WDM驅(qū)動程序

驅(qū)動程序完成的主要功能如下:

(1)接收應(yīng)用傳送的符號率,配置符號率;

(2)接收應(yīng)用程序傳送的控制字,配置AD9851用作外部FIFO數(shù)據(jù)傳輸?shù)臅r鐘;

(3)設(shè)置數(shù)據(jù)傳輸為DMA方式,直到接收到應(yīng)用程序發(fā)來的停止數(shù)據(jù)采集命令為止。驅(qū)動要保證數(shù)據(jù)傳輸順利進(jìn)行。

本設(shè)計使用Driver Works來開發(fā)WDM驅(qū)動程序。

3.1 基于Driver Works的WDM驅(qū)動程序框架

這里所要生成的是PCI設(shè)備的驅(qū)動程序。采用DMA方式傳輸時,生成WDM驅(qū)動程序框架的主要步驟如下:

(1)從VC++中啟動Driver Works,設(shè)置驅(qū)動程序名稱及存放的路徑,設(shè)計時可取驅(qū)動名稱為BPSKDRIVER;

(2)選擇工程類型為WDM DRIVER;

(3)選擇驅(qū)動類型為WDM Function Driver;

(4)選擇硬件總線類型為PCI,在這里要注意,PCI Vendor ID和PCI Device ID應(yīng)根據(jù)硬件信息填寫;

(5)添加存儲器空間和I/O空間所需的類對象,添加DMA資源,使用設(shè)備接口打開設(shè)備;

(6)用控制代碼完成應(yīng)用程序和驅(qū)動的交互,即在應(yīng)用程序中使用Device IO Control來完成應(yīng)用程序向驅(qū)動傳輸數(shù)據(jù)。

3.2 DMA傳輸控制

(1)DMA傳輸類的概念及初始化

按照上述步驟生成WDM驅(qū)動的框架后,其大部分例程函數(shù)(如Driver Entry、Add Device、Device Control、On Start Device)等已經(jīng)由軟件自動生成并能基本滿足設(shè)計要求,下面重點介紹DMA傳輸控制函數(shù)。

設(shè)計中,對DMA寄存器的訪問可采用I/O方式,并可利用Driver Works提供的KIoRange類產(chǎn)生該類的一個實例,然后在設(shè)備啟動例程中初始化該實例,即可實現(xiàn)對硬件的兩個I/O地址空間的映射,其中一個I/O地址空間用于訪問橋接芯片PCI9054的寄存器,另一個I/O地址空間用于訪問本地端的設(shè)備,其初始化方法如下:

采用PCI9054芯片開發(fā)數(shù)字衛(wèi)星解調(diào)卡的WDM驅(qū)動程序

其中,pResListTranslated、pResListRaw分別是IRQ中系統(tǒng)分配的翻譯資源列表和原始資源列表。初始化完成后,就可以使用類的成員函數(shù)in,out對端口進(jìn)行操作。例如:m_IoPortRange0.outd(0x30,0x40100),就可向IO端口0的偏移量為0x30的地址中寫入0x40100。

進(jìn)行DMA傳輸需要用到三個DMA傳輸類,分別為KdmaAdapter、KCommonDmaBuffer和KdmaTransfer。

KdmaAdapter是DMA適配器對象,可用于表示需要進(jìn)行DMA傳輸?shù)脑O(shè)備資源。此對象對于Master設(shè)備和Slave設(shè)備都是適用的。驅(qū)動中,此類函數(shù)可在On Start Device中由成員函數(shù)Initialize初始化。

KconnonDmaBuffer是DMA通用緩沖區(qū)對象。驅(qū)動中,此類可在On Start Device中由成員函數(shù)Initialize初始化。通用緩沖區(qū)是外部設(shè)備和驅(qū)動程序之間的一段物理上連續(xù)的虛擬內(nèi)存,這個內(nèi)存是從系統(tǒng)中分配出來的,是非常珍貴的資源,任何時候都可以被他的設(shè)備和驅(qū)動程序存取。通用緩沖區(qū)包括緩沖區(qū)空間大小、虛擬地址、邏輯地址等信息。由于通用緩沖區(qū)是非常珍貴的資源,所以它的大小也受到限制。為此,驅(qū)動時應(yīng)對每個DMA請求進(jìn)行分段,并為每個段提供一個傳輸段描述符數(shù)組。而且,當(dāng)設(shè)備不支持分散/集中時,這個數(shù)組中的描述符只能有一個。每個描述符包含一個物理地址和相應(yīng)的字節(jié)數(shù),其結(jié)構(gòu)如下:

采用PCI9054芯片開發(fā)數(shù)字衛(wèi)星解調(diào)卡的WDM驅(qū)動程序

其中的物理地址即邏輯地址,字節(jié)數(shù)則是相應(yīng)的邏輯地址范圍的長度。

KdmaTransfer為DMA傳輸對象,用來管理內(nèi)存和設(shè)備之間的數(shù)據(jù)傳輸,但此時的DMA適配器必須可用。適配器對象可用來通知傳輸數(shù)據(jù)的類型和使用的DMA通道等。驅(qū)動中,此類可在OnStart Device中由成員函數(shù)Initialize初始化。在DMA傳輸中,數(shù)據(jù)可直接傳輸?shù)较到y(tǒng)物理內(nèi)存中。管理這些內(nèi)存的方式有Common Buffer和Packet兩種。第一種方式是在物理內(nèi)存中預(yù)先開辟一段連續(xù)的內(nèi)存空間,CPU和PCI都可以對其進(jìn)行訪問,且在一次DMA傳輸過程中,物理地址保持不變,該方式適合傳輸大量數(shù)據(jù)和連續(xù)的DMA傳輸;而在Packet方式中,由于其內(nèi)存物理地址不確定,因此適合間斷性的DMA傳輸。

(2)回調(diào)函數(shù)

由于DMA傳輸采用分段傳輸,所以,每當(dāng)準(zhǔn)備傳輸一個新段時,KDmaTransfer的對象將通知驅(qū)動程序調(diào)用回調(diào)例程?;卣{(diào)函數(shù)的原型由typedef DMAREADY_CALLBACK指定,使用宏DEVMEMBER_DMAREADY可聲明回調(diào)函數(shù)基類的成員函數(shù)。通過判斷成員函數(shù)Bytes Remaining可判斷傳輸是否完成。若返回值為0,則調(diào)用成員函數(shù)Terminate以完成相應(yīng)的IRP,否則,回調(diào)函數(shù)繼續(xù)傳輸。

(3)中斷服務(wù)

本驅(qū)動需要處理兩種中斷,第一種是本地中斷,它是當(dāng)FIFO輸出半滿信號時由FPGA通過LINT#信號發(fā)給PCI9054的中斷信號;第二種中斷是DMA傳輸結(jié)束時由DMA中斷控制器產(chǎn)生的。這兩種中斷可以通過對DMA的中斷控制寄存器的特定位處理來區(qū)分。判斷是否是本地中斷時,可以通過判斷DMA中斷控制寄存器的第15位是否為1來確定,如果INTCSR[15]=1,則為本地中斷;判斷是否是DMA中斷則可通過判斷DMA中斷控制寄存器的第23位是否為1來確定,如果INTCSR[23]=1,則為DMA中斷。不同的中斷,其處理方式不同。

3.3 驅(qū)動程序的創(chuàng)建及安裝文件的修改

為了正確的創(chuàng)建WDM驅(qū)動程序,首先要建立WDM編程環(huán)境,并創(chuàng)建自己的庫文件。參考文件中提供了一種WDM編程環(huán)境的建立方法,但是,按照書中的方法經(jīng)常不能成功的建立編程環(huán)境,為此,筆者根據(jù)自己的經(jīng)驗介紹一種簡單易行的方法:

(1)首先安裝DDK;

(2)在開始菜單中選擇Compuware Driver Studio\Develop下的DDK Build Setting;

(3)在打開的對話框中的DDK Root Directory中設(shè)置DDK的根目錄(如E:\WINDDK\2600),然后點擊Launch Program,并打開Compuware DriverStudio的Driver Works文件夾中Source里的VdwLibs.dsw文件。

(4)選擇Build菜單中的Set Active Project Configuration,并在彈出的對話框中選擇合適的Project configurations。而對于現(xiàn)行的32位機(jī),它不需要像Win32 AMD64 Free等這樣的工程;

(5)選好一個工程后,點擊OK,然后點擊Build with BUILD.EXE即可生成所需的庫。然后再根據(jù)自己的需要重新選擇新的Project configurations,以進(jìn)行庫的創(chuàng)建。

筆者的這種方法在于使用DDK Build Setting的Launch Program打開VdwILibs.dsw,編譯沒有出現(xiàn)錯誤,書中的方法則是先打開VC++,然后打開VdwLibs.dsw,選擇Batch Build下的Rebuild All創(chuàng)建庫,但是筆者試了幾次均不成功。

庫文件生成之后,即可打開創(chuàng)建好的驅(qū)動程序,并在VC++的菜單中打開DDK Build Setting,再在DDK Root Directory中設(shè)置DDK的路徑為實際安裝的路徑,之后點擊Build圖標(biāo),就可以生成BPSKDRIVER.sys文件了。另外,驅(qū)動的類型可以自己設(shè)定,Windows系統(tǒng)定義了一系列的設(shè)備類名和GUID,找到驅(qū)動工程文件中后綴名為.inf的安裝文件,將其內(nèi)容修改成與硬件信息一致就可以了。然后將此文件拷貝到工程中的i386文件夾中。至此,一個完整的驅(qū)動就創(chuàng)建成功了。

4 結(jié)束語

本驅(qū)動現(xiàn)在已經(jīng)經(jīng)過測試,工作正常。并已經(jīng)應(yīng)用于數(shù)字衛(wèi)星解調(diào)卡中。WDM編程環(huán)境的創(chuàng)建具有自己的見解,并且可以實現(xiàn)一次創(chuàng)建即成功,希望對同類驅(qū)動程序的開發(fā)具有借鑒作用。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 芯片
    +關(guān)注

    關(guān)注

    450

    文章

    49636

    瀏覽量

    417229
  • 驅(qū)動
    +關(guān)注

    關(guān)注

    12

    文章

    1790

    瀏覽量

    84913
  • 總線
    +關(guān)注

    關(guān)注

    10

    文章

    2817

    瀏覽量

    87712
收藏 人收藏

    評論

    相關(guān)推薦

    PCI總線接口芯片9054及其應(yīng)用

    PCI總線接口芯片9054及其應(yīng)用【摘 要】PCI9054是PLX公司推出的一種PCI主模式橋芯片
    發(fā)表于 10-09 11:23

    WDM驅(qū)動中訪問pci9054本地空間0的問題

    各位大哥,小弟最近遇到一個頭疼的問題。我最近在弄windows下的WDM驅(qū)動,是一塊基于pci9054的數(shù)據(jù)采集驅(qū)動。問題一: 系統(tǒng)發(fā)出
    發(fā)表于 11-22 12:28

    PCI9054驅(qū)動

    哪位大神有用FPGA控制PCI9054驅(qū)動的相關(guān)資料,謝謝啦。
    發(fā)表于 05-22 15:25

    PCI9054驅(qū)動開發(fā)

    哪位大神有用FPGA控制PCI9054驅(qū)動的相關(guān)資料,謝謝啦
    發(fā)表于 05-24 16:14

    PCI總線接口芯片9054及其應(yīng)用

    PCI總線接口的開發(fā)提供了一種簡潔的方法,設(shè)計者只需設(shè)計出本地總線接口控制電路,即可實現(xiàn)與PCI總線的高速數(shù)據(jù)傳輸。圖3是應(yīng)用PCI9054作為接口
    發(fā)表于 12-05 10:12

    PCI9054 pdf datasheet

    PCI9054 p
    發(fā)表于 10-13 11:13 ?682次下載

    PCI串口通信WDM驅(qū)動程序設(shè)計與實現(xiàn)

    介紹了Window2000 操作系統(tǒng)的體系結(jié)構(gòu)和在Windows2000 下實現(xiàn)PCI 接口設(shè)備驅(qū)動程序架構(gòu)的方法。針對基于PCI 接口芯片PCI9
    發(fā)表于 09-01 08:50 ?37次下載

    PCI串口通信WDM驅(qū)動程序設(shè)計與實現(xiàn)

    介紹了Window2000 操作系統(tǒng)的體系結(jié)構(gòu)和在Windows2000 下實現(xiàn)PCI 接口設(shè)備驅(qū)動程序架構(gòu)的方法。針對基于PCI 接口芯片PCI9
    發(fā)表于 09-01 08:55 ?2次下載

    基于PCI9054的接口

       PCI9054是PLX公司生產(chǎn)的橋接PCI總線與本地總線的接口器件。在PCI9054的結(jié)構(gòu)性能、數(shù)據(jù)傳輸模式及總線工作方式等特性的基礎(chǔ)上,給出以PCI9054
    發(fā)表于 07-21 16:18 ?76次下載

    PCI總線接口芯片PCI9054及其應(yīng)用

    PCI總線接口芯片PCI9054及其應(yīng)用PCI9054是PLX公司推出的一種PCI主模式橋芯片。
    發(fā)表于 10-09 11:18 ?8048次閱讀
    <b class='flag-5'>PCI</b>總線接口<b class='flag-5'>芯片</b><b class='flag-5'>PCI9054</b>及其應(yīng)用

    PCI傳輸WDM驅(qū)動程序設(shè)計

    PCI傳輸WDM驅(qū)動程序設(shè)計 PCI總線規(guī)范是為提高微機(jī)總線的數(shù)據(jù)傳輸速度而制定的一種局部總線標(biāo)準(zhǔn)。在設(shè)計自行
    發(fā)表于 10-27 11:04 ?973次閱讀

    Linux環(huán)境下開發(fā)PCI9054芯片驅(qū)動

      O 引言   本文主要對的具體方法進(jìn)行描述,并給出了如何將驅(qū)動程序編譯進(jìn)內(nèi)核,以使驅(qū)動模塊靜態(tài)加載的方法。   1 PCI9054簡介   PCI總線協(xié)議一般需
    發(fā)表于 08-27 09:33 ?2151次閱讀
    Linux環(huán)境下<b class='flag-5'>開發(fā)</b><b class='flag-5'>PCI9054</b><b class='flag-5'>芯片</b><b class='flag-5'>驅(qū)動</b>

    基于PCI9054的數(shù)據(jù)轉(zhuǎn)換模塊設(shè)計

    為了實現(xiàn)把軟件仿真的數(shù)據(jù)通過PCI總線DMA傳輸、處理后轉(zhuǎn)換成高速視頻串行數(shù)據(jù)流(LVDS數(shù)據(jù)流),設(shè)計出了基于PCI9054的數(shù)據(jù)轉(zhuǎn)換模塊。通過介紹PCI總線接口協(xié)議芯片
    發(fā)表于 01-14 17:32 ?50次下載
    基于<b class='flag-5'>PCI9054</b>的數(shù)據(jù)轉(zhuǎn)換模塊設(shè)計

    PCI設(shè)備的WDM驅(qū)動程序開發(fā)

    本文簡要介紹了WDM驅(qū)動程序的結(jié)構(gòu)體系,之后結(jié)合PCI設(shè)備的結(jié)構(gòu)特點,通過實例說明如何利用驅(qū)動程序開發(fā)工具DriverWorks
    發(fā)表于 05-19 18:11 ?0次下載

    基于PCI9054PCI接口數(shù)據(jù)通信系統(tǒng)

    本文首先介紹了 PCI 總線 接口芯片 PCI9054 的性能,并從PCI9054 接口設(shè)計、寄存器配置等方面闡述了該芯片的應(yīng)用,著重介紹了
    發(fā)表于 06-02 18:20 ?105次下載
    基于<b class='flag-5'>PCI9054</b>的<b class='flag-5'>PCI</b>接口數(shù)據(jù)通信系統(tǒng)