WinCE驅動之Touch Panel(概述)

來源:互聯網
上載者:User

      隨著Iphone的流行,觸控螢幕成為許多移動電子產品的標配,使到觸控螢幕驅動的開發在嵌入式裝置中也變得越來越重要了。嵌入式行動裝置因其體積小的特點決定了需要一種最為便利的輸入工具。利用觸控螢幕使用者可以很方便的對嵌入式行動裝置進行相應的操作,而且操作簡單直觀,是極方便的人機互動裝置。

 

 

 

1.WinCE驅動程式模型分類

      WinCE系統在驅動設計上有一個很方便的功能,就是原始裝置製造商(OEMs)和獨立硬體開發商(IHVs)可以自主開發裝置驅動程式來支援他們的硬體。因此,在動手進行觸控螢幕驅動程式開發之前,深入瞭解WinCE系統驅動方式是非常有必要的。


(1)從驅動載入方式上的分類

 

      要編寫WinCE驅動程式首先要確定它是屬於哪類驅動。一般來說,WinCE平台上使用的裝置可分為兩類:內建裝置和可安裝裝置。因此,從驅動載入方式上WinCE可分為內建裝置驅動(Built-In Driver)和可載入驅動(Loadable Driver)

WinCE系統可直接使用內建裝置,因為內建裝置驅動程式是與WinCE的核心組件緊密相連的,也就是內建裝置驅動程式是被靜態地連結到GWES(Graphics Windowing and EventsSubsystem)的。這些驅動對應的裝置通常在系統啟動時,在GWES的進程空間內被載入,主要是與顯示和輸入有關的驅動。

 

      因為它們不是以獨立的DLL形式存在,所以要求每一個內建驅動程式都必須與裝置驅動程式介面(DDI)的特定介面保持一致。內建裝置包括顯示、觸控螢幕、音頻、串列埠、LED、電池和PC卡插座等。內建驅動程式一般設計為動態連結程式庫,但有兩個例外:電池和LED驅動程式由於小而設計為靜態庫。它們一般儲存在ROM或快閃記憶體內。

 

     可載入裝置是指可與平台串連和分離的第三方介面裝置,可由使用者隨時安裝和卸載。這種外圍裝置的驅動也被稱為流驅動,這些驅動可以在系統啟動時、或者啟動後的任何時候由裝置管理員動態載入。通常這類驅動是以DLL動態連結程式庫的形式存在,載入後的這些驅動程式也只能以使用者態的角色運行。在WinCE中典型的可載入驅動有:PCMCIA driver(PCMCIA.dll)、Serial driver(SERIAL.dll)、ATAFLASHdriver(ATA.dll)、Ethernet driver(NE2000.dll,SMSC100FD.dll)。

 

    與內建驅動程式不同的是,所有可載入流驅動程式都共用一個公用介面,而且功能也與應用程式所用的檔案API中的功能匹配。因此,控制可載入裝置的流介面驅動程式一般由應用程式存取。也就是說,流介面驅動程式是由一個特殊檔案來將裝置功能展現給應用程式的,該檔案可被開啟、讀取、寫入和關閉。通常只有OEMs才會對內建裝置驅動程式進行修改,其它自由裝置生產商由於只提供附加的硬體裝置,對內建裝置驅動程式不會有過多涉及。

 

 

(2)從驅動程式層次上分類

 

     WinCE最大的好處是具有可定製性,當它內建的驅動程式不能滿足使用者的要求時,使用者可以自己編寫相應的驅動程式。因此按照結構分,WinCE驅動程式又可分為分層的驅動程式和不分層的驅動程式。分層的驅動程式由兩個設定好的層組成:上層是模型裝置驅動程式(Model Device Driver,MDD),下層是依賴平台的驅動程式(Platform Dependent Driver, PDD)

 

     分層的驅動程式中的MDD通常是無需修改可直接使用,MDD的作用是連結PDD層並定義它希望調用的函數介面:裝置驅動程式提供器介面(DeviceDriver Service Provider Interface,DDSI)。同時MDD又把不同的函數集提供給WinCE核心,這些函數叫做裝置驅動程式介面(Device Driver Interface,DDI)。不分層的驅動程式是把PDD與MDD寫在一起,沒有做嚴格的區分,通常這種驅動比較簡單,比如ATADISK。簡單的說,內建驅動和載入式流驅動是從驅動與系統其它模組(調用者)的介面形式上做的分類;而不分層和分層是從驅動實現方式上的分類。

 

     在開發過程中,MDD層驅動是不需要被修改的。但和MDD層驅動不同的是,PDD層驅動必須被修改成和特定硬體相匹配的代碼。程式員可以自己開發一個PDD程式,但多數情況下建議開發人員在Platform Builder提供的範例驅動程式上進行修改。在Win CE系統中觸控螢幕驅動是一種分層驅動。

 

 

 

 

2.觸控螢幕驅動程式的設計和實現

    嵌入式裝置觸控螢幕按其技術原理可分為五類:向量壓力感測式、電阻式、電容式、紅外線式和表面聲波式。其中電阻式觸控螢幕在嵌入式系統中用的較多,電阻式觸控螢幕可分為四線、五線、七線等幾種。一般來說,WinCE觸控螢幕驅動的設計和實現有以下幾個步驟:

 

(1)配置和初始化觸控螢幕

 

    觸控螢幕驅動在初始化過程會調用TouchPanelEnable函數,該函數調用的DDSI函數為DdsiTouchPanelEnable和DdsiTouchPanelDisable。這兩個DDSI介面函數是驅動實現的關鍵所在,分別用於開啟和關閉觸控螢幕硬體。但是為了降低功耗,這兩個函數其實可以不真正操作硬體,而只是實現軟體上的控制。

 

    同時,在初始化時還需要進行這幾個配置和初始化:一是建立事件hTouchPanelEvent和hCalibrationSampleAvailable,前者是在正常狀態下當有觸摸筆按下或者按下後需要定時採集資料時被觸發;而後者是在校準狀態下當有校準資料輸入時被觸發。二是檢查初始化所需的中斷gIntrTouch(觸控螢幕中斷)和gIntrTouchChanged(定時器中斷),並將這兩個中斷關聯到事件hTouchPanelEvent。三是建立一個ISR線程TouchPanelpISR,用於等待和處理觸控螢幕事件hTouchPanelEvent,它也是整個驅動程式中唯一的事件來源。

 

 

(2)校準觸控螢幕基準參數

 

    完成前面繁瑣的工作後,驅動程式的各種功能就都已經準備就緒了,現在就可以實際操作觸控螢幕幕了。但一般來說,電阻式觸控螢幕需要校準,也就是說在驅動啟動過程中MDD層要調用相應的DDSI函數來讀取註冊表中的校正資料校正觸控螢幕。理想情況下,校準程式只要在嵌入式裝置初次加電測試過程中運行一次就可以了,參考值會被儲存在非易失性儲存空間中,以免讓使用者在以後的加電啟動期間再做校準。不過,高品質的觸控螢幕驅動程式是應該要向使用者提供一種進入校準常式的途徑,從而在由於溫度漂移或其它因素造成校準不準確時進行重新校準。

 

    在理想情況下,校正觸控螢幕基準只需兩組未經處理資料,即在螢幕對角讀取的最小和最大值。但在實際應用中,因為許多電阻式觸控螢幕存在明顯的非線性,如果只在最小和最大值之間簡單的插入位置數值會導致驅動程式非常的不精確。因此,在WinCE中需要擷取多個校準點,常用的校準點數量為5個。

 

    方法是:

    ①首先驅動程式在函數DdsiTouchPanelGetDeviceCaps中設定校準點的個數;

    ②是系統在TouchDriverCalibrationPointGet中擷取每個校準點的螢幕座標;

    ③是在螢幕介面的校準點座標處顯示一個位置符號,使用者需要精確地在位置符號按下觸控螢幕;

    ④驅動程式通過TouchPanelReadCalibrationPoint函數讀取相應的觸控螢幕座標值;

    ⑤然後再開始下一個校準點,直到迴圈設定的次數後將採集到的觸控螢幕座標值和校準點螢幕座標送到TouchPanelSetCalibration函數中進行處理,該函數將產生校準基準參數。校準完成之後,觸控螢幕便可以開始正常的操作了。

 

 

(3)判斷螢幕是否被觸摸

 

    一旦完成了觸控螢幕硬體設定、初始化和基準參數校準後,接下來就需要用一種可靠的方法來判斷螢幕是否被觸摸了。WinCE提供了螢幕是否被觸摸的檢測機制,而且當觸摸事件發生時還可選擇是否中斷主處理器。判斷螢幕是否被觸摸的驅動程式的函數名叫WaitForTouchState()。當螢幕被初次觸摸時喚醒主機的中斷,稱為PEN_DOWN中斷。這樣做可以讓驅動程式在螢幕沒有被觸摸時中斷自己的執行,而不消耗任何CPU資源,而一旦使用者觸控螢幕幕,驅動程式就被喚醒並進入轉換模式。

 

    當被喚醒後就有一組模數資料等待轉換併產生中斷訊號。中斷是硬體與軟體打交道的重要方法,所以大多數驅動程式都涉及到中斷處理。就中斷處理而言,WinCE採用了一種獨特的方法。它將中斷處理分為兩步:插斷服務常式(ISR)和中斷服務線程(IST)。具體來講就是把每個硬體的裝置插斷要求(IRQ) 和一個ISR 聯絡起來,當一個中斷髮生並未被屏蔽時,核心調用該中斷註冊的ISR。因為ISR運行於核心模式,所以應該被設計得儘可能的短,ISR 的基本職責是引導核心調度和啟動合適的IST。IST在裝置驅動程式軟體模組中編寫,它從硬體擷取或向硬體發送資料和控制碼,並進一步處理裝置中斷。

 

  WinCE觸控螢幕驅動程式是採用中斷方式對觸摸筆的按下狀態進行檢測,當檢測到觸摸筆按下時產生的中斷,就會觸發一個事件通知一個背景工作執行緒開始採集資料。同時,驅動將開啟一個硬體定時器,只要檢測到觸摸筆仍然在按下狀態,將定時觸發同一個事件通知這個背景工作執行緒繼續採集資料,直到觸摸筆抬起後關閉該定時器。簡單的說,就是驅動程式會同時採用觸控螢幕中斷和定時器中斷這兩個中斷源。目的在於不僅可以監控觸摸筆按下和抬起狀態,而且可以檢測觸摸筆按下時的拖動軌跡。觸控螢幕中斷的兩個邏輯中斷分別是:SYSINTR_TOUCH是用於觸摸筆點擊觸控螢幕時產生相應的中斷;SYSINTR_TOUCH_CHANGE則用於觸摸筆離開時產生相應的中斷。

 

 

(4)獲得穩定的、防震的測量資料

 

    在進行觸控螢幕程式開發時,一定要注意原始的觸摸測量資料經常會有一些雜訊和偏差,這是正常的。一般來說,只有使用者緊緊壓住電阻觸控螢幕才能得到兩個連續的讀數,然而我們會發現當觸控筆或手指按上或離開觸控螢幕時,讀數的變化要比保持穩定壓力時大得多。這是因為使用者是以機械的方式連通二個平面電阻-觸摸層,當使用者按壓和釋放觸控螢幕時,在很短的一段時間內觸控螢幕的電氣串連均處於臨界狀態。這時,我們需要丟棄這些讀數直到系統穩定下來,否則提交的觸摸位置讀數會產生大幅跳躍,導致嚴重的失真或觸摸位置漂移。

 

    這時就需要進行折衷考慮,這也是觸控螢幕驅動設計的關鍵所在。如果我們要求較窄的穩定視窗,那麼驅動程式將無法跟蹤快速的“拖曳”操作;如果加寬穩定視窗,就可能面臨著許多風險,這些風險包括接收到不精確的觸摸資料,或上面描述處於臨界狀態的層串連結果。這時,就需要通過實驗來確定適合系統的最佳值。

 

    在正常情況下,當螢幕被觸摸時驅動程式應會得到每個穩定的讀數,並利用簡單的線性插值法將未經處理資料轉換成像素座標。讀取觸摸點的座標是由DdsiTouchPanalGetPoint()函數實現的。另外,在每個轉換過程的前後,驅動程式必須檢查並確認螢幕仍處於被觸摸狀態。因為我們不希望採集到實際上是處於“開路狀態”的穩定讀數。因此,在讀取觸摸資料時,我們需要對未經處理資料進行防震處理,然後確定螢幕被觸摸時是否有穩定的讀數;如果不穩定就要繼續讀取資料並進行防震處理,直到得到穩定的資料為止。

 

    最後,觸控螢幕驅動程式應將觸摸狀態和位置變化資訊發送給更高層的應用軟體,以完成一次完整的觸摸操作。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.