在嵌入式系統中較為常用的是四線電阻式觸控螢幕,通過檢測x軸和y軸的電壓,來確定觸點的位置。一般觸控螢幕系統結構為:觸控螢幕->觸控螢幕控制器->處理器。
wince7下觸控螢幕的驅動分為pdd層(位於bsp目錄中)和mdd層(位於public目錄中)。pdd層和mdd層通過ddsi介面函式連線,mdd層和上層通過ddi函式連線。其中mdd層一般無需修改,我們只需修改pdd層的**。
比如我的bsp目錄下觸控螢幕驅動中的touchscreenpdd.cpp檔案中主要有如下函式:
tchpdd_init()
tchpdd_ioctl()
pddtouchist()
pddinitializehardware()
pddtouchpanelenable()
pddtouchpanelgetpoint()
pddcalibrationthread()
pddstartcalibrationthread()
pdddeinitailzehardware()
pddtouchpaneldisable()
其中tchpdd開頭的函式就是ddsi函式,pdd開頭的函式就是pdd層的函式。mdd層會最先呼叫tchpdd_init()函式,該函式會將ddsi函式以函式指標的形式傳遞給mdd層,並呼叫pdd層的函式進行必要的初始化,如呼叫pddinitializehardware()來初始化spi,gpio(我的觸控螢幕控制器使用spi介面),呼叫pddtouchpanelenable()來建立「觸控螢幕事件」,建立ist執行緒等。
ist執行緒函式pddtouchist()中會有乙個while迴圈,如下圖所示:
迴圈中有乙個waitforsingleobject(,)函式。該函式有兩個引數,第乙個引數是「觸控螢幕事件」的控制代碼,第二個引數用來設定等待超時的時間。ist執行緒執行到這個函式會等待「觸控螢幕事件」發生或者超時。當這兩種情況之一發生後,執行緒就會往下執行,並呼叫pddtouchpanelgetpoint()函式來讀取觸點座標。在「觸控螢幕事件」發生之前,超時時間會設定為無限等待。只有當「觸控螢幕事件」發生後(觸點按下)才會開始讀座標,並判斷是否還是按下狀態,如果還是按下狀態,那麼就會設定超時時間為某乙個有限值,這樣當waitforsingleobject等待時間超過這個值後又會去讀取座標。這種機制就能保證我們能讀取到觸點移動的軌跡。
當然要想使用「觸控螢幕事件」,必須要有乙個觸控螢幕的中斷(當觸點按下,這個中斷發生),並將這個中斷和「觸控螢幕事件」關聯起來,這樣中斷發生後,才會觸發「觸控螢幕事件」。
還有一種方法:不使用中斷,直接採用輪詢方式來讀取座標,通過讀取座標值的合法性來決定是否有觸點按下。這種方式下,waitforsingleobject的第乙個引數就不起作用,且第二個引數必須設為乙個有限值,這個值就決定來輪詢的頻率。
wince7 螢幕控制 wince7下的觸控螢幕驅動
在嵌入式系統中較為常用的是四線電阻式觸控螢幕,通過檢測x軸和y軸的電壓,來確定觸點的位置。一般觸控螢幕系統結構為 觸控螢幕 觸控螢幕控制器 處理器。wince7下觸控螢幕的驅動分為pdd層 位於bsp目錄中 和mdd層 位於public目錄中 pdd層和mdd層通過ddsi介面函式連線,mdd層和上...
觸控螢幕驅動
輸入子系統體系 核心層 linux dir drivers input input.c 提供最核心函式 裝置事件層 linux dir drivers input evdev.c 提供handler 提供輸入裝置產生的原始資料並上報給應用程式,這適用於 所有輸入裝置,該觸控螢幕也不例外 編寫基於輸入...
wince觸控螢幕介面定製
將calibrui 資料夾下 postlink.dat 檔案dir ad b projectoakroot files intltrns obj tgtcpu wincedebug clone locales.txt 改為 dir ad b publicroot common oak lib tgt...