觸摸屏驅動開發

說明:本文來自網絡,但是沒有署名作者,所以我也不知道是誰的,如果原作者看到,請通知我,我會給標明作者

觸摸屏驅動開發

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.3 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寄存器分配的內存空間。

 

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發生接觸,該結構可以等效爲相應的電路,如下圖2:

圖1

圖2

圖3

計算觸點的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-----子中斷屏蔽寄存器

該寄存器有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把物理中斷號映射成邏輯中斷信號,然後操作系統根據物理中斷號觸發所關聯的事件內核對象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。

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/gooogleman/archive/2009/03/14/3990238.aspx

發佈了18 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章