Windows CE下觸控螢幕驅動實現的分析

來源:互聯網
上載者:User
文章目錄
  • Windows CE下觸控螢幕驅動實現的分析
Windows CE下觸控螢幕驅動實現的分析

觸控螢幕, Windows, 驅動

本文介紹了Windows CE作業系統的觸控螢幕驅動程式模型,詳細闡述嵌入式系統中電阻式觸控螢幕的Windows CE驅動程式的設計和實現方法。
1. 前言
觸控螢幕是嵌入式裝置中常用的電腦輸入裝置,它可使操作簡單直觀,人人都會使用,這一點無論是鍵盤還是滑鼠都無法與其相比。在手機、PDA等手持產品及公用服務裝置中大量採用觸控螢幕。觸控螢幕分為電阻式、電容式、表面聲波式等多種,電阻式觸控螢幕是目前應用比較廣泛的一種,有四線、五線、七線等幾種。本文將分析Windows CE作業系統下的觸控螢幕驅動程式模型及實現方法。
2. Windows CE觸控螢幕驅動程式模型
在Windows CE作業系統中觸控螢幕驅動是一種分層驅動。其驅動模型1所示。上層是模型裝置驅動程式(Model Device Driver, MDD),下層是依賴平台的驅動程式(Platform. Dependent Driver, PDD)。MDD通常無需修改直接使用,MDD連結PDD層並定義它希望調用的函數介面:裝置驅動程式提供器介面(Device Driver Service Provider Interface, DDSI)。同時MDD把不同的函數集提供給作業系統,這些函數叫做裝置驅動程式介面(Device Driver Interface, DDI),這部分為也就是我們通常驅動需要實現的部分。
3 Windows CE的觸控螢幕驅動程式介面
Windows CE的觸控螢幕驅動連結了tch_cal.lib和tchmdd.lib兩個靜態連結庫。觸控螢幕驅動由GWES載入,GWES通過DDI調用驅動程式擷取裝置狀態,設定驅動功能等,而驅動本身通過DDSI直接獲得硬體資訊來確定當前觸控螢幕的狀態。
Windows CE觸控螢幕驅動要求的DDI介面包括:TouchPanelGetDeviceCaps、TouchPanelEnable、TouchPanelDisable、TouchPanelSetMode、TouchPanelReadCalibrationPoint、TouchPanelReadCalibrationAbort、TouchPanelSetCalibration、TouchPanelCalibrateAPoint、TouchPanelPowerHandler。
Windows CE觸控螢幕驅動要求的DDSI介面包括:DdsiTouchPanelAttach、DdsiTouchPanelDetach、DdsiTouchPanelDisable、DdsiTouchPanelEnable、DdsiTouchPanelGetDeviceCaps、DdsiTouchPanelGetPoint、DdsiTouchPanelPowerHandler。
4 Windows CE的觸控螢幕資料擷取
Windows CE觸控螢幕驅動程式採用中斷方式對觸摸筆的按下狀態進行檢測,如果檢測到觸摸筆按下將產生中斷並觸發一個事件通知一個背景工作執行緒開始採集資料。同時,驅動將開啟一個硬體定時器,只要檢測到觸摸筆仍然在按下狀態將定時觸發同一個事件通知背景工作執行緒採集資料,直到觸摸筆抬起後關閉該定時器,並重新檢測按下狀態。驅動中採用了觸控螢幕中斷以及定時器中斷兩個中斷源,不僅可以監控觸摸筆按下和抬起狀態,而且可以檢測觸摸筆按下時的拖動軌跡。
觸控螢幕驅動在初始化程序呼叫TouchPanelEnable函數使能觸控螢幕。該函數調用的DDSI函數為:DdsiTouchPanelEnable和DdsiTouchPanelDisable。該函數實現如下 內容:
1) 建立事件hTouchPanelEvent和hCalibrationSampleAvailable。hTouchPanelEvent事件在正常狀態下當有觸摸筆按下或者按下後需要定時採集資料時被觸發。而hCalibrationSampleAvailable事件在校準狀態下當有校準資料輸入時被觸發;
2) 檢查並初始化所需的中斷gIntrTouch(觸控螢幕中斷)和gIntrTouchChanged(定時器中斷),並將中斷gIntrTouch、gIntrTouchChanged關聯到事件hTouchPanelEvent。當gIntrTouch,gIntrTouchChanged中斷產生時將觸發hTouchPanelEvent事件;
3) 建立一個ISR線程TouchPanelpISR。TouchPanelpISR用於等待和處理觸控螢幕事件hTouchPanelEvent,它是整個驅動程式中唯一的事件來源。
TouchPanelpISR函數是實現觸控螢幕資料擷取關鍵函數,它實現的內容為:
1) 等待迴圈,用於接收hTouchPanelEvent事件,並構成函數的主體;
2) 通過調用DdsiTouchPanelGetPoint函數擷取當前觸控螢幕位置和狀態資訊;
3) 在擷取有效資料且在校準狀態下,收集並提交按下的位置資訊;
4) 在正常狀態下,校準資料,並檢查校準後資料的有效性;
5) 最後調用由GWES傳入的回呼函數,提交位置資訊和狀態資訊。
因此,在觸控螢幕驅動程式中DdsiTouchPanelEnable、DdsiTouchPanelDisable和DdsiTouchPanelGetPoint三個DDSI介面函數是驅動實現的關鍵所在。
在DdsiTouchPanelEnable和DdsiTouchPanelDisable函數中分別開啟和關閉觸控螢幕硬體,這兩個函數其實可以不真正操作硬體,而只是實現軟體上的控制,但是為了降低功耗最好在DdsiTouchPanelDisable中將觸控螢幕控制器電源關閉並在DdsiTouchPanelEnable函數中開啟。
在DdsiTouchPanelGetPoint函數中實現對觸控螢幕資料的採樣。從上面的分析得知MDD通過檢測hTouchPanelEvent和hCalibrationSampleAvailable事件控制採樣,這兩個事件被觸發都將調用該函數。而這兩個事件觸發條件有兩個:
1) 觸摸筆按下時產生觸控螢幕中斷gIntrTouch時觸發;
2) 觸摸筆按下後,定時器被開啟,定時器將定時產生中斷gIntrTouchChanged,並觸發事件,直到觸摸筆抬起為止。
因此該函數不僅需要對觸控螢幕資料採樣,而且需要對觸發條件進行狀態控制,其流程2所示。圖中定義了三個變數,它們分別為:
1) TouchIrq為靜態變數或全域變數,且初始值為TRUE,該變數必須在觸控螢幕按下併產生觸控螢幕中斷時設定為FALSE;
2) InterruptType為靜態變數或全域變數,且初始值為SYSINTR_NOP,當在處理觸控螢幕中斷時設定為SYSINTR_TOUCH,在處理定時器中斷時設定為SYSINTR_TOUCH_CHANGED,其餘設定為SYSINTR_NOP,且在處理完畢後必須將其作為參數傳入InterruptDone函數以清除中斷;
3) g_NextExpectedInterrupt為靜態變數或全域變數,該變數表示下一個希望產生的中斷,初始狀態為PEN_DOWN,也就是觸摸筆在抬起狀態,因此希望下一個產生的中斷為PEN_DOWN。當觸控螢幕中斷產生以及定時器中斷產生時該變數為PEN_UP_OR_TIMER,也就是下一個可能產生的狀態為觸摸筆抬起狀態或者觸摸筆按下但定時器中斷產生。
DdsiTouchPanelGetPoint函數一開始從觸摸筆抬起狀態開始執行,此時TouchIrq等於TRUE。如果此時觸摸筆按下,將設定TouchIrq為FALSE,表示本次採樣是由於觸控螢幕中斷產生並設定下一次調用由定時器產生。然後設定InterruptType狀態為SYSINTR_TOUCH,接著開始採集資料並設定g_NextExpectedInterrupt變數為PEN_UP_OR_TIMER,表示下一次產生的中斷為定時器中斷。接著判斷在觸摸筆按下狀態(g_NextExpectedInterrupt等於PEN_UP_OR_TIMER)下觸摸筆是否抬起,如果抬起則設定g_NextExpectedInterrupt為PEN_DOWN恢複到抬起狀態。最後通過將InterruptType作為參數傳入InterruptDone函數以清除中斷。當觸摸筆按下,併產生定時器中斷時,TouchIrq等於FALSE,此時InterruptType被設定為SYSINTR_TOUCH_CHANGED,其餘的動作基本和上面的流程一致。
5 Windows CE下的觸控螢幕校準
電阻觸控螢幕需要校準。應用程式需要一些參考值,以便將接收到的觸控螢幕座標資料轉換成高層軟體所需的螢幕座標。理想情況下校準程式只要在產品初次加電測試過程中運行一次就可以了,參考值被儲存在非易失性儲存空間中。在理想情況下只需兩組未經處理資料,即在螢幕對角讀取的最小和最大值。而在實際應用中,因為許多電阻觸控螢幕存在顯著的非線性,因此如果在最小和最大值之間簡單的插入位置數值會導致驅動程式非常的不精確。
在Windows CE中通過在函數DdsiTouchPanelGetDeviceCaps 中設定校準點的個數,在TouchDriverCalibrationPointGet中擷取每個校準點的螢幕座標。常用的校準點數量為5。校準UI將在校準點座標處相應顯示一個十字叉,使用者需要精確地在該十字叉位置按下觸控螢幕,驅動通過TouchPanelReadCalibrationPoint函數讀取相應的觸控螢幕座標值,然後開始下一個校準點。迴圈設定的次數後,將採集到的觸控螢幕座標值和校準點螢幕座標送到TouchPanelSetCalibration函數中進行處理。該函數將產生校準基準參數。
TouchPanelSetCalibration函數執行的動作是一套數學演算法,具體內容為:
在觸控螢幕資料與其位置位移關係且螢幕像素與其位置位移關係同為線性關係假設情況下,觸控螢幕返回的位置資訊與像素位置資訊之間成2D座標變換關係。則對於觸控螢幕按下點的觸控螢幕座標(Tx,Ty)與其在顯示裝置位置關係上匹配的點的螢幕座標(Sx,Sy)之間的轉換關係,可以通過下述座標變換表示:
Sx = A1*Tx + B1*Ty + C1
Sy = A2*Tx + B2*Ty + C2
TouchPanelSetCalibration的具體工作就是通過校準的動作擷取的螢幕座標和觸控螢幕座標TouchCoordinate來確定A1,B1,C1和A2, B2, C2。
6. 結束語
本文作者的創新點:從分析嵌入式Windows CE作業系統中觸控螢幕驅動程式的模型及實現方法的角度深入剖析了Windows CE中觸控螢幕資料擷取和校準的執行流程,對於類似系統的驅動開發具有一定的借鑒性。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.