《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > PCI/PCI-E高速實時DMA傳輸驅動設計
PCI/PCI-E高速實時DMA傳輸驅動設計
來源:電子技術應用2012年第11期
何 柳1, 陳 勇1, 吳 斌2, 楊 坤2
1. 重慶郵電大學, 重慶400065; 2. 中國科學院微電子研究所, 北京100029
摘要: 根據WDM驅動模型設計了驅動程序,介紹了WDM驅動的設計方法,對驅動開發中的常見問題進行了詳細闡述,著重講解了高速實時DMA傳輸系統中驅動和上層控制程序的設計方案。以VC++6.0和WDK作為開發平臺,完成了Windows NT系統下高速實時數據傳輸驅動的開發。
關鍵詞: PCIPCI-E DMA WDK 實時
中圖分類號: TP311
文獻標識碼: A
文章編號: 0258-7998(2012)11-0143-03
Design a high speed and real time PCI/PCI-E DMA transmission driver
He Liu1,Chen Yong1,Wu Bin2,Yang Kun2
1. Chongqing University of posts and telecommunications, Chongqing 400065, China; 2. Institute of Microelectronics of Chinese Academy of Science, Beijing 100029, China
Abstract: Designed a driver program according to the principle of WDM driver model. Firstly, introduced the way of designing WDM driver and expatiate the usual problems in driver design, then focused on the driver and its upper control program design of a high speed and real time DMA transmission system. Finally realized the development of high speed and real time transmission driver using VC++6.0 and WDK tools.
Key words : PCI/PCI-E; DMA; WDK; real time

    隨著在線高清電影以及實時視頻會議等應用的快速發展,數據傳輸呈現速率高、實時性強,數據量大的趨勢,由此產生了高速實時數據傳輸的問題。在眾多高速實時數據傳輸的設計方案中,PCI/PCI-E總線不可比擬的傳輸速率優勢成為設計高速傳輸設備時的首選總線[1-2]。

    為了能夠正常使用PCI/PCI-E總線進行高速數據傳輸,必須開發相應平臺下的設備驅動程序。本文以自主研發的BCS5731芯片為例,介紹了在Windows NT環境下基于WDM模型的PCI/PCI-E總線設備驅動開發方案,著重分析了高速實時傳輸系統中驅動部分的設計與實現。
1 WDM驅動程序設計
1.1    WDM驅動模型介紹[3]

    WDM模型是微軟針對Windows 2000及后續操作系統制定的驅動開發模型,具有即插即用和電源管理等方便用戶使用的特性。目前微軟正力推新一代的WDF驅動開發模型,但從本質上來說WDF是對WDM進行封裝后的模型;而且WDM模型的驅動開發實例眾多,極大地方便了驅動的開發,所以本文采用了WDM驅動開發模型。
    WDM驅動基于分層的模式實現。完成一個設備的操作至少需要兩個驅動設備共同完成[4]。其中與系統連接最緊密的是底層總線驅動,而總線驅動也是最為復雜的部分。目前總線驅動通常由操作系統提供,驅動開發者只需要開發設備驅動以及可能需要的過濾驅動。圖1所示為WDM驅動模型層次結構圖。

1.2 驅動實例設計
    對于WDM驅動而言,主要的函數是DriverEntry例程、AddDevice例程、PnP例程以及各個IRP的派遣例程。對應于應用程序的main入口函數,Windows驅動程序相應的入口函數為DriverEntry[5]。
    DriverEntry例程由內核中的I/O管理器負責調用,是驅動第一個執行的例程。在本設計中,根據需要在DriverEntry例子中注冊了以下例程:
    pDriverObject->DriverExtension->AddDevice = AddDeviceRoutine
    pDriverObject->MajorFunction[IRP_MJ_PNP] = PnpRoutine
    pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ControlRoutine
    pDriverObject->MajorFunction[IRP_MJ_WRITE] = WriteRoutine
    pDriverObject->MajorFunction[IRP_MJ_READ] = ReadRoutine
    pDriverObject->MajorFunction[IRP_MJ_CLOSE] = faultRoutine
    pDriverObject->MajorFunction[IRP_MJ_CREATE] = DefaultRoutine
    下面對上述例程進行分析。
    (1) AddDeviceRoutine函數
    AddDerice Routine函數只出現在WDM驅動程序中,在NT式驅動中沒有此回調函數。此函數用于創建設備對象,并由PnP管理器調用。具體操作包括:創建設備對象,創建并注冊設備接口(為兼容也可創建符號連接),將創建的設備掛載到設備堆棧中,最后設置相關標志。值得注意的是,標志位中的讀寫方式在創建后不能在程序其他方面進行修改,且不同的讀寫標志位在編寫讀寫部分代碼時具有著不同的實現方式。
    (2) PnPRoutine函數
    PnPRoutine函數執行即插即用功能,一個功能完整的PnP函數需要處理眾多的子IRP, 如IRP_MN_START_
DEVICE、 IRP_MN_STOP_DEVICE、IRP_MN_REMOVE_DE-
VICE等20多個子類IRP。在實際的接口驅動開發中,大部分PnPRoutine的子類IRP不需進行逐一編寫,驅動開發者只需處理必要的子IRP,其余的子類IRP可以統一傳遞給總線驅動處理即可。通常IRP_MN_START_DEVICE和IRP_MN_REMOVE_DEVICE和兩個子類IRP是WDM驅動必需單獨處理的IRP。
    (3) ControlRoutine函數
    ControlRoutine函數常用于應用程序與驅動程序之間的通信。程序設計者首先定義一種I/O控制碼,然后用函數DeviceIoControl將控制碼和請求一起傳遞給驅動程序。驅動程序則在ControlRoutine中實現這些控制碼。
    控制碼的實現往往采用Switch(){case:}的形式。在本設計中,采用ControlRoutine進行DMA分配和寄存器配置。因此需要定義數種不同的控制碼。
    (4) ReadRoutine和WriteRoutine函數
    兩個函數分別用于target讀寫操作,當應用層調用ReadFile和WriteFile時,I/O管理器生成相應的IRP并發送到對應的函數中。驅動程序創建的設備通常有三種讀寫方式:緩沖區方式、直接方式和其他方式。ReadRoutine和WriteRoutine中使用的讀寫方式是由AddDeviceRoutine中設置的標志位決定。因此在驅動創建設備對象時,需要確定采用哪種讀寫方式。在實際的開發過程中,為了保證數據的安全盡量不采用第三種實現讀寫方式(其他方式)。
    (5) DefaultRoutine函數
    設置的默認處理例程,程序中簡單地略過當前IRP,然后調用底層總線驅動。總線驅動處理傳遞來的IRP_MJ_CLOSE和IRP_MJ_CREATE子類IRP。
1.3 高速連續DMA傳輸設計[6]
    本設計需要解決的一個難題是高速實時數據的傳輸。整個傳輸系統如圖2所示。

    系統傳輸流程為:基帶芯片通過有線或無線方式接收到大量高速實時數據,傳遞到PCI Local端。PCI local端將數據傳遞到PCI Core與主機連接端,將數據通過PCI接口寫入主機分配的DMA內存中;或者設備從DMA內存中讀取主機數據。在傳輸過程中采用設備主控DMA方式。
    由于硬件基帶的傳輸速率高達300 Mb/s,且主機只能分配規模有限的DMA內存,所以在主機數據接收時,若主機PCI接口端無法設計一種高效的數據讀取方式以及主機與硬件實時的信息交互渠道,將會造成大量數據的丟失和數據讀取的錯誤。
    本文設計了一種高效的同步機制,該機制采用DMA傳輸數據,從而保證了數據傳輸的高效性。此外在驅動層和PCI接口層進行同步驗證,保證了數據的一致性,如圖3所示。設計思路如下:

    (1) 驅動采用公共內存編寫方式。根據應用層輸入信息分配相應大小的DMA內存,將該內存抽象為1~N個長度為M字節的DMA寄存器,并將分配的DMA首地址傳輸給硬件。設內存首地址用指針DMAmemory表示。
    (2) 驅動設備擴展中申明一個整型變量,用于保存上次硬件操作完畢時的DMA寄存器編號,命名為RegNumber,在驅動初始化階段初始化為0值。
    (3) PCI接口中分配一個長度為N bit的寄存器稱為寄存器R,寄存器R的位數與DMA寄存器個數一一對應。將寄存器R初始化為全0。
    (4) 硬件實時查詢寄存器R,若不為全1,則FPGA向主機寫入數據; 若為全1,則暫停數據寫入。
    (5) 當數據從基帶傳輸到主機端的PCI接口時,硬件首先填充DMA內存的第一個寄存器,填充完畢后將寄存器R的首位設置為1。后續數據依次填充DMA寄存器,并置位寄存器R對應的位為1。硬件填充完一個寄存器后,向主機發送一個電平中斷。
    (6) 主機端驅動檢測到硬件中斷,中斷例程中簡單清除電平中斷后,啟動DPC例程。
    (7) DPC例程中首先判斷寄存器R是否為全0,若為全0,則表示數據未寫入DMA內存中。DPC例程直接返回,等待下個中斷。
    (8) 若寄存器R不為全0,則表示已有數據寫入。檢查RegNumber值,并從RegNumber+1編號的DMA寄存器開始讀數。讀取完一個寄存器后,向該DMA寄存器對應的寄存器R中的bit位發出寫1命令,將硬件接收PC機下發的操作命令對應為0。
    (9) 更新RegNumber,if(RegNumber < N) {RegNumber++;} else{RegNumber = 0;}。
    (10) DPC執行完畢,函數返回。等待下一個中斷。
2 控制程序設計
    本文設計的驅動實現了數據收發完整功能,能提供用戶層進行可變大小DMA內存分配,使能數據收發、接收數據校驗及提取數據幀頭信息等操作。
    本設計基于MFC實現了一個控制界面程序,通過界面操作可實現用戶定義DMA大小分配,數據收發控制命令、接收數據量顯示及幀頭信息顯示等功能,如圖4所示。控制界面與驅動通信采用IOCTL控制碼,步驟如下:

 

 

    (1) 使用CTL_CODE宏定義控制碼。本例定義的控制碼可簡單歸類為讀/寫寄存器。數據在應用層進行組裝。
    (2) 驅動程序中的ControlRoutine例程實現相應控制碼功能。
    (3) 編寫一個DLL,實現驅動與界面的交互接口。DLL內部實現打開設備驅動,調用DeviceIoControl發送命令等操作。在外部向應用層提供用于發送命令的接口函數。如分配DMA、寫入DMA首地址、使能數據收發等。
    (4) 應用程序調用DLL提供的接口函數,實現對設備的控制。
    本文分析了一般PCI/PCI-E設備驅動的設計要求與設計方式,詳細介紹了重要例程的設計需求,重點分析了高速實時DMA傳輸系統的設計方法,給出了驅動設計的詳細步驟,最后介紹了控制程序的設計。提出的高速實時DMA傳輸系統的設計方法,實現了高速實時數據傳輸功能,解決了當基帶與PC機傳輸速率不一致時。經常出現的數據丟失和無法高速傳輸的問題。
參考文獻
[1]  尹勇,李宇.PCI總線設備開發寶典[M].北京:北京航空航天大學出版社,2005.
[2] PCI-SIG. PCI Express base specification revision1[S]. PCI_SIG,April 15 2003.
[3] 吳宏鋼,尹愛軍,秦樹人.基于WDM模型的PCI數據采集卡驅動程序設計[J].中國測試技術,2008,34(3)59-62.
[4] 張帆,史彩成,等.Windows驅動開發技術詳解[M].北京:電子工業出版社,2008.
[5] Microsoft. Microsoft Windows Driver  Kits [EB/OL].[2010-2-26]. http//www.micorsoft.com//wdk.
[6] 王招凱,禹衛東.基于PCIE總線的雷達數據記錄器驅動程序開發[J].微計算機信息,2008,24(4-2):89-91.

此內容為AET網站原創,未經授權禁止轉載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
国产精品美女在线| 国产精品日本一区二区| 一区二区三区欧美视频| 久久激情五月激情| 一本一道久久综合狠狠老精东影业 | 欧美日韩视频专区在线播放 | 亚洲老板91色精品久久| 亚洲欧美日韩第一区| 亚洲精品日韩精品| 玉米视频成人免费看| 国产欧美日韩视频| 国产精品九色蝌蚪自拍| 欧美另类99xxxxx| 久久久久久国产精品一区| 亚洲免费在线视频一区 二区| 最新热久久免费视频| 欧美在线综合| 午夜精品电影| 亚洲欧美精品伊人久久| 亚洲一区二区三区免费观看 | 亚洲免费伊人电影在线观看av| 日韩视频免费看| 亚洲精品久久久久| 亚洲啪啪91| 久久精品盗摄| 欧美一级艳片视频免费观看| 亚洲女优在线| 亚洲欧美成人精品| 亚洲小说春色综合另类电影| av成人福利| 99riav国产精品| 一本久久a久久精品亚洲| 亚洲日本va午夜在线电影| 在线观看视频亚洲| 樱花yy私人影院亚洲| 伊人久久综合| 影音先锋欧美精品| 亚洲国产91色在线| 99国内精品久久| 午夜一区在线| 亚洲精品极品| 亚洲欧美日韩国产精品| 久久久夜夜夜| 欧美日韩91| 国产欧美精品久久| 亚洲高清一区二区三区| 亚洲视频导航| 亚洲国产成人av| 这里只有精品在线播放| 久久久久久久国产| 欧美日韩大陆在线| 国产午夜精品久久久久久久| 亚洲国产精品成人| 亚洲视频欧美视频| 亚洲第一在线综合网站| 亚洲午夜精品一区二区| 久久精品亚洲| 欧美色大人视频| 国产在线视频欧美| 日韩一级精品视频在线观看| 午夜亚洲福利| 亚洲无亚洲人成网站77777| 久久精品亚洲国产奇米99| 欧美日韩另类视频| 国自产拍偷拍福利精品免费一| 日韩天堂在线视频| 亚洲大胆在线| 亚洲欧美变态国产另类| 免费永久网站黄欧美| 国产伦精品免费视频| 亚洲人成欧美中文字幕| 性做久久久久久| 亚洲一区二区三区精品在线观看| 久久在线免费| 国产麻豆精品在线观看| 夜夜嗨av一区二区三区免费区| 欧美在线亚洲| 欧美一区二区播放| 欧美日韩免费观看中文| 激情六月综合| 午夜视频一区在线观看| 亚洲视频一区二区免费在线观看| 裸体一区二区| 国产一区激情| 亚洲欧美日韩成人| 亚洲男人的天堂在线观看| 欧美激情中文不卡| 一区在线观看视频| 欧美在线高清视频| 亚洲欧美中文字幕| 欧美日韩综合在线| 亚洲欧洲在线看| 亚洲经典在线| 久久视频这里只有精品| 国产日本欧美在线观看| 中文一区二区| 亚洲视频在线二区| 欧美日韩免费在线视频| 亚洲国产精品传媒在线观看 | 日韩视频中午一区| 欧美肥婆在线| 伊人久久成人| 欧美一区二区三区婷婷月色| 午夜国产精品影院在线观看| 欧美日韩精品伦理作品在线免费观看| 亚洲福利视频一区| 亚洲国产日韩欧美在线图片 | 欧美激情第六页| 在线精品福利| 亚洲国产精品久久久久婷婷884| 欧美在线www| 国产精品视频网| 亚洲亚洲精品在线观看 | 久久免费视频在线观看| 国产精品美女一区二区| 在线中文字幕日韩| 亚洲婷婷综合久久一本伊一区| 欧美日韩精品一二三区| 亚洲精品四区| 亚洲深夜激情| 国产精品久久久久久久久久久久久久 | 亚洲午夜久久久久久久久电影网| 欧美精品免费看| 最近看过的日韩成人| 亚洲精品孕妇| 欧美人妖在线观看| 99热在线精品观看| 亚洲午夜免费视频| 国产精品第2页| 亚洲在线视频网站| 欧美在线播放视频| 国产偷国产偷精品高清尤物| 欧美一区二区三区在线观看视频| 欧美在线国产精品| 国产真实久久| 亚洲日本中文字幕| 欧美激情综合色| 夜夜狂射影院欧美极品| 亚洲女女女同性video| 欧美亚男人的天堂| 亚洲欧美日韩综合一区| 久久久精品2019中文字幕神马| 伊人蜜桃色噜噜激情综合| 亚洲精品美女在线观看| 欧美日韩播放| 在线亚洲免费视频| 欧美一区二区高清| 精品成人一区二区| aa亚洲婷婷| 国产精品一区在线观看你懂的| 亚洲欧美在线一区二区| 玖玖综合伊人| 亚洲精品国偷自产在线99热| 亚洲一区二区三区四区在线观看| 国产精品免费看片| 欧美制服丝袜| 欧美激情精品久久久| 一区二区三区高清不卡| 久久精品国产第一区二区三区| 一区视频在线| 亚洲一区二区三区777| 国产日韩一区二区三区在线播放| 亚洲盗摄视频| 欧美日韩精品综合| 欧美一区国产一区| 欧美国产在线观看| 午夜久久黄色| 欧美韩国在线| 亚洲女人av| 欧美激情视频在线免费观看 欧美视频免费一 | 欧美午夜激情视频| 久久精品亚洲精品| 欧美视频手机在线| 亚洲国产精品悠悠久久琪琪| 欧美日韩免费高清| 久久国产精品久久国产精品| 欧美日韩精品是欧美日韩精品| 欧美一级久久| 欧美日韩在线视频一区| 欧美在线黄色| 欧美日韩在线观看视频| 久久精品国产一区二区三区| 欧美日韩激情网| 亚洲电影成人| 国产精品久久久久7777婷婷| 亚洲激情电影在线| 国产精品一区毛片| 亚洲最新视频在线播放| 黄色成人在线免费| 午夜久久一区| 亚洲精品欧美日韩专区| 久久蜜桃av一区精品变态类天堂| 日韩午夜一区| 欧美成人中文字幕| 小辣椒精品导航| 欧美色图首页| 亚洲精品美女在线观看播放| 国产欧美日韩三级| 亚洲一区二区成人| 亚洲国产日韩综合一区|