WINCE6.0显示驱动模型介绍
********************************LoongEmbedded*****************
作者:LoongEmbedded(kandi)
時間:2011.06.4
類別:WINCE驅動開發
********************************LoongEmbedded*****************
?
關鍵字
DDGPE的DD是指DirectDraw,Graphics Primitive Engine (GPE)
GDI:Graphics Device Interface
DDI:Display Device Interface
?
在WinCE6.0中,Display驅動由GWES模塊來管理(GWES.dll)。WinCE提供了兩種架構的Display驅動模型,可以滿足不同的硬件需求。一種是基于WinCE DDI的Display驅動模型,另一種是基于DirectDraw的Display驅動模型。
?
1.??? WINCE6.0顯示驅動模型
圖1
1.1? DDI顯示驅動模型
圖2
本文是基于DDI的模型來學習的,但此6410D的BSP是基于基類DDGPE來實現對目標硬件的控制的。
?
1.2? DDRAW顯示驅動模型
圖3
?
DirectDraw提供了獨立于硬件的直接訪問顯示設備的能力。它可以通過直接訪問硬件抽象層(HAL)中的一些函數來達到直接操作顯示設備的目的,在這個過程中,不再需要圖形設備接口(GDI)的轉換。這種直接的方法可以使圖像更加連貫,也提高了顯示的性能。為了實現這樣的功能,需要在顯示驅動上擴展能夠直接訪問相關硬件的函數。這些函數會被DirectDraw模塊調用,并形成DirectDraw的硬件抽象層(DDHAL)。
?
DirectDraw的真正實現代碼都駐在gwes.dll模塊中,應用程序只是連接了一個小的客戶端,被稱為DDRAW.dll代理,該代理主要負責用戶進程與系統之間的遠程DirectDraw COM接口連接。這樣,用戶請求會被傳送到內核的GWES模塊中。針對DirectDraw,WinCE提供了一個名為DirectDraw的GPE庫(DDGPE),它是從GPE類上面繼承而來的。實際上,DirectDraw顯示驅動是由DDGPE和DDHAL組成,而DDGPE中已經包含了DDHAL的功能。用戶需要從DDGPE類繼承并實現相關函數即可。GWES.dll模塊中包含GDI和DDRAW兩個組件,這兩個組件會調用驅動中的DDGPE的相關接口完成對硬件的操作。
?
在上述兩種架構中,用戶可以根據自己的硬件情況選擇相應的架構。第一種架構是基于GPE類繼承來實現的,第二種架構是基于DDGPE類繼承來實現的,而第二種架構的DDGPE類又是從第一種架構的GPE類繼承而來。關于兩種類的具體定義,可參見” /WINCE600/PUBLIC/COMMON/OAK/INC”路徑下的gpe.h和ddgpe.h文件。
?
2.??? 顯示驅動的文件結構
圖4
我們先來看看DISPLAY_DRV目錄下的sources文件的下面部分:
圖5
從圖3可知s3c6410_disp.dll要調用這兩個dll提供的函數接口來實現自己的功能。接下來看看VIDEO_DRV目錄下的sources文件的下面部分:
圖6
從圖3可知s3c6410_Video.dll要調用這些lib提供的函數接口來實現自己的功能。為了搞清楚s3c6410_disp.dll和s3c6410_Video.dll之間的關系,我們看DISPLAY_DRV目錄下的display_main.cpp(也就是s3c6410_disp.cpp)下的函數調用:S3C6410Disp::S3C6410Disp()->S3C6410Disp::AllocResource(),就來看此函數的相關部分:
圖7
從圖5可以知道s3c6410_Video.dll還是為s3c6410_disp.dll提供服務的。總結這些dll和lib之間的關系如下面的邏輯框圖所示:
圖8
?
?
3.??? 顯示驅動的具體實現
3.1顯示驅動的加載
在GWES.dl被加載后,在加載驅動的過程中,GWES將根據注冊表鍵HKEY_LOCAL_MACHINE/System/GDI/DisplayCandidates下面的項來找顯示驅動,如果找到,則正常加載顯示驅動,見platform.reg中相關部分:
圖9
根據圖9的注冊表信息,GWES找到s3c6410_disp.dll并且加載,并且把s3c6410_disp.dll作為一項寫到HKEY_LOCAL_MACHINE/System/GDI/Drivers鍵下面:
“MainDisplay”=“s3c6410_disp.dl”
?
3.2 s3c6410_disp.dll的導出函數
WINCE系統的設備驅動程序要實現自身的功能,不外乎導出函數和啟動IST這兩種辦法來實現,而顯示設備指示向顯示屏輸出顯示的數據,不處理異步的輸入數據,所以顯示驅動不需要啟動IST線程來實現,那么顯示驅動就只能是以導出函數的方式來實現了,其導出文件的內容如下:
LIBRARY DDI
?
EXPORTS
??? DrvEnableDriver
HALInit
?
3.2.1 DrvEnableDriver函數
DrvEnableDriver函數向GWES.dll返回DDI函數指針并且借用GWES.dll的GDI的一些回調函數來簡化自己的實現。見圖3可知GDI是GWES的組成部分,它主要負責畫簡單的直線、矩形、圓等幾何圖像及實現矩形塊傳輸和畫線的硬件加速。DrvEnableDriver函數導出是DDI函數指針在/PUBLIC/COMMON/OAK/INC/Winddi.h中定義,如下所示:
圖10
那么DDI上面的函數指針是如何徹底給GDI呢?GWES加載顯示驅動的時候,會調用DrvEnableDriver函數,下面來看其函數體:
圖11
DrvEnableDriver函數只是直接將4個參數傳遞給GPEEnableDriver函數處理,下面來學習者幾個參數:
engineVersion:輸入參數,是DDI的版本號,GWES提供的參數值為DDI_DRIVER_VERSION =0x00040001。
Cj:輸入參數,DRVENABLEDATA結構體的大小,以字節為單位,指示輸出參數指針pded所指向存儲區域的大小。
Pded:輸出參數,指向包含著DDI函數指針的DRVENABLEDATA結構體的數據。
engineCallbacks:輸入參數,GWES使用PENGCALLBACKS結構體類型指針數據向顯示驅動傳遞可用的GDI回調函數以便于幫助用戶實現DDI函數。
?
接著看GPEEnableDriver()的實現,在PUBLIC/COMMON/OAK/DRIVERS/DISPLAY/GPE/ddi_if.cpp下定義:
圖12
DRVENABLEDATA 結構體在/PUBLIC/COMMON/OAK/INC/Winddi.h中定義:
圖13
GWES.dll的GDI獲取到DDI函數指針后,應用程序就可以通過GDI來調用DDI函數來對顯示設備進行操作了。
?
?
3.2.2 HALInit函數
HAL單元的導出函數是HALInit函數,根據圖1可知HAL單元及WINCE自帶的以軟件模擬的方式提供對DirectDraw功能支持的HEL單元為DirectDraw服務。GDI和DirectDraw都是WINCE的GWES.dll的組成部分,后者可以畫復雜的二維圖案和更高級的硬件加速。
?
該函數沒有直接被顯示驅動調用,而是在顯示驅動初始化階段和模式切換階段被DirectDraw內部調用,該函數負責構造一個為DirectDraw提供功能支持信息的DDHALINFO結構體。
圖14
因為顯示驅動中使用DDGPE模型,所以HALInit函數就已經作為DDGPE的一部分被寫入到DirectDraw,我們只需要在顯示驅動中導出這個函數就可以了。
4.??? ?
?
?
總結
以上是生活随笔為你收集整理的WINCE6.0显示驱动模型介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WINCE6.0添加微软简体中文输入法3
- 下一篇: 6410调试LCD屏AT050TN22遇