日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WINCE6.0显示驱动模型介绍

發布時間:2025/4/16 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WINCE6.0显示驱动模型介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

********************************LoongEmbedded*****************
作者:LoongEmbedded(kandi)
時間:2011.06.4

類別:WINCE驅動開發
********************************LoongEmbedded*****************

?

關鍵字

DDGPEDD是指DirectDrawGraphics Primitive Engine (GPE)

GDIGraphics Device Interface

DDIDisplay Device Interface

?

WinCE6.0中,Display驅動由GWES模塊來管理(GWES.dll)WinCE提供了兩種架構的Display驅動模型,可以滿足不同的硬件需求。一種是基于WinCE DDIDisplay驅動模型,另一種是基于DirectDrawDisplay驅動模型。

?

1.??? WINCE6.0顯示驅動模型

1

1.1? DDI顯示驅動模型

2

本文是基于DDI的模型來學習的,但此6410DBSP是基于基類DDGPE來實現對目標硬件的控制的。

?

1.2? DDRAW顯示驅動模型

3

?

DirectDraw提供了獨立于硬件的直接訪問顯示設備的能力。它可以通過直接訪問硬件抽象層(HAL)中的一些函數來達到直接操作顯示設備的目的,在這個過程中,不再需要圖形設備接口(GDI)的轉換。這種直接的方法可以使圖像更加連貫,也提高了顯示的性能。為了實現這樣的功能,需要在顯示驅動上擴展能夠直接訪問相關硬件的函數。這些函數會被DirectDraw模塊調用,并形成DirectDraw的硬件抽象層(DDHAL)。

?

DirectDraw的真正實現代碼都駐在gwes.dll模塊中,應用程序只是連接了一個小的客戶端,被稱為DDRAW.dll代理,該代理主要負責用戶進程與系統之間的遠程DirectDraw COM接口連接。這樣,用戶請求會被傳送到內核的GWES模塊中。針對DirectDrawWinCE提供了一個名為DirectDrawGPE庫(DDGPE),它是從GPE類上面繼承而來的。實際上,DirectDraw顯示驅動是由DDGPEDDHAL組成,而DDGPE中已經包含了DDHAL的功能。用戶需要從DDGPE類繼承并實現相關函數即可。GWES.dll模塊中包含GDIDDRAW兩個組件,這兩個組件會調用驅動中的DDGPE的相關接口完成對硬件的操作。

?

在上述兩種架構中,用戶可以根據自己的硬件情況選擇相應的架構。第一種架構是基于GPE類繼承來實現的,第二種架構是基于DDGPE類繼承來實現的,而第二種架構的DDGPE類又是從第一種架構的GPE類繼承而來。關于兩種類的具體定義,可參見” /WINCE600/PUBLIC/COMMON/OAK/INC”路徑下的gpe.hddgpe.h文件。

?

2.??? 顯示驅動的文件結構

4

我們先來看看DISPLAY_DRV目錄下的sources文件的下面部分:

5

從圖3可知s3c6410_disp.dll要調用這兩個dll提供的函數接口來實現自己的功能。接下來看看VIDEO_DRV目錄下的sources文件的下面部分:

6

從圖3可知s3c6410_Video.dll要調用這些lib提供的函數接口來實現自己的功能。為了搞清楚s3c6410_disp.dlls3c6410_Video.dll之間的關系,我們看DISPLAY_DRV目錄下的display_main.cpp(也就是s3c6410_disp.cpp)下的函數調用:S3C6410Disp::S3C6410Disp()->S3C6410Disp::AllocResource(),就來看此函數的相關部分:

7

從圖5可以知道s3c6410_Video.dll還是為s3c6410_disp.dll提供服務的。總結這些dlllib之間的關系如下面的邏輯框圖所示:

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.dllGDI的一些回調函數來簡化自己的實現。見圖3可知GDIGWES的組成部分,它主要負責畫簡單的直線、矩形、圓等幾何圖像及實現矩形塊傳輸和畫線的硬件加速。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.dllGDI獲取到DDI函數指針后,應用程序就可以通過GDI來調用DDI函數來對顯示設備進行操作了。

?

?

3.2.2 HALInit函數

HAL單元的導出函數是HALInit函數,根據圖1可知HAL單元及WINCE自帶的以軟件模擬的方式提供對DirectDraw功能支持的HEL單元為DirectDraw服務。GDIDirectDraw都是WINCEGWES.dll的組成部分,后者可以畫復雜的二維圖案和更高級的硬件加速。

?

該函數沒有直接被顯示驅動調用,而是在顯示驅動初始化階段和模式切換階段被DirectDraw內部調用,該函數負責構造一個為DirectDraw提供功能支持信息的DDHALINFO結構體。

14

因為顯示驅動中使用DDGPE模型,所以HALInit函數就已經作為DDGPE的一部分被寫入到DirectDraw,我們只需要在顯示驅動中導出這個函數就可以了。

4.??? ?

?

?

總結

以上是生活随笔為你收集整理的WINCE6.0显示驱动模型介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。