WINCE 觸摸屏驅動簡介

WinCE中的Touch Panel驅動是由GWES模塊來管理的,Touch Panel驅動接收用戶的觸摸信息,並將其轉換爲屏幕上的座標信息,傳給GWES模塊。在WinCE中,Touch Panel驅動是分層的,分爲MDD層和PDD層,這和其他WinCE設備驅動是一樣的。MDD層由微軟提供,用戶只需要實現MDD和PDD層間的 DDSI函數就可以了。如圖

       WinCE中的GWES模塊負責加載和管理Touch Panel驅動,Touch Panel的MDD層向上提供DDI接口,PDD層是針對硬件的實現,對MDD層提供DDSI接口。

 

1 Touch Panel驅動中的數據結構

(1) TOUCH_PANEL_SAMPLE_FLAGS

用於描述一個採樣點的信息,這些信息被定義在一個枚舉結構中:

               enum enumTouchPanelSampleFlags {

                 TouchSampleValidFlag = 0x01,

                 TouchSampleDownFlag = 0x02,

                 TouchSampleIsCalibratedFlag = 0x04,

                 TouchSamplePreviousDownFlag = 0x08,

                 TouchSampleIgnore = 0x10,

                 TouchSampleMouse = 0x40000000

               };

               TouchSampleValidFlag:一個有效的採樣值

               TouchSampleDownFlag:第一次按觸摸屏時,返回該flag

               TouchSampleIsCalibratedFlag:採樣的x和y座標值不需要再被校驗了

               TouchSamplePreviousDownFlag:表示上一次採樣狀態是按在觸摸屏上

               TouchSampleIgnore:忽略這次採樣值

               TouchSampleMouse:預留

 

(2) TPDC_CALIBRATION_POINT

用於描述一個校驗點的相關信息,結構如下:

               struct TPDC_CALIBRATION_POINT {

                 INT PointNumber;

                 INT cDisplayWidth;

                 INT cDisplayHeight;

                 INT CalibrationX;

                 INT CalibrationY;

               };

               PointNumber:校驗點索引值,用於描述校驗點在LCD上的位置

                                                0:中間

                                                1:左上

                                                2:左下

                                                3:右下

                                                4:右上

               cDisplayWidth:顯示的寬度

               cDisplayHeight:顯示的高度

               CalibrationX:校驗點的x座標值

               CalibrationY:校驗點的y座標值

 

(3) TPDC_CALIBRATION_POINT_COUNT

用於描述需要校驗的點的個數,結構如下:

               struct TPDC_CALIBRATION_POINT_COUNT {

                  DDI_TOUCH_PANEL_CALIBRATION_FLAGS flags;

                  INT cCalibrationPoints;

               };

               flags:一般爲0

               cCalibrationPoints:需要校驗的點的個數,一般是5

 

(4) gIntrTouch和gIntrTouchChanged

這是兩個被MDD層用到的中斷,需要在PDD層中定義,如下:

                        DWORD gIntrTouch        = SYSINTR_NOP;

DWORD gIntrTouchChanged = SYSINTR_NOP;

gIntrTouch用於描述觸摸屏中斷,要和硬件的觸摸屏中斷相關聯。

gIntrTouchChanged用於在觸摸屏按下後,每隔一段時間進行一次採樣,應該和硬件的一個定時器中斷相關聯。

這兩個值應該在DdsiTouchPanelEnable(..)函數中和硬件中斷關聯,並在函數DdsiTouchPanelGetPoint(..)中根據情況清除相應的中斷。

 

2 MDD層API

        MDD爲上層導出所需的Touch Panel驅動接口函數,上層通過這些函數可以完成對Touch Panel的操作,下面會介紹這些函數的功能。

(1) BOOL TouchPanelEnable(PFN_TOUCH_PANEL_CALLBACK pfnCallback):

使能Touch Panel設備,用於初始化Touch Panel。

       pfnCallback:指向處理Touch Panel事件的回調函數

 

(2) Void TouchPanelDisable(void):

禁用Touch Panel設備。

 

(3) BOOL TouchPanelGetDeviceCaps(INT iIndex, LPVOID lpOutput ):

獲得Touch Panel設備的相關信息。

       iIndex:索引值

                        TPDC_SAMPLE_RATE_ID:採樣率信息

                        TPDC_CALIBRATION_POINT_COUNT_ID:採樣點個數信息

                        TPDC_CALIBRATION_POINT_ID:採樣點座標信息

            lpOutput:指向一個內存區域,用於存放獲得的相關信息

 

(4) VOID TouchPanelCalibrateAPoint(INT32 UncalX, INT32 UncalY, INT32* pCalX, INT32* pCalY):

將輸入的未經過校驗的座標信息轉換成校驗後的座標信息。

       UncalX:輸入的X座標

               UncalY:輸入的Y座標

       pCalX:校驗後的X座標

       pCalY: 校驗後的Y座標

 

(5) VOID TouchPanelPowerHandler(BOOL bOff):

Touch Panel的電源控制函數。

       bOff:TRUE表示關閉電源,FALSE表示打開電源

 

(6) BOOL TouchPanelReadCalibrationPoint(INT* pRawX, INT* pRawY):

獲得Touch Panel的座標。

       pRawX:觸摸屏的X座標

       PRawY:觸摸屏的Y座標

 

(7) VOID TouchPanelReadCalibrationAbort(void):

終止當前的校驗。

 

(8) VOID TouchPanelSetCalibration(INT32 cCalibrationPoints, INT32* pScreenXBuffer, INT32* pScreenYBuffer, INT32* pUncalXBuffer, INT32* pUncalYBuffer):

校驗函數。通過一組實際的觸摸屏上採集的點座標和相應的屏幕座標計算校驗係數。具體公式如下:

        Sx =  A1*Tx + B1*Ty + C1

      Sy =  A2*Tx + B2*Ty + C2

   這裏就是通過顯示屏座標和採樣的觸摸屏座標計算A1,B1,C1,A2,B2,C2。

       cCalibrationPoints:校驗點的個數

       pScreenXBuffer:一組顯示屏上的X座標

               pScreenYBuffer:一組顯示屏上的Y座標

               pUncalXBuffer:一組觸摸屏上採樣的X座標

               pUncalYBuffer:一組觸摸屏上採樣的Y座標

 

(9) BOOL TouchPanelSetMode(INT iIndex, LPVOID lpInput):

設置Touch Panel的工作模式。

               iIndex:索引模式

                                    TPSM_SAMPLERATE_HIGH:設置高採樣率

                                    TPSM_SAMPLERATE_LOW:設置低採樣率

                                    TPSM_PRIORITY_HIGH_ID:設置觸摸屏的IST爲高優先級

                                    TPSM_PRIORITY_NORMAL_ID:設置IST爲正常優先級

               lpInput:指向一塊內存,其中包含相關信息。

 

3 PDD層API

(1) LONG DdsiTouchPanelAttach(void):

該函數在Touch Panel驅動的Dll被加載的時候調用

 

(2) LONG DdsiTouchPanelDettach(void):

該函數在Touch Panel驅動的Dll被卸載的時候調用

 

(3) BOOL DdsiTouchPanelEnable(void):

打開Touch Panel電源並做初始化。一般會在這裏初始化一些信息,打開Touch Panel設備電源並做初始化。

 

(4) VOID DdsiTouchPanelDisable(void):

關閉Touch Panel設備。關閉Touch Panel電源並釋放資源。

 

(5) BOOL DdsiTouchPanelGetDeviceCaps(ULONG iIndex, LPVOID lpOutput):

查詢Touch Panel設備的相關信息

               iIndex:查詢的索引值

                   TPDC_SAMPLE_RATE_ID:查詢採樣率信息

                   TPDC_CALIBRATION_POINT_ID:查詢需要校驗的點的座標

                   TPDC_CALIBRATION_POINT_COUNT_ID:查詢用於校驗的點的個數

          lpOutput:根據iIndex值分別指向相關的信息

 

(6) void DdsiTouchPanelGetPoint(TOUCH_PANEL_SAMPLE_FLAGS pTipState, PLONG pUnCalX, PLONG pUnCalY):

獲得Touch Panel上被按下的點的狀態和座標。

               pTipState:當前觸摸點的狀態,比如無效點,有效點,被按下的點等。

               pUnCalX:觸摸點的X座標

               pUnCalY:觸摸點的Y座標

 

(7) VOID DdsiTouchPanelPowerHandler(BOOL bOff):

設置Touch Panel的電源狀態。

               bOff:TRUE表示關閉電源,FALSE表示打開電源

 

(8) BOOL DdsiTouchPanelSetMode(ULONG iIndex, LPVOID lpInput):

設置Touch Panel工作模式。

               iIndex:模式索引

                        TPSM_SAMPLERATE_HIGH_ID:高採樣率

                        TPSM_SAMPLERATE_LOW_ID:低採樣率

               lpInput:指向包含相關信息的內存

 

4 註冊表設置

對於Touch Panel驅動來說,有些註冊表項是需要配置的。具體如下:

“InputConfig”:WinCE系統輸入配置。

Bit0表示鍵盤輸入

Bit1表示Touch Panel輸入

                                    Bit2表示硬件按鍵輸入

“DeviceName”:Touch Panel驅動的名字。

“MaxCalError”:Touch Panel的精確度配置。

“CalibrationData”:Touch Panel的校驗值。第一次啓動WinCE後,需要通過WinCE的觸摸屏校驗程序對Touch Panel進行校驗。校驗完成後,校驗值會被寫入註冊表裏面。

 

下面是關於Touch Panel的註冊表配置的例子:

[HKEY_LOCAL_MACHINE\ControlPanel]

                "InputConfig"=dword:3    ;3 => keybd and touch screen

[HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\TOUCH]

                "DriverName"="touch.dll"

                "MaxCalError"=dword:8

                "CalibrationData"="446,671 36,191 38,1179 856,1161 862,169 "

 

個人覺得,要想更好的理解Touch Panel驅動,還是需要去讀讀代碼,基於WinCE6.0下,可以參考"\WINCE600\PLATFORM\H4SAMPLE\SRC\DRIVERS\TOUCH"下面的驅動,基於這個驅動開發自己的驅動會比較方便。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章