嵌入式Linux系統中觸控螢幕驅動的研究

來源:互聯網
上載者:User
摘要:基於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作業系統下觸控螢幕驅動程式的開發過程,改進了處理採樣資料的方法,最後改進了常用的校準方法。使該觸 摸屏驅動更能滿足實際的要求,該觸控螢幕驅動程式已用於實際的嵌入式產品中,運行穩定可靠,具有很好的發展前景和社會經濟效益。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.