WinCE中觸摸屏驅動開發詳解
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.觸摸屏驅動程序的實現
Windows CE5.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產生一次定時中斷,進行一次采樣。#p#
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()函數計算出來。
⑸通過⑷轉換得到顯示坐標,對這些值進行邊界檢查,如果此x坐標值大于等于。
⑹通過TouchPanelEnable(pfnCallback)函數傳遞進來的函數指針進行回調,同時傳遞采樣狀態,校準后得到的顯示坐標給GWES。
觸筆按下的觸摸屏坐標經過校準后,通過callbak函數采樣狀態和位置變化信息通過GWES發送給更高層的圖形軟件。
8.校準觸摸屏
觸摸屏的校準過程如下:
⑴ 調用TouchPanelEnable函數來啟動觸摸屏采樣。
⑵ 調用TouchPanelGetDeviceCaps函數來獲得校準觸點的個數。
⑶ 去校準點,對于每一個校準點都有一下過程:
I:調用TouchPanelGetDeviceCaps函數來得到校準點的坐標。
II:在上述校準點處畫十字,等待用戶點擊.
III:用戶點擊十字圖形后,調用TouchPanelReadCalibrationPoint函數來獲得上述校準點處觸摸屏對應的坐標。
⑷ 當取完所需用的校準點,調用TouchPanelSetCalibration函數來計算校準系數A1,B1,C1和A2,B2,C2。
完成上述步驟后,WinCE平臺下的觸摸屏驅動開發就已基本完成,實際操作中還需考慮具體的硬件環境。
【編輯推薦】