王璐凡
(河南理工大學,454000;2.哈密職業技術學院,839000)
觸摸屏因其具有較高的透光度、精確性,支持觸針和簽名辨識性,已逐漸成為了控制系統的通用元件。觸摸屏具有全玻璃的耐久性,位于屏幕各個角落的傳感器可以測量出振動能量,觸摸屏就是利用這些傳感器工作的。通過先進的數字信號處理,觸摸屏應用色散調整算法來分析信號并給出精確的觸點坐標。這種方法有助于消除因屏幕污染和表面刮擦帶來的問題,而且具有更高的手掌接觸抑制能力。具有輕薄、形狀適合、不易碎且耐磨損特點。作為與用戶交互的終端媒介,觸摸屏在生活中得到廣泛的應用。如何在系統中集成觸摸屏模塊以及在嵌入式操作系統中實現其驅動程序,都成為嵌入式系統設計者需要考慮的問題。本文介紹了在S3C2410微處理器的硬件平臺上進行基于嵌入式的觸摸屏驅動程序設計,實現對觸摸屏的操作。
S3C6410是Samsung公司基于ARM1176JZF-S核心的一款MCU,集成了眾多的外圍設備,其中包括四線電阻式觸摸屏控制器,帶有8路模擬輸入通道的ADC。ADC8個模擬輸入通道中,AIN[5]和AIN[7]分別被設置為觸摸屏的X方向和Y方向的模擬信號輸入通道。在獲得XY方向模擬信號后,然后觸摸屏設備驅動程序要對某些寄存器進行讀寫,這樣觸摸屏控制器可以管理控制四路信號的高低電平,以便控制與觸摸屏接口相連的NMOS和PMOS管的閉合,最終按X/Y順序完成觸點模擬信號的采集。
本文采用的是S3C2410微處理器與4線電阻式觸摸屏,其電路原理如圖1所示。觸摸屏由橫向和縱向的電阻絲構成,可以通過YMON、XMONn、YPON、nXPON四個控制信號來控制4個MOS管的通斷變化。S3C2410微處理器一共有8個模擬輸入通道,其中通道5是觸摸屏接口的Y坐標輸入(圖1的AIN[5]),通道7是觸摸屏接口的X坐標輸入(圖1的AIN[7])。電路原理如圖1所示。在接入S3C2410 觸摸屏接口之前,可以通過一個阻容式低通濾波器來濾除坐標信號噪聲。如果傳遞給S3C2410 模擬輸入接口的信號干擾太大,不利于后面的軟件處理。在采樣的過程中,S3C2410的觸摸屏控制器會控制觸摸屏接口來自動打開或關閉各個MOS管,然后按順序完成X坐標點采集和Y坐標點采集。

圖1 觸摸屏的硬件連接圖
根據嵌入式系統內核設備驅動程序開發原理,可以列出的觸摸屏驅動程序的結構層次,內核的觸摸屏驅動程序共有三個部分,包括:觸摸屏事件驅動、觸摸屏輸入核心程序和觸摸屏設備驅動,這三者的邏輯關系由上到下,上與應用程序通信,下控制硬件輸入設備,示意圖如圖2所示,其中觸摸屏事件驅動是與用戶空間應用程序編程接口進行交互;而觸摸屏輸入設備在 serio總線上與觸摸屏設備驅動程序進行通訊,底層觸摸屏設備硬件響應用戶輸入操作時在觸摸屏設備驅動中被轉換預先定義的標準輸入事件之后再被設備驅動向上報告給輸入核心層,然后輸入核心程序將標準事件上報給觸摸屏事件驅動,在這里處理觸摸屏的輸入事件。因此觸摸屏設備驅動只負責對觸摸屏的硬件寄存器的數據讀寫和向上提交檢測到的輸入事件。
由于用戶會在什么時候會進行觸摸動作的時間不確定, 因此采用中斷方式工作對整個系統設計是比較好的選擇。首先,在進行觸摸屏程序設計時,要對其進行基本的初始化操作。其中最重要的是將S3C2410 的觸摸屏控制接口設置為自動 X / Y 坐標轉換模式和等待中斷模式。一旦觸摸筆按下,S3C2410觸摸屏控制器就會產生一個觸摸中斷INT_TC,然后在進入INT_TC中斷程序后觸摸屏控制器會利用S3C2410 的自動X/Y 軸坐標轉換模式將代表 X/Y 坐標的 AD 電壓值讀出來。觸摸屏驅動程序要實現以下 5 個主要任務,具體步驟如圖3的驅動程序流程圖:

圖2 觸摸屏驅動軟件設計框圖
(1)在設備驅動程序中,用數據結構strcut driver定義一系列的函數操作接口,用這個數據結構將整個驅動連為一體,通過數據結構strcut driver能夠看出整個驅動的脈絡。由于觸摸屏與CPU是利用是SPI總線連接的連接方式,因此要用到數據結構 struct spi_driver來將此設備注冊為 SPI 設備。

圖3 觸摸屏驅動程序流程圖
設計編寫的數據結構如下:
static struct spi_driver ad7873_driver = {.driver = {
.name = "ad7873",
.bus = &spi_bus_type,
.owner = THIS_MODULE,
},
.probe = ad7873_probe,
.remove = __devexit_p(ad7873_emove),
.suspend = ad7873_suspend,
.resume = ad7873_resume,
};
在數據結構中,driver函數中定義了總線類型、驅動名稱和驅動所有者。probe函數為觸摸屏探測設備函數,其主要的作用就是對設備數據結構以及中斷進行初始化、向設備發送控制字等。remove函數作為設備的移除函數,其主要作用是移除設備文件、釋放中斷和設備。Suspend是設備的暫停函數。Resume是設備的恢復函數。
(2)設備初始化函數 static int __init ad7873_nit(void)即是注冊上述數據結構,也是注冊一個驅動,初始化函數主要的內容為:
return spi_register_driver(&ad7873_driver);
(3)中斷函數也是觸摸屏驅動設計的一個重要函數,當觸摸屏被安按下是產生中斷,執行中斷函數。啟動定時器是中斷函數中的重要工作,用來判斷觸摸發生后觸摸筆是被提起還是繼續按下。中斷函數原型設計為:
static irqreturn_t ads7873_irq(int irq, void*handle);
(4)用來判斷觸摸屏是否已經被提起需要用定時器函數,一旦觸摸筆被提起就立刻將新設備的數據刷新到應用層,否則就需要進行另外的測量。定時器函數原型設計為:
static void ads7873_timer(unsigned long handle);
在完成了觸摸屏基本控制之后,進行后續的SD卡、文件系統的讀寫 功能。本文介紹了基于S3C2410微處理器,利用觸摸屏與S3C2410的接口,及中斷與查詢兩種方式的優點,用外部晶體管連接觸摸屏到S3C2410的接 口電路,并通過S3C241的等待中斷模式和自動XY坐標轉換工作模式,讀出與 XY坐標有關的電壓值,高效地完成了觸摸狀態的檢測以及觸摸數據的轉換,基于嵌入式系統的觸摸屏驅動設計方法具有簡單便捷、易于實現的特點。
[1]胡思捷.基于Android平臺的觸摸屏系統設計及實現[D].天津:南開大學.2011.
[2]劉瑞.觸摸屏技術及其性能分析[J].裝備制造技術.2010.
[3]李善平、劉文峰、王煥龍.Linux與嵌入式系統[M].清華大學出版社.2006.