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產生一次定時中斷,進行一次采樣