《電子技術應用》
您所在的位置:首頁 > 模擬設計 > 設計應用 > 基于PCI總線的數字衛星解調卡驅動程序開發
基于PCI總線的數字衛星解調卡驅動程序開發
摘要:   數字衛星解調卡主要用于接收衛星發來的調制信號的數字解調。設計中的橋接芯片可采用PLX公司的PCI9054。本文主要介紹數字衛星解調卡的WDM驅動程序開發方法。
Abstract:
Key words :

引言

  PCI總線(即外圍部件互連總線)是Intel公司提出的計算機接口總線。它的時鐘頻率為33MHz,有32位數據總線,可支持突發傳輸模式,數據傳輸峰值速率高達132 MB/s。此外,PCI總線還可擴展為64位數據總線,擴展后的數據傳輸峰值速率高達264 MB/s,并支持即插即用功能而且獨立于處理器。由于PCI總線具有諸多優點,它已經成為PC機的標準總線。因此,PCI接口設備的驅動程序" title="驅動程序">驅動程序開發就顯得尤為重要。

  數字衛星" title="數字衛星">數字衛星解調卡主要用于接收衛星發來的調制信號的數字解調。設計中的橋接芯片可采用PLX公司的PCI9054。本文主要介紹數字衛星解調卡的WDM驅動程序開發方法。

  1 PCI9054接口芯片

  PCI9054是PLX公司推出的PCI接口芯片。它支持本地總線2.2版規范,工作頻率為0~33 MHz,可提供C、M、J三種本地工作模式,本地端到PCI總線的猝發傳輸速率高達132 MB/s。該芯片具有可編程的Serial EEPROM接口,可用于配置PCI9054的部分內部配置寄存器。其配置正確與否直接決定著設備能否正常工作。其中的DeviceID和Vendor ID分別對應設備號和銷售商號,計算機主要靠這兩個號碼識別硬件。該器件內部有6種可編程的FIFO,可以進行數據的發送與接收,而其兩種內部配置寄存器PCI Configuration Register和Local Configuration Register,可在本地端支持主模式、從模式租DMA傳輸方式。PCI9054的內部結構如圖1所示。
 


  PCI9054支持兩個獨立的DMA通道,以用于完成本地端到PCI總線或者PCI總線到本地端的數據傳輸。每一個DMA通道包含一個DMA控制器和一個雙向FIFO,兩種通道都分別支持Block傳輸模式和Scatter/Gather傳輸模式。DMA通道0還支持Demand DMA數據傳輸模式。

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

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

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

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

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

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

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

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

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

  2 WDM驅動程序開發工具

  PCI總線的傳統開發工具是微軟公司提供的DDK(Device Driver Kit),包括Windows98 DDK,Windows2000 DDK和Windows XP DDK。但是,使用其開發驅動程序比較復雜且開發周期長,它只適合發行類產品的驅動開發。
  
  為了簡化驅動程序的開發,縮短開發周期,常用的方法是使用Numage公司提供的開發工具Driver Studio,這是一個開發工具包(包含VtoolsD,Driver Works和SoftICE等開發工具)。其中的Driver Works是Compuware公司開發的工具,它提供了一系列類。這些類包含了許多更為底層的操作并且為一般驅動操作提供了服務函數,從而為開發人員提供了一個訪問系統核心的標準界面。由于其驅動程序開發采用面向對象的框架結構,因而開發過程比較簡單易行。

  3 DMA模式WDM驅動程序開發

  本文介紹的數字衛星解調卡的硬件框圖如圖2所示。圖中,當FPGA中的數據放進FIFO后,要經過PCI9054橋接芯片傳輸到PC機內存中,但由于應用程序不能直接操作硬件,所以在應用程序和硬件之間必須安裝硬件驅動程序來完成應用程序對硬件的訪問??梢?,驅動程序對于整個設計至關重要,它關系到數據能否準確無誤的送到指定的目的地。
 



  驅動程序完成的主要功能如下:

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

  (2)接收應用程序傳送的控制字,配置AD9851用作外部FIFO數據傳輸的時鐘;

  (3)設置數據傳輸為DMA方式,直到接收到應用程序發來的停止數據采集命令為止。驅動要保證數據傳輸順利進行。

  本設計使用Driver Works來開發WDM驅動程序。

  3.1 基于Driver Works的WDM驅動程序框架

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

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

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

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

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

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

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

  3.2 DMA傳輸控制

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

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

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

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

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

  KdmaAdapter是DMA適配器對象,可用于表示需要進行DMA傳輸的設備資源。此對象對于Master設備和Slave設備都是適用的。驅動中,此類函數可在On Start Device中由成員函數Initialize初始化。

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

  其中的物理地址即邏輯地址,字節數則是相應的邏輯地址范圍的長度。

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

  (2)回調函數

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

  (3)中斷服務

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

  3.3 驅動程序的創建及安裝文件的修改

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

  (1)首先安裝DDK;

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

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

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

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

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

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

  4 結束語

  本驅動現在已經經過測試,工作正常。并已經應用于數字衛星解調卡中。WDM編程環境的創建具有筆者自己的見解,并且可以實現一次創建即成功,希望對同類驅動程序的開發具有借鑒作用。

 

此內容為AET網站原創,未經授權禁止轉載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
欧美影院一区| 亚洲一区bb| 亚洲一区二区三区在线看| 亚洲精品国产欧美| 亚洲国产欧美另类丝袜| 亚洲国产婷婷香蕉久久久久久| 黑人巨大精品欧美一区二区小视频 | 久久乐国产精品| 久久精品国产96久久久香蕉| 久久精品国产一区二区三| 久久国产黑丝| 久久亚洲影音av资源网| 噜噜噜躁狠狠躁狠狠精品视频| 麻豆av一区二区三区| 狂野欧美激情性xxxx欧美| 蜜乳av另类精品一区二区| 欧美成在线视频| 欧美人体xx| 国产精品v日韩精品v欧美精品网站| 欧美丝袜第一区| 国产精品日日做人人爱| 国产精品一区久久久| 国产区欧美区日韩区| 国外成人性视频| 亚洲国产日韩欧美一区二区三区| 亚洲人成免费| 一区二区三区波多野结衣在线观看| 亚洲资源在线观看| 欧美在线你懂的| 亚洲美女91| 亚洲一级黄色| 久久精品国产一区二区电影| 欧美aaaaaaaa牛牛影院| 欧美日韩精品在线| 国产精品中文字幕欧美| 狠狠综合久久| 日韩午夜剧场| 香蕉亚洲视频| 亚洲精品专区| 午夜精品国产| 免费成人黄色av| 欧美视频一区二| 国产亚洲人成a一在线v站| 亚洲激情视频在线观看| 亚洲午夜av在线| 久久精品一本久久99精品| 亚洲最黄网站| 久久狠狠亚洲综合| 欧美精品免费在线观看| 国产乱人伦精品一区二区 | 狠狠色丁香婷婷综合影院| 91久久久久| 亚洲在线视频观看| 亚洲精品1区2区| 亚洲欧美日韩国产中文 | 亚洲人成在线免费观看| 亚洲综合日韩| 亚洲美女视频在线观看| 西瓜成人精品人成网站| 欧美粗暴jizz性欧美20| 国产精品美女主播| 在线日韩成人| 午夜视频久久久| 一区二区三区免费在线观看| 久久成人这里只有精品| 欧美日韩的一区二区| 国产一区二区中文字幕免费看| 亚洲久久一区| 久久精品网址| 销魂美女一区二区三区视频在线| 欧美激情视频网站| 国产一区二区三区观看 | 亚洲日本成人女熟在线观看| 欧美亚洲日本国产| 欧美精品乱人伦久久久久久 | 91久久国产精品91久久性色| 欧美一区二区精品| 欧美日韩国产999| 影音先锋日韩有码| 性伦欧美刺激片在线观看| 一区二区欧美激情| 另类亚洲自拍| 国产日韩亚洲欧美精品| 一区二区冒白浆视频| 亚洲毛片视频| 美日韩精品免费| 国产亚洲欧美日韩日本| 亚洲一区二区av电影| 中文高清一区| 欧美激情第五页| 又紧又大又爽精品一区二区| 欧美影院成人| 久久国产免费| 国产农村妇女精品一区二区| 国产精品99久久久久久久vr| 一本色道久久88亚洲综合88| 欧美刺激性大交免费视频| 尤物在线观看一区| 久久精品国产69国产精品亚洲| 久久激情婷婷| 国产欧美一区二区精品性| 亚洲无限av看| 亚洲欧美日韩在线观看a三区| 欧美日韩在线一区二区| 日韩午夜三级在线| 一区二区三区久久精品| 欧美日韩高清在线一区| 亚洲精品乱码久久久久久久久| 91久久精品国产91久久性色tv | 亚洲欧洲免费视频| 久久一区精品| 黑人巨大精品欧美一区二区小视频| 欧美一区二区精美| 久久不射网站| 国产亚洲精品高潮| 欧美一区免费| 久久在线免费观看| 黄色亚洲免费| 91久久国产精品91久久性色| 欧美黑人国产人伦爽爽爽| 在线欧美小视频| 亚洲精品乱码久久久久| 欧美成人中文字幕| 91久久夜色精品国产网站| 日韩午夜电影av| 欧美日韩精品久久久| 亚洲毛片在线看| 亚洲视频高清| 国产精品免费一区二区三区在线观看 | 欧美专区第一页| 国产乱码精品一区二区三区不卡| 亚洲在线一区| 欧美中文字幕久久| 韩国三级电影一区二区| 最新精品在线| 欧美日韩国产成人在线免费| 一区二区电影免费观看| 亚洲欧美成人一区二区在线电影| 国产精品婷婷| 久久精品国产69国产精品亚洲| 欧美风情在线观看| 一本久久知道综合久久| 欧美一区二区精美| 黄色av成人| 99精品国产福利在线观看免费| 欧美日韩精品综合| 亚洲一级在线| 久久一日本道色综合久久| 最新69国产成人精品视频免费| 亚洲宅男天堂在线观看无病毒| 国产美女一区二区| 最新精品在线| 国产精品久久久久高潮| 欧美一区影院| 欧美久久九九| 亚洲欧美视频在线观看视频| 久久亚洲综合色| 9国产精品视频| 久久精品亚洲精品| 亚洲欧洲另类国产综合| 亚洲欧美日韩区| 在线观看国产精品淫| 亚洲一区高清| 激情国产一区| 亚洲一区在线观看视频| 国产手机视频一区二区| 99精品久久免费看蜜臀剧情介绍| 国产精品一区二区久久精品| 亚洲第一成人在线| 欧美视频在线观看| 久久精品一本久久99精品| 欧美体内she精视频| 欧美影院在线播放| 欧美网站在线观看| 亚洲国产精品一区二区尤物区| 欧美午夜精品理论片a级大开眼界| 欧美在线1区| 欧美性猛交xxxx乱大交蜜桃| 久久国产精品久久久久久电车 | 亚洲激情综合| 久久国产精品毛片| 欧美激情亚洲激情| 亚洲三级影片| 久久国产精品久久久久久电车 | 亚洲精品欧美极品| 久久www成人_看片免费不卡| 亚洲国产美女精品久久久久∴| 小黄鸭精品aⅴ导航网站入口| 亚洲国产精品免费| 久久国产精品久久国产精品| 日韩午夜在线视频| 久久综合国产精品台湾中文娱乐网| 亚洲色诱最新| 欧美日韩成人精品| 亚洲国产精品999| 国产香蕉97碰碰久久人人| 夜夜嗨av一区二区三区免费区| 激情一区二区| 欧美尤物巨大精品爽| 一区二区三区欧美视频|