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