摘要:基於Linux作業系統具有良好的開放性和較強的可移植性,在當前嵌入式作業系統中被廣泛採用。本文首先基於Samsung公司的 S3C2410處理器構建硬體環境;然後深入探討嵌入式Linux作業系統下的觸控螢幕驅動程式的開發;之後講述觸控螢幕採樣資料處理的方法;最後詳細的闡明 觸控螢幕的校準原理。
關鍵詞:Linux 驅動程式 採樣處理 校準
引言
隨著電腦相關技術的發展,嵌入式系統的應用越來越廣泛,與人們生活緊密結合。觸控螢幕裝置因其友善的人機互動性,操作方便靈活,輸入速度快,被廣泛的應用於嵌入式領域中。嵌入式Linux系統具有開發原始碼、核心穩定、可裁減性等特點,吸引著眾多商業公司和自由軟體開發人員的目光,成為嵌入式系統領 域不可或缺的作業系統之一。觸控螢幕是一種輸入裝置,操作簡單易學,不佔額外的空間,可靠性高,是最常用的攜帶型系統的輸入裝置。特別是電阻式觸控螢幕結構簡 單,成本低,透光效果好,工作環境和外界完全隔離,不怕灰塵和水氣,同時具有高解析度,高速傳輸反應,一次校正,穩定性高,不漂移等特點,因而廣泛用於工 業控制領域及在室內使用。
1 硬體平台
S3C2410是Samsung公司基於ARM 920T核心的一款MCU,整合了眾多的外圍裝置,其中包括4線電阻式觸控螢幕控制器、8路類比輸入通道。在8路A/D轉換通道中,A[5]和A[7]作為 觸控螢幕的X、Y座標的採集通道。S3C2410與4線電阻式觸控螢幕串連的電路原理圖見圖1。
在採樣過程中,只需要通過讀寫一系列的特殊寄存器,S3C2410的觸控螢幕控制器就會自動控制觸控螢幕介面開啟或關閉各MOS管,按順序完成觸控螢幕X、Y座標資料的採集。
圖1 S3C2410串連4線電阻式觸控螢幕電路原理圖
2 Linux裝置驅動程式簡介
裝置驅動程式是作業系統核心和機器硬體之間的介面,由一組函數和一些私人資料群組成,是應用程式和硬體裝置之間的橋樑。在應用程式看來,硬體裝置只是 一個裝置檔案,應用程式可以像操作普通檔案一樣對硬體裝置進行操作。裝置驅動程式是核心的一部分,主要完成以下功能:對裝置的初始化和釋放;把資料從核心 傳送到硬體裝置和從硬體裝置讀取資料;讀取應用程式資料傳送給裝置檔案和回送應用程式請求的資料;檢測和處理硬體裝置出現的錯誤。
Linux作業系統的裝置有字元裝置、塊裝置和網路裝置等。字元裝置是以單個位元組為單位進行順序讀寫操作,通常不使用緩衝技術,例如滑鼠、鍵盤等。塊裝置的讀寫都使用緩衝技術來支援,並且必須能夠進行隨機存取,主要是針對磁碟等慢速裝置設計的。網路裝置主要基於BSD的Socket機制,為發送資料和接收資料提供緩衝技術,提供對多協議的支援,例如乙太網路卡等。
3 Linux觸控螢幕驅動程式實現
在Linux系統中,裝置驅動程式是一組相關函數的集合。它包括裝置服務子程式和中斷處理常式。裝置服務子程式包含了所有與裝置相關的代碼,每個設 備服務子程式只處理一種裝置或者緊密相關的裝置,從裝置無關的軟體中接受抽象的命令並執行。當執行一條請求時,具體操作是根據控制器對驅動程式提供的接 口,並利用中斷機制去調用中斷服務子程式配合裝置完成這個請求。裝置驅動程式利用結構file_operations與檔案系統聯絡起來,裝置的各種操作 的入口函數放在結構file_operations中,其中包括open()、release()、read()和write()等介面,簡化了驅動程式 的編寫工作。這樣,應用程式根本不必考慮操作的是裝置還是普通檔案,可一律看作檔案處理,具有非常清晰統一的I/O介面。觸控螢幕的 file_operations結構定義如下:
static struct file_operations s3c2410_ts_fops = {
owner: THIS_MODULE,
read: s3c2410_ts_read,
poll: s3c2410_ts_poll,
ioctl: s3c2410_ts_ioctl,
open: s3c2410_ts_open,
release: s3c2410_ts_release,
fasync: s3c2410_ts_fasync,};
在觸控螢幕裝置驅動程式的開發中,全域變數struct s3c2410_ts_device global_ts是很重要的,用來儲存觸控螢幕的相關參數、等待處理的訊息佇列、當前採樣資料、上一次採樣資料等資訊,資料結構struct s3c2410_ts_device的定義如下:
struct s3c2410_ts_device { //管理觸控螢幕類
struct s3c2410_ts_general d; //觸控螢幕設定參數
struct s3c2410_ts_calibration cal; //校正觸控螢幕參數
struct s3c2410_ts_event buf[MOUSEBUF_SIZE]; //等待處理緩衝隊列
struct s3c2410_ts_event cur_data, samples[3],last_data; };
//當前採樣資料,採樣未經處理資料,上次採樣資料
在瞭解上面概念之後,編寫觸控螢幕驅動的實際工作並不複雜,需要做如下工作:
3.1模組初始化函數
是調用s3c2410_touchscreen_moudle_init()來實現的,主要完成觸控螢幕裝置的核心模組載入、初始化、中斷註冊、裝置註冊等工作,主要涉及到的過程如下:
ADCTSC=(0<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(3);
//觸控螢幕ADCTSC的設定
ADCDLY=ADC_DELAY_TIME; //觸控螢幕開始和間隔延時
ADCCON = (1<<14)|( PreScale_n<<6)|(7<<3)|(0<<2)|(0<<1)|(0);
//觸控螢幕控制器設定
request_irq(IRQ_ADC_DONE,ts_down_interrupt,SA_INTERRUPT,g_ts_id,ts_down_interrupt); //申請IRQ_ADC_DONE中斷
request_irq(IRQ_TC,ts_up_interrupt,SA_INTERRUPT,g_ts_id,ts_up_interrupt);
//申請IRQ_TC中斷
devfs_register_chrdev(0,S3C2410_TS_MODULE_NAME,&s3c2410_ts_fops);
//註冊file_operations結構
request_irq(IRQ_TIMER1,touch_timer_irq,SA_INTERRUPT,g_ts_timer_id,NULL); //申請IRQ_TIMER1中斷
touch_timer_irq(int irq, void *dev_id, struct pt_regs *regs)
//根據狀態調用觸摸中斷,控制資料採樣
初始化模組利用核心提供的request_irq函數,將觸摸筆的按下與彈起的中斷號進行登記,從而將中斷號與中斷服務函數聯絡起來;利用 devfs_register_chrdev函數,向系統註冊一個字元型裝置;最後註冊定時器中斷,用來控制觸控螢幕的資料採樣。
3.2 設定觸摸筆的狀態及對應的處理
觸控螢幕的中斷服務函數ts_down_interrupt和ts_up_interrupt是根據ADCDAT1和ADCDAT0的設定來選擇觸摸筆的狀態,之後調用觸控螢幕座標的資料採樣處理函數s3c2410_ts_handler()進行處理。部分代碼如下:
static void ts_down_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
if ( (ADCDAT1&0x8000)|| (ADCDAT0&0x8000) ) {
pen_data.state = PEN_UP;
}
else {
pen_data.state = PEN_DOWN;
}
s3c2410_ts_handler();}
3.3 獲得採樣值
觸摸筆具有三種工作狀態:PEN_UP,PEN_DOWN,PEN_SAMPLE。在採樣處理函數中,依據觸摸筆的狀態,調用 ts_timer_operation()來啟動或停止採樣定時器,然後調用s3c2410_ts_handler()根據不同的狀態進行不同的設定和處 理,之後得到不同的採樣值。
3.4 對得到的觸控螢幕的資料進行處理
是調用data_processing()函數來實現的。根據採用下面介紹的中值濾波法來對採樣資料進行處理。針對座標點採樣過程中產生的雜訊,一 般是採用平均法來去除雜訊,但是這種方法對於採樣數較少,並且個別雜訊採樣點比較大的時候,取平均值會使最後的結果誤差較大,達不到資料處理的要求。故本 文採用中值濾波法濾除幹擾雜訊,進一步地提高採樣精度。
中值濾波法的原理如下:首先取奇數個觸摸採樣資料;之後根據採樣資料的大小按照從小到大的順序進行排列;最後取中間位置的值。此種方法一般在採樣點不多,個別採樣資料誤差又較大的情況下,可以有效地減少誤差。具體的過程見圖2。
3.5觸控螢幕的校準
在實際的應用中,通常觸控螢幕是作為與顯示屏配合使用的輸入裝置,需要從觸控螢幕採樣得到的座標與螢幕的顯示座標做一個映射。觸控螢幕和顯示屏都是標準的矩形,見3所示。觸控螢幕的X方向座標只與顯示屏的X方向有關,Y方向只與顯示屏的Y方向相關。
假設顯示屏的解析度是W×H,顯示地區的左上方對應的觸控螢幕採樣座標是(x1,y1),右下角對應的座標是(x2,y2),那麼觸控螢幕上的任意一點採用座標(x,y)與顯示屏座標(xd,yd)的對應關係可按照如下公式計算:
根據上述的公式計算出實際觸控螢幕對應的顯示座標,之後就是一個觸控螢幕的校準過程,本文採用三點校準的方法,與兩點校準相比,三點校準的模型考慮到變相和旋轉,更接近實際情況。首先選取3個相距較遠的3個作為校準輸入的採樣點,它們相應的觸控螢幕採樣座標是P0(x0,y0)、P1(x1,y1)、P2(x2,y2),顯示座標是PD0(xD0,yD0)、PD1(xD1,yD1)、PD2(xD2,yD2)。直角座標平面的兩個點P和PD,定義P為觸控螢幕空間的座標點, PD為顯示屏空間的座標點,P可以經過旋轉、比例和平移得到PD座標。化簡得:
通過上式可以說明PD和P點之間存在一次線性關係滿足:xD=Ax+By+C yD=Dx+Ey+F
對於同一個裝置,其中的A、B、C、D、E、F為常數,稱為校準常數,故只需在觸控螢幕校準時,解出這6個常數,就可以實現觸控螢幕空間到顯示空間的轉換。
3.6 中斷的釋放和註冊模組的卸載
是調用s3c2410_ts_cleanup_module()來實現的,分別釋放在初始化過程中,申請的IRQ_TIMER1、IRQ_ADC_DONE、IRQ_TC的中斷和字元裝置的介面函數devfs_register_chrdev(),具體如下:
free_irq(IRQ_TIMER1,g_ts_id);
free_irq(IRQ_ADC_DONE,g_ts_id);
free_irq(IRQ_TC,g_ts_timer_id);
devfs_unregister_chrdev(gMajor, H3600_TS_MODULE_NAME); //卸載字元裝置
4 結束語
本文作者創新點: 結合實際的硬體平台,詳細地介紹基於嵌入式Linux作業系統下觸控螢幕驅動程式的開發過程,改進了處理採樣資料的方法,最後改進了常用的校準方法。使該觸 摸屏驅動更能滿足實際的要求,該觸控螢幕驅動程式已用於實際的嵌入式產品中,運行穩定可靠,具有很好的發展前景和社會經濟效益。