1.觸控螢幕驅動程式的模型
1.1 分層觸控螢幕驅動層序結構
本觸控螢幕驅動採用層次驅動程式結構,其驅動模型如所示,這種結構將驅動程式代碼區分為上層模型裝置驅動層(MDD),下層是依賴平台的驅動層(PDD)。其中MDD層通常無需修改就可以直接使用,改部分提供面向GWES的DDI的介面,而MDD通過指定的DDSI函數介面調用PDD,這就是我們通常驅動要實現的部分。PDD部分和MDD部分除了DDSI函數集介面外,還要實現一些指定的變數的定義或變數初始化動作(比如,gIntrTouch和gIntrTouchChanged在PDD層定義,但主要在MDD層使用。),也就是說MDD層和PDD層之間並不一定是以嚴格的分層模型來實現的,有時候也要通過共用變數的方式來完成互動。
1.2 DDI函數集(MDD層)
TouchPanelPowerHandler(BOOL boff)
Touch Screen的電源管理函數,boff:TRUE表示關閉電源,FALSE表示開啟電源,其只是調用DdsiTouchPanelPowerHandler()函數,該函數在進入或退出poweroff狀態時產生。
TouchPanelCalibrationAPoint()
該函數用於校準輸入的觸控螢幕座標,把觸控螢幕座標轉換為顯示座標,利用了公式Sx=A1*Tx+B1*Ty+C和Sy=A2*Tx+B2*Ty+C2。
TouchPanelReadCalibrationPoint()
在執行觸控螢幕校準程式時,用這個函數獲得在當前校準點的十字形上點擊的觸控螢幕座標。
TouchPanelReadCalibrationAbord()
該函數在校準取消時被調用(在觸控螢幕校準程式運行過程中取消校準),僅僅設定狀態位和事件後返回。
TouchPanelDisable()
禁用觸控螢幕(touch panel)裝置,該函數關閉ISR,停止中斷和登出事件及其他同步手段,此函數調用了DdsiTouchPanelDisable()函數。
TouchPanelEnable(PFN_TOUCH_PANEL_CALLBACK pfnCallback)
PfnCallback是指向處理touch panel事件的回呼函數,該函數的執行動作:
⑴建立事件hTouchPanelEvent和hCalibrationSampleAvailable,其中當觸筆按下或抬起,或者定時器中斷時會觸發hTouchPanelEvent事件,而在校準狀態下當有校準資料輸入時會觸發hCalibrationSampleAvailable事件。
⑵初始化臨界區,初始化所需的觸控螢幕中斷gIntrTouch和gIntrTouchChanged,並且把它們關聯到事件hTouchPanelEvent中。
⑶建立IST TouchPanelpISR,並設定其優先順序。
TouchPanelSetCalibration()
該函數通過運行觸控螢幕校準程式時的校準動作獲得顯示座標(Sx,Sy)和觸筆在十字形上按下的觸摸座標(Tx,Ty)用於計算校準參數A1,B1,C1和A2,B2,C2。
TouchPanelGetDeviceCaps()
用於查詢觸控螢幕裝置支援的具體功能,通過DDSI函數查詢相應的資訊,當查詢螢幕座標資訊時儲存螢幕資訊,供後面程式計算校準參數所用。
TouchPanelSetMode()
用於設定觸控螢幕的工作模式(採用低採樣率還是高採樣率),當設定IST優先順序時直接通過核心API來完成,而直接將其他設定交給DdsiTouchPanelSetMode()函數來處理。
1.3WinCE DDSI函數集(PDD層)
DdsiTouchPanelGetDeviceCaps(INT iIndex, LPVOID lpOutput)
查詢touch panel裝置的相關資訊。
IIndex:查詢的索引值,其取值如下:
TPDC_SAMPLE_RATE_ID:查詢採樣率資訊。
TPDC_CALIBRATION_POINT_COUNT_ID:查詢用於校正的點的個數。
TPDC_CALIBRATION_POINT_ID:查詢需要校正的點的座標。
LpOutput:根據iIndex值分別指向相關的資訊。
DdsiTouchPanelSetMode()
設定Touch Panel工作模式。
iIndex:模式索引
TPSM_SAMPLERATE_HIGH_ID:高採樣率
TPSM_SAMPLERATE_LOW_ID:低採樣率
lpInput:指向包含相關資訊的記憶體
DdsiTouchPanelEnable()
該函數所執行的動作:
⑴為需要用到的I/O,ADC,PWM和INT寄存器分配記憶體空間。
⑵配置觸控螢幕控制器、中斷控制器和PWM的寄存器。
⑶申請觸控螢幕中斷gIntrTouch和定時器中斷gIntrTouchChanged,並且對它們進行初始化,為物理中斷號分配相應的系統邏輯中斷號。。
DdsiTouchPanelDisable()
屏蔽觸控螢幕中斷和釋放為I/O,ADC,PWM和INT寄存器分配的WinCE記憶體空間。
DdsiTouchPanelAttach()
只是簡單地返回1。
DdsiTouchPanelDetach()
只是簡單地返回0。
DdsiTouchPanelGetPoint (TOUCH_PANEL_SAMPLE_FLAGS * pTipStateFlags,
INT * pUncalX,
INT * pUncalY )
獲得Touch Panel上被按下的點的狀態和座標。
◆pTipState:當前觸摸點的狀態,比如無效點,有效點,被按下的點等。
◆pUnCalX:觸摸點的X座標
◆pUnCalY:觸摸點的Y座標
◆DdsiTouchPanelPowerHandler()
設定touch panel的電源狀態,boff:TRUE表示關閉電源,FALSE表示開啟電源,
2.觸控螢幕驅動程式的實現
WindowsCE5.0觸控螢幕驅動程式採用中斷方式對觸摸筆的按下狀態進行檢測,如果檢測到觸摸筆按下將產生中斷並觸發一個事件通知一個背景工作執行緒開始採集資料。同時,驅動將開啟一個硬體定時器,只要檢測到觸摸筆仍然在按下狀態將定時觸發同一個事件通知背景工作執行緒採集資料,直到觸摸筆抬起後關閉該定時器,並重新檢測按下狀態。驅動中採用了觸控螢幕中斷以及定時器中斷2個中斷源,不僅可以監控觸摸筆按下和抬起狀態,而且可以檢測觸摸筆按下時的拖動軌跡。觸控螢幕驅動流程所示
3.四線電阻式觸控螢幕的工作原理
四線電阻式觸控螢幕的結構1,在玻璃或丙烯酸基板上覆蓋有兩層透平,均勻導電的ITO層,分別做為X電極和Y電極,它們之間由均勻排列的透明格點分開絕緣。其中下層的ITO與玻璃基板附著,上層的ITO附著在PET薄膜上。X電極和Y電極的正負端由“導電條”(圖中黑色條形部分)分別從兩端引出,且X電極和Y電極導電條的位置相互垂直。引出端X-,X+,Y-,Y+一共四條線,這就是四線電阻式觸控螢幕名稱的由來。當有物體接觸觸控螢幕表面並施以一定的壓力時,上層的ITO導電層發生形變與下層ITO發生接觸,該結構可以等效為相應的電路,
計算觸點的X,Y座標分為如下兩步:
1. 計算Y座標,在Y+電極施加驅動電壓Vdrive, Y-電極接地,X+做為引出端測量得到接觸點的電壓,由於ITO層均勻導電,觸點電壓與Vdrive電壓之比等於觸點Y座標與屏高度之比。
2. 計算X座標,在X+電極施加驅動電壓Vdrive, X-電極接地,Y+做為引出端測量得到接觸點的電壓,由於ITO層均勻導電,觸點電壓與Vdrive電壓之比等於觸點X座標與屏寬度之比。
測得的電壓由ADC轉化為觸摸點的原始座標(數值範圍由所選用的A/D轉換器位元決定)後,還要根據具體使用的液晶屏實際像素進行轉換,轉換後通過校準直接轉化為螢幕上的座標,供GWES使用。
4.觸控螢幕的介面部分
◆X+:串連觸控螢幕控制器的TSXP,。
◆X-:串連觸控螢幕控制器的TSXM。
◆Y+:串連觸控螢幕控制器的TSYP。
◆Y-:串連觸控螢幕控制器的TSYM。
在觸控螢幕介面使用時,TSXM或TSYM應該接觸控螢幕介面的。
5.配置控制器硬體
5.1 ADCCON-----ADC控制寄存器
ECFLG:ADCCON[15],AD轉換結束標誌,唯讀,0表示AD轉換在過程中;1表示AD轉換結束。
PRSCEN:ADCCON[14],AD轉換器預分頻器使能,在此使能,故為1。
PRSCVL:ADCCON[13:6],AD轉換器預分頻器值,在此為49。
SEL_MUX:ADCCON[5:3],類比訊號輸入通道選擇,在此選擇XP,故為7。
STDBM:ADCCON[2],備用操作模式選擇,在此選擇普通操作模式,故為0。
READ_START:ADCCON[1],通過讀取來啟動A/D轉換,在此選擇通過讀取操作無效來啟動A/D轉換,故為0。
ENABLE_START,ADCCON[0],通過使能該位來啟動A/D轉換,在此選擇無操作。此位在A/D轉換開始後被使能。
5.2 ADCTSC-----ADC觸控螢幕控制寄存器
UD_SEN:ADCTSC[8],在此選擇檢測到觸筆按下就產生中斷訊號,故為0。
YM_SEN:ADCTSC[7],YM開關使能,在此選擇YM輸出驅動有效(GND),故為1。
YP_SEN:ADCTSC[6],YP開關使能,在此選擇YP輸出驅動無效(AIN5),故為1。
XM_SEN:ADCTSC[5],XM開關使能,在此選擇XM輸出驅動無效(Hi-Z),故為0。
XP_SEN:ADCTSC[4],XP開關使能,在此選擇XP輸出驅動無效(AIN7),故為1。
PULL_UP:ADCTSC[3],上拉開關使能,在此選擇XP上拉有效,故為0。
AUTO_PST:ADCTSC[2],初始化時,在此選擇自動連續測量X座標和Y座標,故為0,但如果開始轉換時,應該置1。
XY_PST:ADCTSC[1:0],手動測量X座標和Y座標,在此選擇等待中斷模式,故為3。
註:當等待觸控螢幕中斷時,XP_SEN位(XP輸出無效)應該置為1,且PULL_UP(XP上拉使能)位應該置為0。
5.3 ADCDLY-----ADC開始延時寄存器
DELAY:ADCDLY[154:0],因為選擇等待中斷模式,此值表示,當觸筆按下出現在睡眠模式時,產生一個用於推出睡眠模式的訊號,有幾個毫秒的時間間隔。在此此值為40000?????????(40s,太長了吧?)
SUBINTMSK-----WinCE中子中斷屏蔽寄存器
該寄存器有11位,每位和一位中斷源相關。觸控螢幕插斷要求有效,故第十位應設為0。
v_pINTregs->INTSUBMSK &= ~(1<<IRQ_SUB_TC);
5.4 TCFG1-----5路多路器及DMA模式選擇寄存器
MUX3:TCFG1[15:12],為PWM計時器3選擇多路輸入,並初始化其值,每個定時器都有一個時鐘分頻器,其可以產生5鐘不同的分頻訊號(1/2,1/4,1/8,1/16和TCLK),在此選擇1/16分頻。
v_pPWMregs->TCFG1 &= ~(0xf << 12); /* Timer3's Divider Value */
v_pPWMregs->TCFG1 |= (3 << 12); /* 1/16
TCNTB3-----PWM定時器3計數緩衝寄存器,選擇定時器3為時鐘,比如定義10ms中斷一次,提供觸控螢幕採樣時間基準,即10ms觸控螢幕採樣一次。在此為17×1000/100=170,在此PCLK=400MHz/6,可以得出timer3的時鐘頻率=PCLK/(244+1).16,可以算數觸控螢幕就是10ms產生一次定時中斷,進行一次採樣。
6.判斷觸控螢幕是否被觸摸和中斷處理
我們採用中斷等待模式,當觸筆按下時,觸控螢幕控制器產生中斷訊號(INT_TC)給中斷控制器,中斷處理常式捕捉到這個物理中斷後,調用登入的ISR來決定如何處理這個硬體中斷。ISR向核心返回對應於這個物理中斷的邏輯中斷號,比如我們用觸筆按下觸控螢幕時,產生INT_TC物理中斷,ISR把物理中斷號映射成邏輯中斷訊號,然後作業系統根據物理中斷號觸發所關聯的WinCE事件核心對象gIntrTouch,從而等待這個事件核心對象的IST(TouchPanelpISR,這個名字不是很合理應該改為TouchPanelpIST)來開始執行中斷處理。
我們在驅動中採用了兩個中斷源,一個是觸控螢幕中斷(包括觸筆按下或抬起中斷,根據ADC觸控螢幕控制寄存器ADCTSC的UD_SEN位來決定,在代碼中的名字是gIntrTouch),也就是說當觸筆按下或抬起時會產生物理中斷INT_TC,其對應的邏輯中斷號為SYSINTR_TOUCH;另一個是定時器中斷(在此採用timer3),只要檢測到觸筆仍然在按下狀態,將定時(在此是10ms,在代碼中的名字是gIntrTouchChanged)產生定時中斷INT_TIMER3,其對應的邏輯中斷號為SYSINTR_TOUCH_CHANGED。這兩個中斷產生時都會觸發同一個事件hTouchPanelEvent,然後等待這個時間的IST(TouchPanelpISR)線程將開始執行。
以下是產生中斷的條件
⑴ 觸筆按下時,產生觸控螢幕中斷。
⑵ 觸筆抬起時,也產生觸控螢幕中斷。
⑶ 觸筆按下產生觸控螢幕中斷的同時,驅動開啟硬體定時器timer3,只要檢測到觸筆仍然在按下狀態,將定時(每隔10ms產生定時器中斷)中斷。
判斷觸筆對於觸控螢幕的活動情況的流程如下:
7. 獲得穩定、防震的位置測量資料
在獲得觸摸點的原始座標(數值範圍由所選用的A/D轉換器位元決定)後,還要根據具體使用的液晶屏實際像素進行轉換,轉換後通過校準直接轉化為螢幕上的座標,以方便圖形介面的後續開發,然後通過回呼函數把螢幕座標和採樣狀態這些參數傳遞給GWES
人機介面中對觸控螢幕的操作有以下3鐘:
⑴ 觸摸筆在觸控螢幕上的位置不變。
⑵ 觸摸筆在觸控螢幕上連續滑過。
⑶ 觸摸筆在觸控螢幕上有大幅度的跳躍。
7.1 觸控螢幕採樣程式
當觸筆按下時,就開始進行觸控螢幕觸摸座標的採樣,同時開啟定時中斷,為10ms後的定時器中斷做好準備。下面是採樣過程:
⑴ 通過對ADC控制寄存器ADCCON和ADC觸控螢幕控制寄存ADCTSC的設定,啟動自動測量X座標和Y座標。
⑵ 等待AD轉換完成,通過對ADCCON的ECFLG的訪問可以判斷AD轉換完成與否。
⑶ AD轉換完成後,就通過對ADC轉換資料寄存器ADCDAT0和ADCDAT1的讀取觸控螢幕座標的Y座標和X座標值。
⑷回到第一步,連續取得5組資料,求和並計算其平均值,如果平均值和這5組資料中最近一次資料的差值大於我們規定的閾值(這個閾值應該需要根據我們採用的LCD屏的解析度來決定)時,認為此次採樣值無效,同時對修改寄存器ADCTSC的設定,讓其處於等待中斷模式,為下次中斷(觸筆抬起中斷做好準備)。
7.2 觸控螢幕濾波程式
通過函數TSP_GetXY()得到觸筆按下位置的觸控螢幕座標後,到把校準後的座標通過回呼函數傳遞給GWES,其中此回呼函數是通過GWES調用TouchPanelEnable(pfnCallback)函數傳遞進來的,這過程有以下步驟:
⑴ 通過函數TSP_GetXY()得到觸筆按下位置的觸控螢幕座標。
⑵ 根據具體使用的液晶屏實際像素對觸控螢幕座標進行轉換,也即通過函數
TSP_TransXY()轉換TSP_GetXY()函數得到的觸控螢幕座標,用到公式
X=W*(x-x1)/(x2-x1),Y=H*(y-y1)/(y2-y1),其中(x1,y1)和(x2,y2)分別表示顯示地區左上方和右上方對應的觸控螢幕的採樣座標,在此顯示屏的解析度為240×320,代碼中(x1,y1)和(x2,y2)值為(85,105)和(965,980),這些值是解析度240×4和320×4後確定的,相應地我們也需要對W和H做處理:W=4*W,H=4*H,(x,y)是觸控螢幕上任意一點的採樣座標(在這裡有一個地方有疑問,右下角座標的x值為什麼是965,它不是大於240×4了嗎?)。
⑶對由⑵得到的座標值進行判斷,如果x座標值大於等於240×4,或者y座標值大於等於320×4(也就是⑵轉換前的x座標值大於等於965,y座標值大於等於980)時,我們認為這次採樣值無效,或者如果最近兩次採樣值的相應的x座標值差額或y座標值差額分別小於等於15和40,則表示觸筆在這兩次採樣的時間內一直在同一個位置,故忽略最近的採樣值;如果如果最近兩次採樣值的相應的x座標值差額或y座標值差額分別大於15和40,則表示觸筆在這兩次採樣的時間內觸筆在滑動,此次採樣有效。
⑷通過TouchPanelCalibrateAPoint()函數把有效觸控螢幕按下點的座標轉換成相應的顯示裝置點座標,用到Sx=A1*Tx+B1*Ty+C和Sy=A2*Tx+B2*Ty+C2這兩個公式,其中A1,B1,C1和A2,B2,C2在執行觸控螢幕校準程式的時候通過TouchPanelSetCalibration()Function Compute出來。
⑸通過⑷轉換得到顯示座標,對這些值進行邊界檢查,如果此x座標值大於等於。
⑹通過TouchPanelEnable(pfnCallback)函數傳遞進來的函數指標進行回調,同時傳遞採樣狀態,校準後得到的顯示座標給GWES。
觸筆按下的觸控螢幕座標經過校準後,通過callbak函數採樣狀態和位置變化資訊通過GWES發送給更高層的圖形軟體。
8.校準觸控螢幕
觸控螢幕的校準過程如下:
⑴ 調用TouchPanelEnable函數來啟動觸控螢幕採樣。
⑵ 調用TouchPanelGetDeviceCaps函數來獲得校準觸點的個數。
⑶ 去校準點,對於每一個校準點都有一下過程:
I:調用TouchPanelGetDeviceCaps函數來得到校準點的座標。
II:在上述校準點處畫十字,等待使用者點擊.
III:使用者點擊十字圖形後,調用TouchPanelReadCalibrationPoint函數來獲得上述校準點處觸控螢幕對應的座標。
⑷ 當取完所需用的校準點,調用TouchPanelSetCalibration函數來計算校準係數A1,B1,C1和A2,B2,C2。
完成上述步驟後,WinCE平台下的觸控螢幕驅動開發就已基本完成,實際操作中還需考慮具體的硬體環境。