<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 光電顯示 > 設計應用 > 基于DM6446的Windows CE顯示驅動(dòng)設計實(shí)現

基于DM6446的Windows CE顯示驅動(dòng)設計實(shí)現

作者: 時(shí)間:2012-09-18 來(lái)源:網(wǎng)絡(luò ) 收藏

本文引用地址:http://dyxdggzs.com/article/167501.htm

  3.2 主要組成部分

  WIN程序如圖3 所示,由DDI(Display Device Interface) 和HAL(Hardware Abstraction Layer)兩部分組成。

  HAL 主要為DirectDraw 服務(wù),只需要在中向GDI 導出HALinit()即可,因此本文研究的重點(diǎn)是DDI 部分,即通常的驅動(dòng)部分。由于在顯示中存在大量硬件無(wú)關(guān)操作,顯示驅動(dòng)通常采用分層結構,采用分層結構有助于降低代碼復雜度提高代碼效率,其中MDD 層缺省的繪圖功能,由微軟提供的圖形原語(yǔ)引擎模塊(GPE , GraphicsPrimitive Engine)組成,如果要支持Directdraw,則要使用DDGPE模塊;而PDD層與硬件具體相關(guān),則是顯示驅動(dòng)的主要內容,一般由OEM 廠(chǎng)商或獨立硬件商。

  WIN 上層程序通過(guò)一組(約20 多個(gè))顯示驅動(dòng)接口函數同顯示驅動(dòng)打交道,因此顯示設備驅動(dòng)程序必須這些顯示驅動(dòng)接口函數,GDI 通過(guò)調用這組函數初始化顯示設備驅動(dòng)程序和將圖形輸出到顯示設備上。由于采用分層結構,顯示驅動(dòng)由MDD 層負責對上層的GWES模塊提供函數接口,但是這些函數并不是直接提供出來(lái)的,實(shí)際上只是通過(guò)一個(gè)DrvEnabLEDriver( )函數來(lái)完成的。作為DDI部分的一個(gè)導出函數,DrvEnableDriver會(huì )在GDI初始化時(shí)被調用。

  DrvEnableDriver 在MDD 層中沒(méi)有實(shí)現,所以需要在PDD層中定義,主要代碼如下:

  BOOL APIENTRY DrvEnableDriver

 ?。║LONG engineVersion,ULONG cj,DRVENABLEDATA *data,PENGCALLBACKS engineCallbacks)

  {

  BOOL fOk = FALSE;

  if(gszBaseInstance[0] != 0)

  {

  fOk =

  GPEEnableDriver(engineVersion, cj, data,engineCallbacks);

  }

  return fOk;

  }

  這里GPEEnableDriver 是微軟預先編寫(xiě)的一個(gè)MDD層函數。該函數位于源文件ddi_if.cpp里, 因此我們只需簡(jiǎn)單調用就可以了。

GPEEnableDriver 函數通過(guò)執行語(yǔ)句memcpy(pded, pDrvFn, cj) 將一個(gè)預先定義好的DRVENABLEDATA 結構體變量pDrvFn 的地址傳給一個(gè)上層結構體指針pded.而在結構體變量pDrvFn 中預先已包含了20 多個(gè)底層顯示驅動(dòng)函數指針,這樣GWES 就可以通過(guò)這些指針操縱底層顯示硬件了。例如應用程序想創(chuàng )建一個(gè)到圖形設備的連接時(shí)可以通過(guò)GWES.exe 調用CreateDC(),而該函數會(huì )調用DrvEnablePDEV()函數,當應用程序需要從顯示設備上斷開(kāi)時(shí)則會(huì )調用DeleteDC() , DeleteDC() 則會(huì )調用DrvDisablePDEV() .DrvEnablePDEV() 和DrvDisablePDEV()就屬于這20 多個(gè)被GWES 調用的底層顯示驅動(dòng)函數。

  以上這些底層顯示驅動(dòng)函數大部分跟硬件密切相關(guān),因此需要進(jìn)一步調用PDD層函數。由于不同的顯示硬件特點(diǎn)都不盡相同,因此勢必造成PDD層暴露給MDD層的接口函數各不相同,這樣勢必會(huì )增加代碼的復雜性。為此微軟了一個(gè)GPE類(lèi),一個(gè)GPE類(lèi)實(shí)例代表一個(gè)顯示設備硬件,其所有數據成員都對應于一個(gè)顯示設備的屬性數據,并了多個(gè)成員函數用以操縱這些數據成員??紤]到硬件的多樣性,GPE 類(lèi)的有些函數并為全部實(shí)現,或為空函數或者虛函數,需要其子類(lèi)實(shí)現或者覆蓋。因此不能直接定義GPE類(lèi)型的變量,只能以先構造GPE類(lèi)為父類(lèi)的繼承類(lèi),然后才能定義實(shí)例。

  MDD 層的底層顯示驅動(dòng)函數通過(guò)實(shí)例化一個(gè)GPE 繼承類(lèi)的實(shí)例就可以直接調用PDD 層代碼了,這一般是通過(guò)SafeGetGPE 函數來(lái)實(shí)現的。

  SafeGetGPE 由微軟實(shí)現,位于MDD 層的ddi_if.cpp,一般無(wú)須改動(dòng)。在SafeGetGPE 函數中調用了GetGPE 函數,這個(gè)函數MDD 層沒(méi)有,需要我們在PDD 層實(shí)現。GetGPE 函數可以簡(jiǎn)單實(shí)現如下:

  這里代碼利用了C++的多態(tài)性和繼承性。在C++中父類(lèi)或更上一級的類(lèi)的指針可以引用繼承類(lèi)中相同的變量,并且對數據成員和成員函數的引用以繼承類(lèi)的實(shí)現或定義優(yōu)先。這樣在MDD 中使用指針gGPE 所指向的數據或函數時(shí)得到的都是類(lèi)VPBE 的成員變量和成員函數。由此可以看出GetGPE 函數是顯示驅動(dòng)中聯(lián)系MDD和PDD 的橋梁,通過(guò)它MDD 可以直接調用PDD的代碼。

  3.3 GPE繼承類(lèi)的實(shí)現

  通過(guò)上面的分析可以看出,WIN 的顯示驅動(dòng)主要部分在于PDD 層,而PDD 層除了向MDD導出一些接口函數外如DrvEnableDriver,其余主要是構建一個(gè)GPE 或是DDGPE 的子類(lèi)(如果要實(shí)現DirectDraw)。由于DDGPE 的父類(lèi)是GPE,因此無(wú)論是DDGPE 還是GPE 的子類(lèi)差別并不大。

  構建一個(gè)GPE 的子類(lèi)其實(shí)就是實(shí)現一個(gè)有具體數據和函數并且具體準確的反映了特定顯示設備硬件屬性的GPE 類(lèi)的子類(lèi),并通過(guò)該子類(lèi)去實(shí)例化一個(gè)對象。

  一個(gè)GPE 子類(lèi)通常需要重載GPE 類(lèi)中的同名函數和實(shí)現GPE中的虛函數以及子類(lèi)獨有的一些函數如初始化構造函數[3].子類(lèi)構造函數主要是初始化硬件和子類(lèi)成員變量,譬如視頻處理時(shí)鐘寄存器設置,OSD Window 的大小和坐標,VENC 的輸出模式,以及子類(lèi)的成員變量如顯示寬度m_nScreenWidth 和顯示高度m_nScreenHeight 等等。子類(lèi)要GPE 類(lèi)中的函數包括GPE 的空函數和虛函數,這些函數實(shí)際上就是MDD 調用PDD 層驅動(dòng)中需要實(shí)現的函數,主要函數包括:SetMode(),用于設置一個(gè)顯示設備能夠支持的顯示模式;GetPhysicalVideoMemory(),用于獲取顯示設備內存的系統基地址和內存大??; 以及AllocSurface() SetPointerShape()BltComplete() SetPalette()等。這些函數具體可以參考微軟提供的驅動(dòng)示例代碼,它們位于Public CommonOAKDriversDisplay 目錄下[ 1].除了這些函數外PDD 還需實(shí)現一個(gè)MDD 層函數DrvGetMask,但比較簡(jiǎn)單,只需要定義一個(gè)全局數組gBitMasks,該數組內容是代表RGB 的所占的位域,與具體的顯示硬件有關(guān)。

  3.4 驅動(dòng)程序與應用程序的通信

  不同于其他流式驅動(dòng)可以由應用程序直接調用,顯示驅動(dòng)由操作系統調用,應用程序不能直接訪(fǎng)問(wèn)。具體來(lái)說(shuō),應用程序不是通過(guò)CreateFile等這些文件系統API接口來(lái)訪(fǎng)問(wèn),而是通過(guò)GDI接口間接訪(fǎng)問(wèn)。對于GDI調用而言,對應的后臺服務(wù)進(jìn)程是GWES.exe,然后GWES.exe再進(jìn)一步調用MDD和PDD函數,即WINCE底層顯示驅動(dòng)。例如如果要畫(huà)一個(gè)矩形,則可以調用SetRect、GetDC和FillRect等函數在圖形界面上面進(jìn)行顯示,而要在圖形界面上輸出一段文字只需調用DrawText函數就可以了,至于顯示驅動(dòng)調用就可以交給GDI就可以了。

  4 結束語(yǔ)

  本文闡述和分析了 顯示硬件原理和 CE驅動(dòng)模型,剖析了顯示驅動(dòng)程序的工作原理和顯示工作流程。本文的創(chuàng )新點(diǎn)在于完整的闡述了WINCE顯示驅動(dòng)程序在上的設計實(shí)現,而以往WINCE 的顯示驅動(dòng)都是LCD,因此本文對編寫(xiě)同類(lèi)驅動(dòng)程序的開(kāi)發(fā)人員將有一定的參考價(jià)值。WINCE啟動(dòng)運行后,圖形界面運行穩定,并可支持 CE下的應用軟件運行,表明驅動(dòng)程序設計良好。


上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>