PCI總線視頻采集卡及其Windows95驅動程序設計
出處:電子技術應用 發(fā)布于:2011-09-05 14:19:51
1 Windows95驅動程序原理
Windows 95 時期 Windows95終結了DOS實模式的歷史,是真正獨立的32位操作系統(tǒng)。Win95使用數(shù)種不同的驅動驅動程序模型。在操作系統(tǒng)中,程序必須通過系統(tǒng)內(nèi)核上的驅動來控制硬件,而這些驅動必須完全符合操作系統(tǒng)對驅動加載、連接、讀寫的規(guī)定,并且使用相關系統(tǒng)API(Application Programming Interface)函數(shù)來控制。Windows 95的驅動程序類型以VXD為中心VXD又稱虛擬設備驅動。它不僅適用于硬件設備,還能虛擬出不存在的"軟件設備",如虛擬光驅。 所有運行Windows的程序都分為兩個保護級:Ring0和Ring3。系統(tǒng)進程運行于Ring0級,這個保護級的程序擁有完全的系統(tǒng)控制權限,可對所有的系統(tǒng)資源進行訪問與管理;普通應用程序運行與Ring3級,不允許對系統(tǒng)資源進行直接訪問且很多操作系統(tǒng)也受到限制,如果程序強行訪問的話,Windows就會給出出錯提示并強制結束——我們會經(jīng)常看到某些程序運行中出現(xiàn)"常規(guī)保護錯誤"等錯誤提示,也就是這個原因。 所有的Ring3級程序在Windows下都受到80×86保護模式的嚴格"監(jiān)視",使應用程序無法進行的操作,不過,VXD能使應用程序具有擴展操作系統(tǒng)的能力,開發(fā)人員通過讓運行于Ring3級的普通程序加載具有Ring0級的VXD,從而實現(xiàn)底層控制。不幸的是,著名的"CIH"病毒就是利用了VXD技術才可以破壞主板BIOS。
WDM 模型 WDM模型采用分層結構,首先是由模型來描述設備驅動程序的標準結構;其次微軟為常見類型的設備提供一系列的總線驅動程序和類型驅動程序。模型描述驅動程序如何安裝和啟動,類驅動則具有為許多標準類型設備所需的基本功能。標準的WDM驅動應該包含1個總線驅動和1個功能驅動。 總線驅動:總線驅動已經(jīng)包含在Windows中,不必另行安裝。總線包括PCI、AGP、并口、串口、IEEE1394接口等??偩€驅動主要負責管理總線設備,例如當我們在PCI插槽上插入新硬件,開啟電腦并進入系統(tǒng)后總線驅動開始工作——發(fā)現(xiàn)新硬件,并提示用戶安裝驅動程序。不僅如此,總線驅動還會實時向操作系統(tǒng)總線設備狀態(tài),檢測總線上有什么類型的設備,這就是家喻戶曉的"即插即用"。總線設備還負責設備的電源管理(ACPI),比如Windows的休眠功能。當我們通過控制面板選擇不同電源管理模式時,電源管理器就會通過系統(tǒng)發(fā)出的電源命令向總線驅動發(fā)出改變電源狀態(tài)的請求,總線驅動會響應這些請求并設置相應設備的電源狀態(tài)。 功能驅動:這就是常說的驅動程序,由類驅動程序和Mini驅動程序組成。其中,類驅動用來處理常規(guī)系統(tǒng)事務,如電源管理和即插即用,這都是由微軟定義好的,程序開發(fā)者只需要編寫Mini驅動即可。功能驅動一般由設備生產(chǎn)廠商提供,用以實現(xiàn)硬件設備的具體功能。例如NVIDIA系列顯卡只有在"雷管"驅動的支持下才能使用抗鋸齒和各項異性過慮。 過慮驅動:過慮驅動程序位于其他的驅動程序層之間,提供一些附加功能但不影響其他驅動程序,例如不少品牌電腦宣傳的一鍵上網(wǎng)功能是通過鍵盤過慮驅動和應用程序來實現(xiàn)的。
Windows95視頻采集卡設備驅動程序包括虛擬設備驅動程序和可安裝設備驅動程序兩部分,一般可以采用Microsoft Windows95 DDK(Device Driver Kit)進行原形、輸入庫以及一些樣例代碼,但是未提供編程所需要的編譯、匯編和連接程序。采用Visual C++ 5.0、Visual C++ 1.5以及MASM 6.0進行程序設計。設備驅動程序設計的好壞與采集卡的功能、性能、 兼容性及穩(wěn)定性密切相關。為保證驅動程序的質量,應當嚴格遵照Windows95 DDK的文檔進行程序設計。
2 虛擬設備驅動程序設計
在視頻采集卡的驅動程序中,虛擬設備驅動程序CAPTURE.VXD負責參與系統(tǒng)即插即用配置過程,管理視頻采集卡的硬件設備,并向運行在權限級3的上層程序提供調(diào)用接口:一是將分配的資源返回,如內(nèi)存選擇子、I/O地址、中斷號等,使得上層驅動程序可以使用這資源來操縱采集卡硬件設備;二是完成一些在權限級3所不能進行的操作,如分配DMA緩沖區(qū)、查看內(nèi)存映射頁表等。虛擬機管理器和虛擬設備驅動程序運行在一個單一的32位平板模式址空間中,權限級為0。系統(tǒng)建立兩個基地址為0、界限為4GB的全局描述符選擇子分別用于代碼段和數(shù)據(jù)段,程序不應當直接修改段寄存器、內(nèi)存描述符表、中斷描述符表。
2.1 設備聲明
虛擬設備驅動程序必須包含一個聲明,它一般位于程序的前部,聲明中包括虛擬設備驅動程序的名稱、版本號、調(diào)用接口等一些重要信息。
設備名稱定義了虛擬設備驅動程序的名稱。設備控制過程接受來虛擬機管理器的消息,并根據(jù)不同消息進行不同的操作。設備標識符是一個16位整數(shù),它是該程序在系統(tǒng)中的標識。初始化次確定虛擬設備驅動程序的裝載順序,首先裝入初始化次序值較小的虛擬設備驅動程序。V86 API接口用于接受來自虛擬8086模式程序的調(diào)用。PM API接口接受來自16位保護模式程序的調(diào)用。
2.2 設備控制過程
由于Windows對系統(tǒng)底層操作采取了屏蔽的策略,因而對用戶而言,系統(tǒng)變得更為安全,但這卻給眾多的硬件或者系統(tǒng)軟件開發(fā)人員帶來了不小的困難,因為只要應用中涉及到底層的操作,開發(fā)人員就不得不深入到Windows的內(nèi)核去編寫屬于系統(tǒng)級的虛擬設備驅動程序。Win 98與Win 95設備驅動程序的機理不盡相同,Win 98不僅支持與Windows NT 5.0兼容的WDM(Win32 Driver Mode)模式驅動程序,而且還支持與Win 95兼容的虛擬設備驅動程序VxD(Virtual Device Driver)。下面介紹了基于Windows 9x平臺的虛擬環(huán)境、虛擬設備驅動程序VxD的基本原理和設計方法,下面為可視電話音頻卡配套的虛擬設備驅動程序VxD的設計實例:
BeginProc WBD848_Control
Control_Dispatch Sys_Dynamic_Device_Init,WBD848_Dyn_Device_Init
Control_Dispatch Sys_Dynamic_Device_Exit,WBD848_Dyn_Device_Exit
Control_Dispatch PnP_New_DevNode,WBD848_PnP_New_DevNode
Control_Dispatch W32_DEDVICEIOCONTROL,WBD848_W32_DeviceIOControl
Clc
Ret
EndProc WBD848_Control
與視頻采集卡即插即用配置過程相關的消息是PnP_New_DevNode。系統(tǒng)首先檢測視頻采集卡硬件存在,然后根據(jù)PCI接口板廠商和器件標識在注冊表中找到對應的虛擬設備驅動程序并裝入內(nèi)存,隨后系統(tǒng)向該虛擬設備驅動程序發(fā)送PnP_New_DevNode消息。因為視頻采集卡屬于多媒體設備,設備驅動程序的裝入應由MMDEVLDR.VXD完成,所以虛擬設備驅動程序在處理PnP_New_DevNode消息時,調(diào)用MMDEVLDR.VXD的服務MMDEVLDR_Register_Device_Driver注冊了回調(diào)函數(shù)PnP_Config_Handler,系統(tǒng)根據(jù)采集卡PCI配置空間為其分配資源后將調(diào)用此回調(diào)函數(shù)。在PnP_Config_Handler中可以使用CM_Get_Alloc_Log_Conf服務獲得系統(tǒng)為采集卡分配的資源。處理系統(tǒng)控制消息PnP_New_DevNode的例程如下:
BeginProc WBD848_PnP_New_DevNode
Mov eax,ebx ;虛擬機句柄
Mov ebx, offset32 PnP_Config_Handler;即插卻用處理例程
VxDCall MMDEVLDR_Register_Device _Driver
Mov eax,CR_SUCCESS
Stc
Ret
EndProc WBD848_PnP_New_DevNode
在回調(diào)函數(shù)PnP_Config_Handler中獲得的資源包括內(nèi)存、I/O、中斷和DMA四種。PCI總線視頻采集卡主要使用內(nèi)存和中斷資源,它包括一個內(nèi)存窗口作為內(nèi)存映射I/O和一個中斷IRQ號。虛擬設備驅動程序應用使用_MapPhysToLonear服務將內(nèi)存窗口物理地址映射到線性地址空間中,并使用_Allocate_GDT_Selector服務分配內(nèi)存選擇字,以便16位應用程序訪問該內(nèi)存區(qū)域。
2.3 應用程序接口
虛擬設備驅動程序為虛擬8086模式、16位及32位保護模式應用程序分別提供應用程序編程接口,使運行在權限級3上的應用程序可以訪問虛擬設備驅動程序。前兩種接口在設備聲明時定義,應用程序通過中斷調(diào)用INT28H AX=1648H獲得虛擬設備驅動程序的入口地址。32位接口通過W32_DEVICEIOCONTROL系統(tǒng)信息消息實現(xiàn),應用程序則使用系統(tǒng)API函數(shù)DeviceIoControl對虛擬設備驅動程序進行調(diào)用。
當16位應用程序對入口地址發(fā)出遠調(diào)用后,虛擬機管理順將應用程序的寄存器內(nèi)容保存在Client_Reg_Struc結構中,并將指向該結構的指針賦予EBP寄存器,然后調(diào)用相應的虛擬設備驅動程序。虛擬設備驅動程序必須訪問Client_Reg_Struc結構中的數(shù)據(jù)以獲得應用程序的調(diào)用參數(shù)。一般利用AX寄存器傳遞功能號,利用其它寄存器傳遞參數(shù),執(zhí)行結果通過Client_Reg_Struc結構返回。16位保護模式應用程序使用選擇子——偏移量地址模型,而虛擬設備驅動程序使用32位平板式地址模型,如果參數(shù)是以指針的形式傳遞給虛擬設備驅動程序,需要使用宏Client_Ptr_Flat進行轉換。
本采集卡中虛擬設備驅動程序提供的主要功能是:(1)使應用程序獲得系統(tǒng)為采集卡分配的資源,如內(nèi)存映射、I/O地址和中斷IRQ號,以便操縱采集卡;(2)提供有關內(nèi)存頁表的信息,以便進行DMA操作。16位應用程序接口的部分代碼如下:
?。?******* Copy Page Table ********
Client_Ptr_Flat eax,ES,BX ;es:bx指向頁表緩沖區(qū)
Client_Ptr_Flat ebx,DI,SI ;di:si指向DMA緩沖區(qū)
Shr ebx,12 ;起始頁號
Movz ecx,[ebp].Client_CX ;cx為需要拷貝的頁表項個數(shù)
VMMcall _CopyPageTable <ebx,ecx,eax,0>
Mov [ebp].Client_EAX,eax ;ax返回執(zhí)行結果
Ret
;********** Get Resource **********
movzx eax, _g_wSelector ;存儲器映射I/O地址選擇子
mov [ebp].Client_EAX,eaz
movzx eax,_g_wIRQ
mov [ebp].Client_EBX,eax
ret
32位應用程序接口的功能與16位接口十分相似,只是將存儲器映射I/O地址以32位線性地址的方式返回,以適應32位平板模式的尋址要求。另外32位接口不返回中斷IRQ號,因為32位應用程序中不進行有關中斷的操作。
3 可安裝設備驅動程序
3.1 Video For Window編程模型
視頻采集卡可安裝設備驅動程序采用Video For Window程序模型,它從各種各樣的視頻采集卡抽象出一個統(tǒng)一的邏輯結構,以便上層程序調(diào)用。上層程序主要是指由AVICap32.dll等系統(tǒng)動態(tài)鏈接庫構成的視頻采集引擎。視頻采集引擎負責顯示視頻數(shù)據(jù)、分配數(shù)據(jù)緩沖區(qū)、操縱系統(tǒng)調(diào)色板、存儲AVI文件等工作,它們將應用程序的調(diào)用翻譯成低級消息發(fā)送給可安裝設備驅動程序。可安裝設備驅動程序在消息的控制下,操縱采集卡硬件設備,完成視頻數(shù)據(jù)的采集。Video For Window驅動程序邏輯結構如圖2所示。
Video For Window驅動程序模型包括視頻源、幀存儲器、顯示設備、CPU和四個視頻數(shù)據(jù)通道。幀存儲器只具有邏輯上意義,可能在采集卡上或位于主機內(nèi)存中或者根本上不存在。它在圖2中只表明處于該閏置的應當是已經(jīng)解碼完整的視頻數(shù)據(jù)。四個視頻數(shù)據(jù)邏輯通道的功能如下:
External In代表視頻信號由模擬向數(shù)字的轉換過程,包括采樣量化、解碼等工作。該通道負責視頻信號的選擇(攝像機、錄像機、調(diào)諧器等),視頻信號制式選擇(NTSC、PAL、SECAM等),亮度、對比度、色調(diào)的調(diào)節(jié)等工作。
Video In 代表視頻數(shù)據(jù)由幀存儲器向系統(tǒng)緩沖區(qū)的傳輸過程。該通道負責視頻圖像數(shù)據(jù)的傳輸工作,如設定圖像大小、彩色格式,確定圖像幀的同步定時等。
External Out 代表視頻數(shù)據(jù)向顯示設備的直接傳輸過程。該通道負責視頻圖像的實時顯示工作,如確定顯示窗數(shù)據(jù)格式,進行顯示窗口的剪裁等。
Video Out 代表視頻數(shù)據(jù)由系統(tǒng)緩沖區(qū)向幀存儲器的反向傳輸過程。該通道負責視頻數(shù)據(jù)的回放,具有視頻解壓縮功能的休集卡可能需要這種反向的傳輸,以便對壓縮數(shù)據(jù)進行解碼。
3.2 數(shù)據(jù)傳輸
驅動程序將采集到的數(shù)據(jù)傳送到上層程序時使用VIDEOHDR結構,該結構包含了數(shù)據(jù)緩沖區(qū)、數(shù)據(jù)長度、時間戳等信息,定義如下:
typedef struct {
LPSTR lpData; //address of video buffer
DWORD dwBufferLength; //size,in bytes,of the data buffer
DWORD dwBufferLength; //size,in bytes,of the data buffer
DWORD dwBytesUsed;
DWORD dwTimeCeptured;
DWORD dwUser; //user-specific data
DWORD dwFlags;
DWORD dwReserved[4];//reserved;do not use }VIDEOHDR;
LpData 視頻數(shù)據(jù)緩沖區(qū)指針,由采集引擎填寫;
dwBufferLength 視頻數(shù)據(jù)緩沖區(qū)長度,由采集引擎填寫;
dwBytesUsed 緩沖區(qū)中圖像數(shù)據(jù)的實際長度,由驅動程序填寫;
dwTimeCaptured 時間戳,從采集幀起以ms為單位記錄,用于視頻數(shù)據(jù)的同步,由驅動程序填寫;
dwFlage 標志,驅動程序應當填寫VHDR_DONE以表示采集完成,如果此幀為關鍵幀還可以同時使用VHDR_KEYFRAME標志。
緩沖區(qū)通常由視頻采集引擎分配,并鈄VIDEOHOR結構指針以消息參數(shù)形式發(fā)送給驅動程序。當進行單幀采集時,驅動程序每收到一個DVM_FRAME消息便采集一幀圖像,驅動程序從DVM_FRAME消息返回時將VIDEOHDR結構返回給采集引擎。
序列圖像的采集比較復雜,驅動程序與采集引擎間以緩沖區(qū)隊列的形式進行數(shù)據(jù)交換,確保了連續(xù)的實時采集。采集引擎使用DVM_ADDBUFFER消息將空數(shù)據(jù)緩沖區(qū)不斷地加到緩沖區(qū)隊列的隊尾。同時,驅動程序將空數(shù)據(jù)緩沖區(qū)從隊列的隊首取出,并進行視頻采集。驅動程序將填充視頻數(shù)據(jù)的緩沖區(qū)通過回調(diào)函數(shù)返回給采集引擎,由它進行顯示、存盤等操作。添加緩沖區(qū)和取出緩沖區(qū)是兩個相對獨立的異步操作。采集引擎是緩沖區(qū)的生產(chǎn)者,它可以在系統(tǒng)空閑時分配若干個緩沖區(qū)并加入隊尾。驅動程序是緩沖區(qū)的消費者,在采集卡硬件中斷的驅動下它不斷取出空緩沖區(qū),并將用過的緩沖區(qū)返還給采集引擎。
3.3 視頻實時顯示
視頻圖像實時顯示功能又稱為Overlay,它將視頻圖像以窗口方式在計算機屏幕上實時顯示,顯示的畫面具有良好的視覺效果,顯示窗口與Windows95的圖形具有良好的視覺效果,顯示窗口號Windows95的圖形界面配合默契。要實現(xiàn)這些功能,首先采集卡必須具有將數(shù)據(jù)直接傳輸至顯示卡的硬件設備,因為實時顯示數(shù)據(jù)傳輸量巨大,主機CPU是不可能承擔這樣的任務的;其次要求軟硬件設備默契配合。
DirectDraw是一種軟件接口標準,提供了對顯示設備的直接訪問。它將顯示畫面分成表面(Surface),每種表面具有不同的屬性,如尺寸大小、彩色格式等。整個屏幕對應的表面稱為主表面,程序可以在顯存或內(nèi)存中建立其它表面,并在這些表面中繪制圖形,然后通過某種操作這些表面的內(nèi)容顯示在主表面上,這些操作是高效率的,程序可以從中獲得很高的性能。Overlay表面具有特殊的性質,它位于顯存,并且可以覆蓋顯示在主表面的任何位置。
當驅動程序的External Out通道收到DVM_STREAM_INIT消息時,開始視頻實時顯示。首先啟動DirectDraw接口,創(chuàng)建主表面和Overlay表面,并記錄有關Overlay表面的信息,如尺寸、數(shù)據(jù)格式、內(nèi)存地址等,同時為Overlay表面選擇一個顏色作為色鍵,通常是洋紅色。然后根據(jù)Overlay表面的信息初始化硬件設備,使DMA設備將視頻數(shù)據(jù)直接關入Overlay表面所在的顯存中。當顯示窗口移動或改變大小時,視頻采集引擎會發(fā)送DVM_UPDATE消息通知驅動程序更新顯示,驅動程序應當在視頻窗口中填充色鍵的顏色,并移動Overlay表面使其與視頻窗口對齊。因為可安裝設備驅動程序是16位模塊,而DirectDraw位于32位模塊中,在采集卡驅動程序中不能直接調(diào)用DirectDraw接口,故意需借助Flat Thunk在16位與32位模塊間建立聯(lián)系。
本設備驅動程序朝陽區(qū)分利用PCI總線的帶寬和Windows95系統(tǒng)資源,獲得了較高的采集速率(384×288×24bits 25fps),實現(xiàn)了實時視頻顯示。
版權與免責聲明
凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權均屬于維庫電子市場網(wǎng),轉載請必須注明維庫電子市場網(wǎng),http://m.58mhw.cn,違反者本網(wǎng)將追究相關法律責任。
本網(wǎng)轉載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔此類作品侵權行為的直接責任及連帶責任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉載時,必須保留本網(wǎng)注明的作品出處,并自負版權等法律責任。
如涉及作品內(nèi)容、版權等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關權利。
- ARM技術架構與應用開發(fā)實踐指南2026/1/6 10:40:19
- 嵌入式實時操作系統(tǒng)(RTOS)選型與移植技術指南2025/12/31 10:42:31
- 工業(yè)嵌入式系統(tǒng):通信接口技術選型與抗干擾設計實踐2025/12/15 14:36:53
- 深入解析嵌入式 OPENAMP 框架:開啟異核通信新時代2025/7/22 16:27:29
- 一文快速了解OPENWRT基礎知識2025/7/14 16:59:04









