專利名稱:碼流播放卡和碼流采集卡的驅(qū)動方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)字電視領(lǐng)域中碼流傳輸方法,具體是碼流播放卡和碼流采集卡的驅(qū)動方法。
背景技術(shù):
Windows操作系統(tǒng)為了保證系統(tǒng)的安全性和可移植性,限制了應(yīng)用程序直接操作硬件設(shè)備,應(yīng)用程序只能通過驅(qū)動程序來讀寫和控制設(shè)備。有許多自主開發(fā)的硬件,要使這些硬件正常地工作在PC機(jī)的Windows操作系統(tǒng)下,必須為它們編寫Windows驅(qū)動程序。
通用的驅(qū)動程序開發(fā)方法是使用DDK驅(qū)動程序開發(fā)包,用這種方法開發(fā)周期長,程序設(shè)計(jì)復(fù)雜;在一定程度上制約了驅(qū)動程序的開發(fā)。
發(fā)明內(nèi)容
本發(fā)明的目的是克服現(xiàn)有技術(shù)的不足,提供一種應(yīng)用程序訪問自主開發(fā)的硬件碼流播放卡和碼流采集卡的驅(qū)動方法,其技術(shù)方案是碼流數(shù)據(jù)在硬件和應(yīng)用程序之間的傳輸采用直接存儲器存取DMA傳輸模式;由驅(qū)動程序的中斷服務(wù)例程ISR判斷中斷類型,并由中斷延遲過程DPC例程分別對各中斷類型進(jìn)行處理;通過應(yīng)用程序和驅(qū)動程序的通信,實(shí)現(xiàn)應(yīng)用程序?qū)τ布目刂啤?br>
所述碼流數(shù)據(jù)采用直接存儲器存取DMA傳輸流程如下[1]對軟件DriverStudio提供的KDmaTransfer類的實(shí)例初始化,選用公共緩沖區(qū)的內(nèi)存?zhèn)鬏敺绞剑瑵M足碼流數(shù)據(jù)高速、頻繁傳輸數(shù)據(jù)的要求;[2]編寫KDmaTransfer類實(shí)例的回調(diào)函數(shù)OnDmaReady,回調(diào)函數(shù)OnDmaReady判斷數(shù)據(jù)傳輸是否完成;如果數(shù)據(jù)傳輸完成,則完成相應(yīng)的I/O請求包;如果數(shù)據(jù)傳輸未完成,則進(jìn)入StartDMA例程,啟動DMA傳輸;[3]DMA傳輸完成,DMA中斷控制器產(chǎn)生中斷,驅(qū)動程序的中斷服務(wù)例程ISR做出響應(yīng),判斷中斷類型為DMA中斷,則延遲過程調(diào)用DPC例程調(diào)用Continue函數(shù),再回到DMA的回調(diào)函數(shù)OnDmaReady,由回調(diào)函數(shù)OnDmaReady判斷傳輸完成,結(jié)束本次DMA傳輸。
所述中斷類型的判斷及處理執(zhí)行如下步驟 中斷類型判斷,驅(qū)動程序的中斷服務(wù)例程ISR根據(jù)PCI9054芯片的DMA中斷寄存器的比特發(fā)生變化,判斷中斷類型是DMA傳輸完成的中斷或是硬件的本地中斷;[2]根據(jù)所判斷的中斷類型,中斷延遲過程調(diào)用DPC例程分別進(jìn)行如下處理——硬件的本地中斷,通知應(yīng)用程序再次調(diào)用驅(qū)動程序進(jìn)入DMA傳輸流程;——DMA傳輸完成的中斷,則調(diào)用Continue函數(shù)進(jìn)而回到DMA的回調(diào)函數(shù)OnDmaReady,由回調(diào)函數(shù)OnDmaReady判斷出傳輸已完成就結(jié)束本次DMA傳輸。
所述應(yīng)用程序和驅(qū)動程序通信是在兩者之間約定一系列相同的I/O控制代碼,應(yīng)用程序?qū)/O控制代碼命令發(fā)給驅(qū)動程序,驅(qū)動程序根據(jù)相應(yīng)的I/O控制代碼對硬件執(zhí)行相應(yīng)的操作。
碼流播放卡和碼流采集卡是自主開發(fā)的工作于計(jì)算機(jī)PCI總線上的硬件。為了實(shí)現(xiàn)應(yīng)用程序?qū)Υa流播放卡和碼流采集卡的操作,本發(fā)明為硬件開發(fā)驅(qū)動程序。驅(qū)動程序是硬件和應(yīng)用程序的接口,應(yīng)用程序通過驅(qū)動程序完成對硬件的訪問及操作。本發(fā)明解決了碼流播放卡和碼流采集卡與應(yīng)用程序的接口問題,使得碼流播放卡和碼流采集卡能正常工作于計(jì)算機(jī)的PCI總線上,在計(jì)算機(jī)上完成碼流播放和采集任務(wù)。進(jìn)而使利用計(jì)算機(jī)進(jìn)行碼流的分析和監(jiān)測成為可能。針對碼流播放卡和碼流采集卡要完成的功能,驅(qū)動程序按照要求完成了高速的碼流傳輸,在碼流速率高達(dá)120Mbps時(shí)數(shù)據(jù)傳輸正確,沒有數(shù)據(jù)丟失現(xiàn)象。
圖1本發(fā)明碼流播放卡應(yīng)用程序和驅(qū)動程序通信示意框2本發(fā)明碼流采集卡應(yīng)用程序和驅(qū)動程序通信示意框3本發(fā)明碼流播放卡驅(qū)動程序的DMA數(shù)據(jù)傳輸和中斷處理流程4本發(fā)明碼流采集卡驅(qū)動程序的DMA數(shù)據(jù)傳輸和中斷處理流程圖具體實(shí)施方式
下面結(jié)合附圖詳細(xì)闡述本發(fā)明的具體實(shí)施。
本發(fā)明的驅(qū)動程序包括碼流播放卡驅(qū)動程序和碼流采集卡驅(qū)動程序,是計(jì)算機(jī)應(yīng)用程序與硬件碼流播放卡和碼流采集卡的關(guān)鍵接口。兩驅(qū)動程序采用WDM(Windows DriverModel)驅(qū)動程序模型,借助于第三方軟件包DriverStudio、在Visual C++6.0環(huán)境下進(jìn)行開發(fā),具有硬件初始化單元,應(yīng)用程序與驅(qū)動程序通信單元,數(shù)據(jù)傳輸單元和安裝文件。上述各單元協(xié)調(diào)工作,驅(qū)動硬件高速播放和采集碼流。
本發(fā)明的驅(qū)動程序與操作系統(tǒng)配合完成硬件初始化,使硬件成為操作系統(tǒng)可訪問的設(shè)備。碼流播放卡和碼流采集卡的驅(qū)動程序訪問硬件資源采用I/O端口映射方式,首先在設(shè)備類中產(chǎn)生類KIoRange對象,其次在設(shè)備啟動例程中初始化該對象。初始化成功后就可以使用KIoRange類的成員函數(shù)inb,inw,ind,outb,outw,outd訪問硬件設(shè)備。
本發(fā)明的應(yīng)用程序和驅(qū)動程序的通信主要實(shí)現(xiàn)應(yīng)用程序?qū)τ布目刂?。?yīng)用程序每發(fā)送一個(gè)命令,驅(qū)動程序都有對應(yīng)的函數(shù)負(fù)責(zé)執(zhí)行兩者約定好的操作。應(yīng)用程序與驅(qū)動程序之間依靠I/O控制代碼傳遞命令。驅(qū)動程序定義了一系列I/O控制代碼,這些定義都包含在驅(qū)動程序的頭文件中,并且和應(yīng)用程序完全相同。應(yīng)用程序使用DeviceIoControl函數(shù)將I/O控制代碼傳遞給驅(qū)動程序,驅(qū)動程序根據(jù)控制代碼I/O的不同執(zhí)行對應(yīng)的操作。I/O控制代碼的格式如下#define代碼名稱CTL_CODE(設(shè)備類型,控制代碼,控制代碼的緩沖區(qū)傳送機(jī)制,請求者訪問要求)例如,在碼流播放卡中定義一個(gè)名為CTRL_AD9851_INIT的I/O控制代碼格式應(yīng)為#define CTRL_AD9851_INIT CTL_CODE(FILE_DEVICE_UNKNOWN,0x807,METHOD_IN_DIRECT,F(xiàn)ILE_ANY_ACCESS)當(dāng)驅(qū)動程序收到應(yīng)用程序發(fā)送的這個(gè)I/O控制代碼時(shí),執(zhí)行預(yù)先約定好的操作,對硬件的AD9851芯片進(jìn)行配置,使硬件能夠產(chǎn)生碼流播放時(shí)需要的時(shí)鐘信號。
如圖1和圖2所示,碼流播放卡和碼流采集卡的應(yīng)用程序的命令和驅(qū)動程序的操作各自互相對應(yīng)。
在圖1所示的碼流播放卡的應(yīng)用程序和驅(qū)動程序的通信過程為[1]應(yīng)用程序?qū)⒎治龅拇a流速率傳給驅(qū)動,發(fā)送I/O控制代碼,驅(qū)動程序則將碼流速率對應(yīng)的控制字寫入硬件上的AD9851芯片,由AD9851產(chǎn)生時(shí)鐘作為碼流原始速率的時(shí)鐘信號;[2]應(yīng)用程序?qū)⒂脩粢l(fā)送的碼流速率傳給驅(qū)動,發(fā)送I/O控制代碼,驅(qū)動程序則將碼流速率對應(yīng)的控制字寫入播放卡的可編程邏輯器件FPGA;[3]應(yīng)用程序根據(jù)用戶選擇的輸出碼流端口發(fā)送對應(yīng)端口的選擇I/O控制代碼,驅(qū)動程序則訪問FPGA串/并口相應(yīng)的選擇單元;[4]應(yīng)用程序建立一個(gè)事件,通知驅(qū)動程序,驅(qū)動程序和應(yīng)用程序共享事件; 應(yīng)用程序命令開始播放碼流,驅(qū)動程序則啟動硬件輸出碼流;[6]應(yīng)用程序命令停止播放,驅(qū)動程序則通知硬件停止輸出碼流。
在圖2所示的碼流采集卡應(yīng)用程序和驅(qū)動程序通信過程為[1]應(yīng)用程序根據(jù)用戶選擇的碼流輸入端口傳送對應(yīng)端口的選擇命令I(lǐng)/O,驅(qū)動程序則訪問碼流采集卡的可編程邏輯器件FPGA串/并口相應(yīng)的選擇單元;[2]應(yīng)用程序建立一個(gè)事件,通知驅(qū)動程序,驅(qū)動程序和應(yīng)用程序共享事件;[3]應(yīng)用程序命令開始采集,驅(qū)動程序啟動硬件采集碼流;[4]應(yīng)用程序命令停止采集,驅(qū)動程序通知硬件停止輸出碼流。
為了實(shí)現(xiàn)高速率碼流的播放與采集,本發(fā)明的驅(qū)動程序使用直接存儲器存取DMA工作模式,完成碼流數(shù)據(jù)在硬件和應(yīng)用程序之間的傳輸。驅(qū)動程序的中斷服務(wù)例程ISR判斷中斷類型,并由中斷延遲過程調(diào)用DPC例程分別對各中斷類型進(jìn)行處理。本發(fā)明使用的開發(fā)軟件DriverStudio為DMA操作提供了KDmaTransfer類用于DMA傳輸控制。
一.碼流播放卡驅(qū)動程序的DMA數(shù)據(jù)傳輸及中斷處理的實(shí)施例參見圖3,碼流播放卡的DMA數(shù)據(jù)傳輸步驟如下[1]對開發(fā)軟件DriverStudio提供的KDmaTransfer類的實(shí)例初始化。驅(qū)動程序選用“公共緩沖區(qū)”的內(nèi)存?zhèn)鬏敺绞?,滿足每次DMA傳輸256KBytes數(shù)據(jù)以及數(shù)據(jù)傳輸頻繁的要求;[2]編寫KDmaTransfer類實(shí)例的回調(diào)函數(shù)OnDmaReady,由宏DMAREADY_CALLBACK定義,回調(diào)函數(shù)首先要調(diào)用KDmaTransfer類的成員函數(shù)BytesRemaining,判斷其返回值是否為0,檢查數(shù)據(jù)是否已經(jīng)傳輸完成;[3]如果傳輸已完成,則調(diào)用KDmaTransfer類的成員函數(shù)Terminate并且完成相應(yīng)的I/O請求包IRP;如果未完成,則執(zhí)行數(shù)據(jù)傳輸,回調(diào)函數(shù)通知硬件開始傳輸數(shù)據(jù)進(jìn)入StartDMA例程啟動DMA傳輸,不需要等待數(shù)據(jù)傳輸完成,圖3中用斷劃線表示。
當(dāng)DMA傳輸完成,DMA中斷控制器產(chǎn)生中斷,驅(qū)動程序的中斷服務(wù)例程ISR將做出響應(yīng),判斷中斷類型為DMA中斷,然后在延遲過程調(diào)用DPC例程中調(diào)用Continue函數(shù)進(jìn)而回到DMA的回調(diào)函數(shù)OnDmaReady,判斷傳輸已完成,完成I/O請求包,實(shí)現(xiàn)給存儲器FIFO發(fā)一半容量的數(shù)據(jù)。
存儲器FIFO中的數(shù)據(jù)不斷向端口輸出,當(dāng)數(shù)據(jù)少于半滿時(shí),硬件產(chǎn)生中斷信號,此為本地中斷,數(shù)據(jù)傳輸進(jìn)入中斷處理,如圖3中灰色底紋流程所示。先由中斷服務(wù)例程ISR根據(jù)PCI9054芯片的DMA中斷寄存器的比特發(fā)生變化,判斷中斷類型是DMA傳輸完成的中斷或是硬件的本地中斷;如果是DMA傳輸完成的中斷,則調(diào)用Continue函數(shù)回到DMA的回調(diào)函數(shù)OnDmaReady,判斷傳輸已完成并結(jié)束本次DMA傳輸。
如果是硬件的本地中斷,中斷延遲過程調(diào)用DPC例程通知應(yīng)用程序發(fā)送數(shù)據(jù),再次調(diào)用驅(qū)動程序進(jìn)入上述數(shù)據(jù)的DMA傳輸流程;使傳輸過程循環(huán)進(jìn)行,直到停止播放為止。
二、碼流采集卡驅(qū)動程序的DMA數(shù)據(jù)傳輸及中斷處理實(shí)施例參見圖4,碼流采集卡從端口不斷接收碼流,存儲器FIFO中的數(shù)據(jù)量增加,當(dāng)存儲器FIFO達(dá)到半滿時(shí)產(chǎn)生本地中斷,進(jìn)入中斷處理過程,如圖4中灰色底紋流程所示。先由中斷服務(wù)例程ISR根據(jù)PCI9054芯片的DMA中斷寄存器的比特發(fā)生變化,判斷中斷類型是DMA傳輸完成的中斷或是硬件的本地中斷;如果是DMA傳輸完成的中斷,則調(diào)用Continue函數(shù)回到DMA的回調(diào)函數(shù)OnDmaReady,判斷傳輸已完成并結(jié)束本次DMA傳輸。
如果是硬件的本地中斷,中斷延遲過程調(diào)用DPC例程通知應(yīng)用程序接收數(shù)據(jù),再次調(diào)用驅(qū)動程序進(jìn)入數(shù)據(jù)的DMA傳輸流程。
DMA傳輸步驟如下[1]對開發(fā)軟件DriverStudio提供的KDmaTransfer類的實(shí)例初始化。驅(qū)動程序選用“公共緩沖區(qū)”的內(nèi)存?zhèn)鬏敺绞?,滿足每次DMA傳輸256KBytes數(shù)據(jù)以及數(shù)據(jù)傳輸頻繁的要求;[2]編寫KDmaTransfer類實(shí)例的回調(diào)函數(shù)OnDmaReady,由宏DMAREADY_CALLBACK定義,回調(diào)函數(shù)首先要調(diào)用KDmaTransfer類的成員函數(shù)BytesRemaining,判斷其返回值是否為0,檢查數(shù)據(jù)是否已經(jīng)傳輸完成;[3]如果傳輸已完成,則調(diào)用KDmaTransfer類的成員函數(shù)Terminate并且完成相應(yīng)的I/O請求包IRP;如果未完成,則執(zhí)行數(shù)據(jù)傳輸,回調(diào)函數(shù)通知硬件開始傳輸數(shù)據(jù)進(jìn)入StartDMA例程啟動DMA傳輸,不需要等待數(shù)據(jù)傳輸完成,圖4中用斷劃線表示。
當(dāng)DMA傳輸完成,DMA中斷控制器產(chǎn)生中斷,驅(qū)動程序的中斷服務(wù)例程ISR將做出響應(yīng),判斷中斷類型為DMA中斷,然后在延遲過程調(diào)用DPC例程中調(diào)用Continue函數(shù)進(jìn)而回到DMA的回調(diào)函數(shù)OnDmaReady,判斷傳輸已完成,完成I/O請求包,結(jié)束本次DMA傳輸。
上述DMA傳輸流程將存儲器FIFO中的碼流數(shù)據(jù)傳給應(yīng)用程序,完成碼流采集卡數(shù)據(jù)的傳輸。存儲器FIFO中的數(shù)據(jù)被讀出少于半滿;由于硬件從端口不斷接收碼流,存儲器FIFO中的數(shù)據(jù)經(jīng)過積累又達(dá)到半滿,又產(chǎn)生本地中斷,使上述數(shù)據(jù)傳輸過程循環(huán)進(jìn)行,直到收到應(yīng)用程序停止采集的命令為止。
碼流播放卡和碼流采集卡是自主開發(fā)的設(shè)備,為了使操作系統(tǒng)和本發(fā)明的驅(qū)動程序連接起來,需要修改驅(qū)動程序安裝文件。微軟定義了一系列全局唯一標(biāo)識符GUID和設(shè)備類名,選擇自主開發(fā)的設(shè)備要加入的類,將驅(qū)動程序安裝文件中的“Class”和“ClassGUID”修改為微軟定義的相應(yīng)的設(shè)備類名和全局唯一標(biāo)識符GUID;修改設(shè)備管理器中設(shè)備顯示的圖標(biāo);修改驅(qū)動安裝文件中的廠商標(biāo)識符、設(shè)備標(biāo)識符、提供商以及制造商信息。
另外還要修改驅(qū)動安裝文件中的Manufacturer and Models Sections節(jié)中PCI\VEN_aaaa&DEV_bbbb&SUBSYS_cccccccc&REV_dd,其中aaaa是廠商標(biāo)識符,bbbb是設(shè)備標(biāo)識符,cccccccc是設(shè)備報(bào)告的子系統(tǒng)id,dd是修訂號,一般只用到廠商標(biāo)識符和設(shè)備標(biāo)識符,安裝文件中的這些內(nèi)容要和硬件EEPROM中的一致。碼流播放卡驅(qū)動安裝文件修改為PCI\VEN_10B5&DEV_7820&SUBSYS_00000000&REV_00;碼流采集卡驅(qū)動安裝文件修改為PCI\VEN_10B5&DEV_6820&SUBSYS_00000000&REV_00。使應(yīng)用程序和驅(qū)動程序連接并支持驅(qū)動程序正常工作。
權(quán)利要求
1.一種碼流播放卡和碼流采集卡的驅(qū)動方法,其特征在于采用直接存儲器存取DMA傳輸模式實(shí)現(xiàn)碼流數(shù)據(jù)在硬件和應(yīng)用程序之間的傳輸;通過驅(qū)動程序的中斷服務(wù)例程ISR判斷中斷類型,并由中斷延遲過程調(diào)用DPC例程分別對各中斷類型進(jìn)行處理;通過應(yīng)用程序和驅(qū)動程序的通信,實(shí)現(xiàn)應(yīng)用程序?qū)τ布目刂?;所述采用直接存儲器存取DMA傳輸碼流數(shù)據(jù)的具體過程如下[1]對軟件DriverStudio提供的KDmaTransfer類的實(shí)例初始化,選用公共緩沖區(qū)的內(nèi)存?zhèn)鬏敺绞?,滿足碼流數(shù)據(jù)高速、頻繁傳輸數(shù)據(jù)的要求;[2]編寫KDmaTransfer類實(shí)例的回調(diào)函數(shù)OnDmaReady,回調(diào)函數(shù)OnDmaReady判斷數(shù)據(jù)傳輸是否完成;如果數(shù)據(jù)傳輸完成,則完成相應(yīng)的I/O請求包;如果數(shù)據(jù)傳輸未完成,則進(jìn)入StartDMA例程,啟動DMA傳輸;[3]DMA傳輸完成,DMA中斷控制器產(chǎn)生中斷,驅(qū)動程序的中斷服務(wù)例程ISR做出響應(yīng),判斷中斷類型為DMA中斷,則延遲過程調(diào)用DPC例程調(diào)用Continue函數(shù),再回到DMA的回調(diào)函數(shù)OnDmaReady,由回調(diào)函數(shù)OnDmaReady判斷傳輸完成,結(jié)束本次DMA傳輸;所述中斷類型的判斷及處理的具體步驟如下[1]中斷類型判斷,驅(qū)動程序的中斷服務(wù)例程ISR根據(jù)PCI9054芯片的DMA中斷寄存器的比特發(fā)生變化,判斷中斷類型是DMA傳輸完成的中斷或是硬件的本地中斷;[2]根據(jù)所判斷的中斷類型,中斷延遲過程調(diào)用DPC例程分別進(jìn)行如下處理——硬件的本地中斷,通知應(yīng)用程序再次調(diào)用驅(qū)動程序進(jìn)入DMA傳輸流程;——DMA傳輸完成的中斷,則調(diào)用Continue函數(shù)進(jìn)而回到DMA的回調(diào)函數(shù)OnDmaReady,由回調(diào)函數(shù)OnDmaReady判斷出傳輸已完成就結(jié)束本次DMA傳輸。
2.根據(jù)權(quán)利要求1所述的碼流播放卡和碼流采集卡的驅(qū)動方法,其特征在于所述應(yīng)用程序和驅(qū)動程序通信是在兩者之間約定一系列相同的I/O控制代碼,應(yīng)用程序?qū)/O控制代碼命令發(fā)給驅(qū)動程序,驅(qū)動程序根據(jù)I/O控制代碼對硬件執(zhí)行相應(yīng)的操作。
全文摘要
一種碼流播放卡和碼流采集卡的驅(qū)動方法,其碼流數(shù)據(jù)在硬件和應(yīng)用程序之間的傳輸采用直接存儲器存取DMA傳輸模式;由驅(qū)動程序的中斷服務(wù)例程ISR判斷中斷類型,并由中斷延遲過程調(diào)用DPC例程分別對各中斷類型進(jìn)行處理;通過應(yīng)用程序和驅(qū)動程序的通信,實(shí)現(xiàn)應(yīng)用程序?qū)τ布目刂啤1景l(fā)明解決了碼流播放卡和碼流采集卡和應(yīng)用程序的接口問題,使得碼流播放卡和碼流采集卡能正常工作于計(jì)算機(jī)的PCI總線上,在計(jì)算機(jī)上完成碼流播放和采集任務(wù);進(jìn)而使利用計(jì)算機(jī)進(jìn)行碼流的分析和監(jiān)測成為可能。針對碼流播放卡和碼流采集卡要完成的功能,驅(qū)動程序按照要求完成了高速的碼流傳輸,在碼流速率高達(dá)120Mbps時(shí)數(shù)據(jù)傳輸正確,沒有數(shù)據(jù)丟失現(xiàn)象。
文檔編號G06F9/00GK1684030SQ20051004180
公開日2005年10月19日 申請日期2005年3月16日 優(yōu)先權(quán)日2005年3月16日
發(fā)明者李兵兵, 李樂樂, 楊秀蓮, 蔚述明, 黃新平, 王莎莎 申請人:西安電子科技大學(xué)