




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、PCI總線高速DMA數(shù)據(jù)傳輸驅(qū)動(dòng)程序設(shè)計(jì) Design of Device Driver for High-Speed DMA Communication on PCIBus(中國(guó)電子科技集團(tuán)公司第41研究所,安徽 蚌埠233006黃文南摘 要:應(yīng)用PLX公司的PCI9054芯片, 開發(fā)PCI設(shè)備的DMA數(shù)據(jù)傳輸驅(qū)動(dòng)程序, 主要介紹了在WinDriver平臺(tái)上的具體實(shí)現(xiàn)及應(yīng)注意的問題。關(guān)鍵詞:PCI總線;DMA;設(shè)備驅(qū)動(dòng)程序Abstract:The design of Windows device driver for high-speed DMA communication based on
2、 PCI bus is introduced,and its implementation on WinDriver platform is presented.Key words:PCI bus;DMA;device driverPCI總線由于其高性能、低成本、開放性,目前在工業(yè)控制計(jì)算機(jī)方面得到了廣泛的應(yīng)用。PCI總線工作頻率為33 MHz/66 MHz,采用32位/64位地址/數(shù)據(jù)復(fù)用總線。數(shù)據(jù)傳輸速率在33 MHz時(shí)鐘,32位總線寬度下可達(dá)132 MB/s,遠(yuǎn)遠(yuǎn)高于ISA 總線5 MB/s的傳輸速率;PCI總線支持突發(fā)成組傳輸,一個(gè)突發(fā)分組由一個(gè)地址期與多個(gè)數(shù)據(jù)期組成,大大提高了數(shù)據(jù)的
3、傳輸效率;PCI總線獨(dú)立于處理器,采用總線控制與同步操作,具有極小的存取時(shí)延。在開發(fā)通信分析儀時(shí)需要大量高速的數(shù)據(jù)捕獲,基于PCI總線的這些特性,數(shù)據(jù)捕獲接口板采用了32位的PCI總線與主機(jī)接口。1 PCI9054總線控制器簡(jiǎn)介為簡(jiǎn)化電路設(shè)計(jì)與提高設(shè)計(jì)的效率與可靠性,數(shù)據(jù)捕獲PCI接口板采用了專用的控制芯片PCI9054。PCI9054是由美國(guó)PLX公司生產(chǎn)的先進(jìn)的PCI I/O加速器,采用了先進(jìn)的PLX數(shù)據(jù)流水線結(jié)構(gòu)技術(shù),符合PCI本地總線規(guī)范2.2版; 針對(duì)不同的處理器及局部總線特性, 有M、C、J三種模式可選; 配有可選的串行E2PROM接口,本地總線時(shí)鐘可與PCI時(shí)鐘異步。PCI905
4、4內(nèi)部有6種可編程的FIFO,以實(shí)現(xiàn)零等待突發(fā)傳273輸及本地總線與PCI總線之間的異步操作;支持主模式、從模式、DMA傳輸方式,被廣泛應(yīng)用于嵌入式系統(tǒng)中,是目前主控設(shè)備PCI橋接器的主流芯片。2 PCI設(shè)備DMA數(shù)據(jù)傳輸?shù)尿?qū)動(dòng)程序設(shè)計(jì)2.1 開發(fā)環(huán)境介紹Windows2000是純32位的操作系統(tǒng), 由于其運(yùn)行的穩(wěn)定性及可靠性較WIN9X 要高,因此在工業(yè)控制中,一般采用Windows2000作為運(yùn)行平臺(tái)。筆者開發(fā)的通信分析儀采用了Windows2000操作系統(tǒng)。由于Windows 2000禁止用戶模式的程序訪問I/O端口(Windows 95/98則允許用戶程序直接訪問I/O端口,用戶應(yīng)用程
5、序一般需通過(guò)設(shè)備驅(qū)動(dòng)程序?qū)崿F(xiàn)對(duì)設(shè)備的控制。為了實(shí)現(xiàn)PCI接口板的數(shù)據(jù)捕獲必須編寫相應(yīng)設(shè)備驅(qū)動(dòng)程序。在Windows2000下,主要設(shè)備驅(qū)動(dòng)程序的模型為WDM(Win32 drivers model,它是在原WINNT驅(qū)動(dòng)模型KDM(kernel driver mode上增加即插即用(P&P和電源管理等功能而形成的。開發(fā)設(shè)備驅(qū)動(dòng)程序與開發(fā)用戶應(yīng)用程序是完全不同的,開發(fā)設(shè)備驅(qū)動(dòng)程序需要對(duì)系統(tǒng)內(nèi)核有深入的了解,因此開發(fā)的難度較大。經(jīng)過(guò)比較選用了JUNGO公司提供的WinDriver驅(qū)動(dòng)開發(fā)平臺(tái)。 WinDriver通過(guò)提供一組底層API函數(shù)調(diào)用使開發(fā)人員可以在用戶層完成設(shè)備驅(qū)動(dòng)程序開發(fā), 使
6、用通用的VC+6.0環(huán)境等就可以完成驅(qū)動(dòng)程序的開發(fā)與調(diào)試。針對(duì)PCI9054接口芯片,WinDriver提供了相應(yīng)API函數(shù)調(diào)用,如數(shù)據(jù)的讀寫,DMA操作,中斷服務(wù)等,大大方便了驅(qū)動(dòng)程序的開發(fā)。2.2 DMA數(shù)據(jù)傳輸?shù)姆桨冈O(shè)計(jì)在PCI接口板上,設(shè)有兩塊128 KB的RAM用作捕獲數(shù)據(jù)的緩存,采用乒乓方式與主機(jī)內(nèi)存進(jìn)行DMA傳輸,當(dāng)一個(gè)緩沖區(qū)捕獲滿時(shí),產(chǎn)生一個(gè)中斷通知主機(jī),同時(shí)下一次捕獲的數(shù)據(jù)將被放入另一塊緩沖區(qū)中。主機(jī)收到捕獲滿中斷后啟動(dòng)一次DMA傳輸,將獲捕的數(shù)據(jù)放入主機(jī)的內(nèi)存緩沖區(qū)中,然后進(jìn)行數(shù)據(jù)的處理與顯示。在本設(shè)計(jì)中,PCI9054以C總線模式工作。因?yàn)閿?shù)據(jù)捕獲量大,達(dá)到38 MB/s
7、,為了提高數(shù)據(jù)的存取速度,采用了無(wú)限突發(fā)的DMA方式。采用DMA通道0作為傳輸通道,每次傳輸?shù)臄?shù)據(jù)量為128 KB大于一頁(yè)(4 KB,所以DMA的傳輸方式置為分散/聚攏方式。當(dāng)DMA傳輸結(jié)束后,以中斷方式通知主機(jī)。PCI接口板與主機(jī)的DMA傳輸示意圖如圖1所示。274 圖1 主機(jī)與本地設(shè)備的DMA傳輸示意圖2.3 DMA驅(qū)動(dòng)程序開發(fā)在開發(fā)PCI設(shè)備驅(qū)動(dòng)程序中,首先需確定PCI9054配置E2PROM的值,因?yàn)镻CI9054的初始化是根據(jù)其配置E2PROM中的值來(lái)進(jìn)行的。當(dāng)系統(tǒng)檢測(cè)到PCI設(shè)備后,通過(guò)WinDriver提供的DriverWizard自動(dòng)生成驅(qū)動(dòng)程序框架,及*.inf文件。WinD
8、river為PCI9054提供了一組API函數(shù),但是其提供的DMA 函數(shù)不是基于突發(fā)方式的,并且是以查詢方式來(lái)檢測(cè)DMA是否結(jié)束,比較適用于一次DMA讀寫。因此在本設(shè)計(jì)中,對(duì)其提供的DMA API函數(shù)及中斷相關(guān)的函數(shù)進(jìn)行改寫,即在DMAOpen(函數(shù)中,需對(duì)DMAMODE寄存器的本地突發(fā)使能位(BIT8與BTERM輸入使能位(BIT7置位,否則,DMA操作只能完成一個(gè)雙字的突發(fā)傳輸,只有將此二位置1后,才能完成指定長(zhǎng)度的DMA傳輸。因?yàn)閭鬏斄砍^(guò) 4 KB,所以要置為分散/聚攏(scatter/gather模式(BIT9,同時(shí)使能DMA 中斷完成位(BIT10與DMA通道0中斷選擇位(BIT1
9、7。重寫DMA啟動(dòng)函數(shù)DMAStart(,設(shè)置每次DMA傳輸所需的PCI地址(主機(jī)物理內(nèi)存地址、本地地址、傳輸大小、傳輸方向等,并置DMA啟動(dòng)位。這樣每次數(shù)據(jù)捕獲滿中斷到來(lái),啟動(dòng)DMA傳輸時(shí),只需調(diào)用DMAStart(函數(shù)即可。如果采用Windriver提供的DMAWriteRead函數(shù),每進(jìn)行一次DMA傳輸都要重新打開一個(gè)DMA,分配空間,設(shè)置各種相應(yīng)的寄存器等,增加了DMA傳輸?shù)腃PU開銷。筆者曾測(cè)試過(guò),當(dāng)進(jìn)行數(shù)據(jù)全速捕獲時(shí),如果采用Windriver提供的DmaWriteRead函數(shù)及DMA完成查詢方式,CPU的負(fù)荷最高可達(dá)80%,嚴(yán)重影響了系統(tǒng)其他程序的執(zhí)行。當(dāng)采用修改后的DmaSta
10、rt(函數(shù)及DMA中斷方式后,全速進(jìn)行數(shù)據(jù)捕獲時(shí), CPU的負(fù)荷只有25%左右,大幅降低了CPU的負(fù)荷,保證了整個(gè)系統(tǒng)軟件的正常執(zhí)行。在DMAStart(函數(shù)中,需要注意的是PCI地址寄存器的設(shè)置,因?yàn)閭鬏敂?shù)據(jù)量275 大于一頁(yè)(4 KB,所以采用了分散/聚攏方式,即以分散的物理內(nèi)存塊映射連續(xù)分配的用戶地址空間。與內(nèi)存塊分配方式不同,這時(shí)不是設(shè)置DMA 的PCI 地址與本地地址寄存器,而是設(shè)置DMA 通道描述符寄存器(DMADPR。通過(guò)函數(shù)WD_DMALock(在物理內(nèi)存中鎖定所需大小的存儲(chǔ)空間,取得每頁(yè)的物理地址,大小及相對(duì)應(yīng)的本地地址放入地址描述塊鏈表中,在DMADPR 寄存器中設(shè)置初始的
11、描述塊地址。DMA 操作啟動(dòng)后,PCI9054調(diào)入第一塊的地址進(jìn)行傳輸,完成后調(diào)入第二塊,直到遇到鏈表的結(jié)束位為止(DMADPR 的BIT1為1。在InterruptEnable(中斷使能函數(shù)中,定義捕獲滿及DMA 完成中斷的清除操作,使能本地PCI 中斷(捕獲中斷及DMA 通道 0中斷,定義中斷入口程序。在用戶層的中斷處理程序中,按中斷狀態(tài)位分別處理捕獲中斷與DMA 完成中斷。如果是捕獲中斷則啟動(dòng)一次DMA 傳輸;如果是DMA 完成中斷,則對(duì)捕獲數(shù)據(jù)進(jìn)行處理。將所有與硬件有關(guān)的API 函數(shù)打包成動(dòng)態(tài)鏈接庫(kù)。在主機(jī)的用戶應(yīng)用程序中,程序初始化時(shí)將其調(diào)入。在數(shù)據(jù)捕獲功能中對(duì)相應(yīng)的DMA 函數(shù)進(jìn)行
12、調(diào)用,程序流程圖如圖2 276圖2 程序流程圖與設(shè)備操作相關(guān)的API函數(shù)如表1所示。表1PCI設(shè)備操作相關(guān)的API函數(shù)列表API函數(shù)名作用LocateAndOpenBoard 定位PCI板卡打開PCI設(shè)備,分配資源ReadReg 讀32位寄存器WriteReg 寫32位寄存器IntEnable 使能中斷IntDisable 關(guān)閉中斷DMAOpen 打開一個(gè)DMADMAClose 關(guān)閉DMADMAStart 啟動(dòng)一次DMA傳輸P9054_Open 打開一個(gè)PCI設(shè)備P9054_Close 關(guān)閉一個(gè)PCI設(shè)備2.4 驅(qū)動(dòng)程序設(shè)計(jì)中應(yīng)注意的問題在驅(qū)動(dòng)程序開發(fā)過(guò)程中,確定PCI9054配置E2PROM
13、的值是很重要的一步,需對(duì)PCI總線的工作方式及對(duì)PCI9054的各種寄存器的作用有充分的了解,如果設(shè)置不正確,系統(tǒng)就無(wú)法檢測(cè)到PCI接口板,或者即使檢測(cè)到了,讀寫也可能不正常,使驅(qū)動(dòng)程序的開發(fā)無(wú)法進(jìn)行下去。在中斷使能函數(shù)中,如果中斷處理部分放在用戶層,那么一定要在中斷使能函數(shù)中,預(yù)先定義好各種中斷的清除操作,因?yàn)镻CI中斷為電平中斷,為了保證中斷的及時(shí)清除,這一部分必須由內(nèi)核來(lái)做,不能放在用戶層的中斷處理部分來(lái)做。如果中斷頻率很高,則應(yīng)該將中斷處理部分放入內(nèi)核插件中處理。在用戶層中斷響應(yīng)為每秒10000次,而在內(nèi)核方式下為每秒100000次。對(duì)于DMA傳輸?shù)刂返脑O(shè)置,要注意是用主機(jī)內(nèi)存的物理地址來(lái)設(shè)置DMA的PCI地址寄存器。為了保證傳輸?shù)倪B續(xù)進(jìn)行,所分配的這段主機(jī)內(nèi)存必須是非分頁(yè)277內(nèi)存, 以保證不會(huì)被交換出去, 所以必須用 WD_DMALock(函數(shù)來(lái)分配并鎖定內(nèi)存, 而不能用一般的內(nèi)存分配函數(shù). 3 結(jié)束語(yǔ) PCI 總線已成為工業(yè)控制計(jì)算機(jī)中的主流總線結(jié)構(gòu), 本設(shè)計(jì)采用 PCI 總線 DMA 方式實(shí)現(xiàn)了大量高速的數(shù)據(jù)捕獲,滿足了設(shè)計(jì)的要求.采用 WinDriver 驅(qū)動(dòng)開發(fā)平 臺(tái),使難度較大的 Windows 驅(qū)動(dòng)程序開發(fā)變得容易,大大縮短了驅(qū)動(dòng)程序開發(fā)與調(diào) 試的時(shí)間.所有 PCI 設(shè)備的操
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 退休工勞務(wù)合同協(xié)議
- 朋友條約協(xié)議書
- 2019-2025年BIM工程師之BIM工程師真題練習(xí)試卷B卷附答案
- 退休返聘工作合同協(xié)議
- 足浴店讓利分紅合同協(xié)議
- 2024年高級(jí)審計(jì)師學(xué)習(xí)目標(biāo)試題及答案
- 2024年高級(jí)審計(jì)師考試的知識(shí)積累試題及答案
- 車輛貸款擔(dān)保合同協(xié)議
- 民用航空器維修流程標(biāo)準(zhǔn)試題及答案
- 配送公司配送合同協(xié)議
- 2024北京初三(上)期末語(yǔ)文匯編:議論文閱讀
- 小學(xué)數(shù)學(xué)《分?jǐn)?shù)除法》50道計(jì)算題包含答案
- 預(yù)付煤款合同模板
- 光影中國(guó)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 工科中的設(shè)計(jì)思維學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 2020年全國(guó)II卷英語(yǔ)高考真題試題(答案+解析)
- 腦洞大開背后的創(chuàng)新思維學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 科傻平差軟件說(shuō)明指導(dǎo)書
- ipo上市商業(yè)計(jì)劃書
- 山東省青島市市北區(qū)2023-2024學(xué)年七年級(jí)下學(xué)期英語(yǔ)期末考試試題
- 《養(yǎng)老護(hù)理員》-課件:老年人安全防范及相關(guān)知識(shí)
評(píng)論
0/150
提交評(píng)論