天天看點

[轉]嵌入式Linux系統中觸摸屏驅動的研究

    摘要:基于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坐标資料的采集。

[轉]嵌入式Linux系統中觸摸屏驅動的研究

圖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。

[轉]嵌入式Linux系統中觸摸屏驅動的研究

    3.5觸摸屏的校準

    在實際的應用中,通常觸摸屏是作為與顯示屏配合使用的輸入裝置,需要從觸摸屏采樣得到的坐标與螢幕的顯示坐标做一個映射。觸摸屏和顯示屏都是标準的矩形,見3所示。觸摸屏的X方向坐标隻與顯示屏的X方向有關,Y方向隻與顯示屏的Y方向相關。

    假設顯示屏的分辨率是W×H,顯示區域的左上角對應的觸摸屏采樣坐标是(x1,y1),右下角對應的坐标是(x2,y2),那麼觸摸屏上的任意一點采用坐标(x,y)與顯示屏坐标(xd,yd)的對應關系可按照如下公式計算:

[轉]嵌入式Linux系統中觸摸屏驅動的研究

    根據上述的公式計算出實際觸摸屏對應的顯示坐标,之後就是一個觸摸屏的校準過程,本文采用三點校準的方法,與兩點校準相比,三點校準的模型考慮到變相和旋轉,更接近實際情況。首先選取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坐标。化簡得:

[轉]嵌入式Linux系統中觸摸屏驅動的研究

    通過上式可以說明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作業系統下觸摸屏驅動程式的開發過程,改進了處理采樣資料的方法,最後改進了常用的校準方法。使該觸 摸屏驅動更能滿足實際的要求,該觸摸屏驅動程式已用于實際的嵌入式産品中,運作穩定可靠,具有很好的發展前景和社會經濟效益。

繼續閱讀