基于μClinux的觸摸屏軟硬件關(guān)鍵技術(shù)分析
驅(qū)動程序的中斷處理函數(shù)
當(dāng)筆中斷發(fā)生,程序進(jìn)入中斷處理函數(shù)。在中斷處理函數(shù)中,將完成對兩個中斷進(jìn)行處理,分別是外部的觸摸中斷(筆中斷)和SPI數(shù)據(jù)轉(zhuǎn)換中斷。與這兩個中斷對應(yīng)的中斷處理函數(shù),是觸摸屏軟件設(shè)計的關(guān)鍵所在。
驅(qū)動程序在中斷處理函數(shù)中使用定時器處理時間相關(guān)操作。定義函數(shù)set_timer_irq(),如下:
staticvoidset_timer_irq(structtimer_list*timer,intdelay){
del_timer(timer);
timer->expires=jiffies+delay;
add_timer(timer);
}
jiffies是一個表征系統(tǒng)自從啟動以來到當(dāng)前為止所運行時鐘數(shù)的變量,delay是設(shè)定的延長時間(用時鐘數(shù)作為計數(shù)單位)。一旦時鐘數(shù)超過設(shè)定值,則觸發(fā)超時函數(shù),在本程序中是handle_timeout( )。引入定時器的目的有兩個:一是可以較為精確地控制系統(tǒng)由于消除電平升降造成信號抖動所需要時間,二是能夠有效控制采樣坐標(biāo)的數(shù)量,而不必引入占用大量系統(tǒng)資源的簡單延時函數(shù)。使用SPI中斷而產(chǎn)生大量坐標(biāo)數(shù)據(jù)這一問題在文獻(xiàn)中沒有很好的解決辦法,只是簡單地降低SPI時鐘頻率以取較少的數(shù)據(jù)量。本設(shè)計中引入定時器,可以很好地解決上述問題。
在handle_timeout()函數(shù)中,程序利用條件選擇語句,對觸摸屏狀態(tài)值(ts_drv_state)進(jìn)行判斷,如果是非Error狀態(tài),則使能SPI,進(jìn)入handle_spi_irq(),與ADS7843進(jìn)行數(shù)據(jù)通訊。在handle_spi_irq()中,程序利用條件選擇語句,根據(jù)觸摸屏狀態(tài)值(ts_drv_state)來進(jìn)行數(shù)據(jù)轉(zhuǎn)換操作,通過向觸摸屏控制芯片發(fā)送前文中提到的控制字,來得到X和Y方向的坐標(biāo)。具體邏輯可參見程序流程圖。一旦一次轉(zhuǎn)換完成,程序?qū)⒏鶕?jù)點擊狀態(tài)信息(state_counter)來鑒別點擊的性質(zhì),在cause_event()函數(shù)中,分別對點擊和移動做出了判斷。判定方法較為簡單,只需將前后兩次采樣坐標(biāo)之差與移動閾值比較即可得出結(jié)論。此外,還區(qū)分了信號誤差和由于筆移動造成的坐標(biāo)改變,判別閾值可以由用戶自己設(shè)定。
I/O控制
對于硬件各個參數(shù),包括采樣時間、消除抖動開關(guān)、消除抖動時間,都可以通過I/O控制函數(shù)ioctl()在用戶程序里進(jìn)行設(shè)定,避免每次都直接改變驅(qū)動程序,并重新編譯內(nèi)核所帶來的時間開銷。本程序中對I/O控制函數(shù)的定義是:staticintts_ioctl(structinode*inode,structfile*file,unsignedintcmd,unsignedlongarg);其中,參數(shù)cmd有兩個值,分別為:TS_PARAMS_GET和TS_PARAMS_SET,它們用來指出是獲取參數(shù)還是設(shè)定參數(shù)。用戶在調(diào)用這個函數(shù)的時候,只需要對這個參數(shù)按照事先約定的格式賦值,就可以方便地獲取或者改變觸摸屏當(dāng)前參數(shù),arg是指向所傳遞參數(shù)的指針。
結(jié)論
在獲得觸摸點的原始坐標(biāo)(數(shù)值范圍由所選用的A/D轉(zhuǎn)換器位數(shù)決定)后,還要根據(jù)具體使用的液晶屏實際像素進(jìn)行轉(zhuǎn)換,以方便圖形界面的后續(xù)開發(fā)。考慮到相鄰兩次的移動閾值,按照如下公式對觸摸屏坐標(biāo)進(jìn)行計算:
其中XV為觸摸點X坐標(biāo)顯示值,XW為觸摸點X坐標(biāo)測量值(原始坐標(biāo)值),(1)、(2)、(3)式在觸摸屏初始化時得到,方法是任取觸摸屏X方向左側(cè)和右側(cè)各一點,以X△V=X△W=1,Xoffrer=0為初始值進(jìn)行測量得到新的3個參數(shù):X△V、X△W和Xoffrer(在實際使用中此項工作屬于校準(zhǔn)零點偏移),然后這3個參數(shù)就不再變動,對于每次測量到的任意觸摸點原始坐標(biāo)XW,直接代入(4)式求出觸摸點的像素顯示坐標(biāo)XV。 其中,XV1為觸摸屏左側(cè)點坐標(biāo)顯示值;XV2為觸摸屏右側(cè)點坐標(biāo)顯示值;XW1為觸摸屏左側(cè)點坐標(biāo)測量值;XW2為觸摸屏右側(cè)點坐標(biāo)測量值。
本設(shè)計使用MicroWindows作為用戶界面,定制出每個桌面圖標(biāo)的坐標(biāo)區(qū)域,結(jié)合觸摸屏的采樣坐標(biāo),判斷是否在圖標(biāo)區(qū)域坐標(biāo)內(nèi),然后做出相應(yīng)的事件處理。對于本設(shè)計中使用的開發(fā)平臺,液晶屏是320240點陣的,物理尺寸為: 80mm60mm,ADS7843選擇12位轉(zhuǎn)換精度,觸摸屏理論分辨率為80/212=0.020mm,但是由于電平干擾和觸摸動作發(fā)生時的物理干擾,實際的精度無法達(dá)到這個值。經(jīng)過測試,在我們平臺上對同一點的點擊精度可以達(dá)到1.0mm。本驅(qū)動程序可以有效地區(qū)分點擊和移動信號,如果配合手寫識別軟件,能夠作為手寫板的底層驅(qū)動使用,實現(xiàn)手寫輸入。
評論