技術(shù)干貨:WinCE 7.0下的觸摸屏驅動(dòng)
在嵌入式系統中較為常用的是四線(xiàn)電阻式觸摸屏,通過(guò)檢測x軸和y軸的電壓,來(lái)確定觸點(diǎn)的位置。一般觸摸屏系統結構為:觸摸屏->觸摸屏控制器->處理器。
本文引用地址:http://dyxdggzs.com/article/201710/366958.htmwince7下觸摸屏的驅動(dòng)分為PDD層(位于bsp目錄中)和MDD層(位于public目錄中)。PDD層和MDD層通過(guò)DDSI接口函數連接,MDD層和上層通過(guò)DDI函數連接。其中MDD層一般無(wú)需修改,我們只需修改PDD層的代碼。
比如我的bsp目錄下觸摸屏驅動(dòng)中的touchscreenpdd.cpp文件中主要有如下函數:
TchPdd_Init()
TchPdd_Ioctl()
PDDTouchIST()
PDDInitializeHardware()
PDDTouchPanelEnable()
PDDTouchPanelGetPoint()
PDDCalibrationThread()
PDDStartCalibrationThread()
PDDDeInitailzeHardware()
PDDTouchPanelDisable()
其中TchPdd開(kāi)頭的函數就是DDSI函數,PDD開(kāi)頭的函數就是PDD層的函數。MDD層會(huì )最先調用TchPdd_Init()函數,該函數會(huì )將DDSI函數以函數指針的形式傳遞給MDD層,并調用PDD層的函數進(jìn)行必要的初始化,如調用PDDInitializeHardware()來(lái)初始化SPI,GPIO(我的觸摸屏控制器使用SPI接口),調用PDDTouchPanelEnable()來(lái)創(chuàng )建“觸摸屏事件”,創(chuàng )建IST線(xiàn)程等。
IST線(xiàn)程函數PDDTouchIST()中會(huì )有一個(gè)while循環(huán),如下圖所示:
循環(huán)中有一個(gè)WaitForSingleObject(,)函數。該函數有兩個(gè)參數,第一個(gè)參數是“觸摸屏事件”的句柄,第二個(gè)參數用來(lái)設置等待超時(shí)的時(shí)間。 IST線(xiàn)程執行到這個(gè)函數會(huì )等待“觸摸屏事件”發(fā)生或者超時(shí)。當這兩種情況之一發(fā)生后,線(xiàn)程就會(huì )往下執行,并調用 PDDTouchPanelGetPoint()函數來(lái)讀取觸點(diǎn)坐標。在“觸摸屏事件”發(fā)生之前,超時(shí)時(shí)間會(huì )設置為無(wú)限等待。只有當“觸摸屏事件”發(fā)生后(觸點(diǎn)按下)才會(huì )開(kāi)始讀坐標,并判斷是否還是按下?tīng)顟B(tài),如果還是按下?tīng)顟B(tài),那么就會(huì )設置超時(shí)時(shí)間為某一個(gè)有限值,這樣當 WaitForSingleObject等待時(shí)間超過(guò)這個(gè)值后又會(huì )去讀取坐標。這種機制就能保證我們能讀取到觸點(diǎn)移動(dòng)的軌跡。
當然要想使用“觸摸屏事件”,必須要有一個(gè)觸摸屏的中斷(當觸點(diǎn)按下,這個(gè)中斷發(fā)生),并將這個(gè)中斷和“觸摸屏事件”關(guān)聯(lián)起來(lái),這樣中斷發(fā)生后,才會(huì )觸發(fā)“觸摸屏事件”。
還有一種方法:不使用中斷,直接采用輪詢(xún)方式來(lái)讀取坐標,通過(guò)讀取坐標值的合法性來(lái)決定是否有觸點(diǎn)按下。這種方式下,WaitForSingleObject的第一個(gè)參數就不起作用,且第二個(gè)參數必須設為一個(gè)有限值,這個(gè)值就決定來(lái)輪詢(xún)的頻率。
評論