王璐凡
(河南理工大學(xué),454000;2.哈密職業(yè)技術(shù)學(xué)院,839000)
觸摸屏因其具有較高的透光度、精確性,支持觸針和簽名辨識性,已逐漸成為了控制系統(tǒng)的通用元件。觸摸屏具有全玻璃的耐久性,位于屏幕各個角落的傳感器可以測量出振動能量,觸摸屏就是利用這些傳感器工作的。通過先進(jìn)的數(shù)字信號處理,觸摸屏應(yīng)用色散調(diào)整算法來分析信號并給出精確的觸點(diǎn)坐標(biāo)。這種方法有助于消除因屏幕污染和表面刮擦帶來的問題,而且具有更高的手掌接觸抑制能力。具有輕薄、形狀適合、不易碎且耐磨損特點(diǎn)。作為與用戶交互的終端媒介,觸摸屏在生活中得到廣泛的應(yīng)用。如何在系統(tǒng)中集成觸摸屏模塊以及在嵌入式操作系統(tǒng)中實(shí)現(xiàn)其驅(qū)動程序,都成為嵌入式系統(tǒng)設(shè)計(jì)者需要考慮的問題。本文介紹了在S3C2410微處理器的硬件平臺上進(jìn)行基于嵌入式的觸摸屏驅(qū)動程序設(shè)計(jì),實(shí)現(xiàn)對觸摸屏的操作。
S3C6410是Samsung公司基于ARM1176JZF-S核心的一款MCU,集成了眾多的外圍設(shè)備,其中包括四線電阻式觸摸屏控制器,帶有8路模擬輸入通道的ADC。ADC8個模擬輸入通道中,AIN[5]和AIN[7]分別被設(shè)置為觸摸屏的X方向和Y方向的模擬信號輸入通道。在獲得XY方向模擬信號后,然后觸摸屏設(shè)備驅(qū)動程序要對某些寄存器進(jìn)行讀寫,這樣觸摸屏控制器可以管理控制四路信號的高低電平,以便控制與觸摸屏接口相連的NMOS和PMOS管的閉合,最終按X/Y順序完成觸點(diǎn)模擬信號的采集。
本文采用的是S3C2410微處理器與4線電阻式觸摸屏,其電路原理如圖1所示。觸摸屏由橫向和縱向的電阻絲構(gòu)成,可以通過YMON、XMONn、YPON、nXPON四個控制信號來控制4個MOS管的通斷變化。S3C2410微處理器一共有8個模擬輸入通道,其中通道5是觸摸屏接口的Y坐標(biāo)輸入(圖1的AIN[5]),通道7是觸摸屏接口的X坐標(biāo)輸入(圖1的AIN[7])。電路原理如圖1所示。在接入S3C2410 觸摸屏接口之前,可以通過一個阻容式低通濾波器來濾除坐標(biāo)信號噪聲。如果傳遞給S3C2410 模擬輸入接口的信號干擾太大,不利于后面的軟件處理。在采樣的過程中,S3C2410的觸摸屏控制器會控制觸摸屏接口來自動打開或關(guān)閉各個MOS管,然后按順序完成X坐標(biāo)點(diǎn)采集和Y坐標(biāo)點(diǎn)采集。
圖1 觸摸屏的硬件連接圖
根據(jù)嵌入式系統(tǒng)內(nèi)核設(shè)備驅(qū)動程序開發(fā)原理,可以列出的觸摸屏驅(qū)動程序的結(jié)構(gòu)層次,內(nèi)核的觸摸屏驅(qū)動程序共有三個部分,包括:觸摸屏事件驅(qū)動、觸摸屏輸入核心程序和觸摸屏設(shè)備驅(qū)動,這三者的邏輯關(guān)系由上到下,上與應(yīng)用程序通信,下控制硬件輸入設(shè)備,示意圖如圖2所示,其中觸摸屏事件驅(qū)動是與用戶空間應(yīng)用程序編程接口進(jìn)行交互;而觸摸屏輸入設(shè)備在 serio總線上與觸摸屏設(shè)備驅(qū)動程序進(jìn)行通訊,底層觸摸屏設(shè)備硬件響應(yīng)用戶輸入操作時在觸摸屏設(shè)備驅(qū)動中被轉(zhuǎn)換預(yù)先定義的標(biāo)準(zhǔn)輸入事件之后再被設(shè)備驅(qū)動向上報告給輸入核心層,然后輸入核心程序?qū)?biāo)準(zhǔn)事件上報給觸摸屏事件驅(qū)動,在這里處理觸摸屏的輸入事件。因此觸摸屏設(shè)備驅(qū)動只負(fù)責(zé)對觸摸屏的硬件寄存器的數(shù)據(jù)讀寫和向上提交檢測到的輸入事件。
由于用戶會在什么時候會進(jìn)行觸摸動作的時間不確定, 因此采用中斷方式工作對整個系統(tǒng)設(shè)計(jì)是比較好的選擇。首先,在進(jìn)行觸摸屏程序設(shè)計(jì)時,要對其進(jìn)行基本的初始化操作。其中最重要的是將S3C2410 的觸摸屏控制接口設(shè)置為自動 X / Y 坐標(biāo)轉(zhuǎn)換模式和等待中斷模式。一旦觸摸筆按下,S3C2410觸摸屏控制器就會產(chǎn)生一個觸摸中斷INT_TC,然后在進(jìn)入INT_TC中斷程序后觸摸屏控制器會利用S3C2410 的自動X/Y 軸坐標(biāo)轉(zhuǎn)換模式將代表 X/Y 坐標(biāo)的 AD 電壓值讀出來。觸摸屏驅(qū)動程序要實(shí)現(xiàn)以下 5 個主要任務(wù),具體步驟如圖3的驅(qū)動程序流程圖:
圖2 觸摸屏驅(qū)動軟件設(shè)計(jì)框圖
(1)在設(shè)備驅(qū)動程序中,用數(shù)據(jù)結(jié)構(gòu)strcut driver定義一系列的函數(shù)操作接口,用這個數(shù)據(jù)結(jié)構(gòu)將整個驅(qū)動連為一體,通過數(shù)據(jù)結(jié)構(gòu)strcut driver能夠看出整個驅(qū)動的脈絡(luò)。由于觸摸屏與CPU是利用是SPI總線連接的連接方式,因此要用到數(shù)據(jù)結(jié)構(gòu) struct spi_driver來將此設(shè)備注冊為 SPI 設(shè)備。
圖3 觸摸屏驅(qū)動程序流程圖
設(shè)計(jì)編寫的數(shù)據(jù)結(jié)構(gòu)如下:
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,
};
在數(shù)據(jù)結(jié)構(gòu)中,driver函數(shù)中定義了總線類型、驅(qū)動名稱和驅(qū)動所有者。probe函數(shù)為觸摸屏探測設(shè)備函數(shù),其主要的作用就是對設(shè)備數(shù)據(jù)結(jié)構(gòu)以及中斷進(jìn)行初始化、向設(shè)備發(fā)送控制字等。remove函數(shù)作為設(shè)備的移除函數(shù),其主要作用是移除設(shè)備文件、釋放中斷和設(shè)備。Suspend是設(shè)備的暫停函數(shù)。Resume是設(shè)備的恢復(fù)函數(shù)。
(2)設(shè)備初始化函數(shù) static int __init ad7873_nit(void)即是注冊上述數(shù)據(jù)結(jié)構(gòu),也是注冊一個驅(qū)動,初始化函數(shù)主要的內(nèi)容為:
return spi_register_driver(&ad7873_driver);
(3)中斷函數(shù)也是觸摸屏驅(qū)動設(shè)計(jì)的一個重要函數(shù),當(dāng)觸摸屏被安按下是產(chǎn)生中斷,執(zhí)行中斷函數(shù)。啟動定時器是中斷函數(shù)中的重要工作,用來判斷觸摸發(fā)生后觸摸筆是被提起還是繼續(xù)按下。中斷函數(shù)原型設(shè)計(jì)為:
static irqreturn_t ads7873_irq(int irq, void*handle);
(4)用來判斷觸摸屏是否已經(jīng)被提起需要用定時器函數(shù),一旦觸摸筆被提起就立刻將新設(shè)備的數(shù)據(jù)刷新到應(yīng)用層,否則就需要進(jìn)行另外的測量。定時器函數(shù)原型設(shè)計(jì)為:
static void ads7873_timer(unsigned long handle);
在完成了觸摸屏基本控制之后,進(jìn)行后續(xù)的SD卡、文件系統(tǒng)的讀寫 功能。本文介紹了基于S3C2410微處理器,利用觸摸屏與S3C2410的接口,及中斷與查詢兩種方式的優(yōu)點(diǎn),用外部晶體管連接觸摸屏到S3C2410的接 口電路,并通過S3C241的等待中斷模式和自動XY坐標(biāo)轉(zhuǎn)換工作模式,讀出與 XY坐標(biāo)有關(guān)的電壓值,高效地完成了觸摸狀態(tài)的檢測以及觸摸數(shù)據(jù)的轉(zhuǎn)換,基于嵌入式系統(tǒng)的觸摸屏驅(qū)動設(shè)計(jì)方法具有簡單便捷、易于實(shí)現(xiàn)的特點(diǎn)。
[1]胡思捷.基于Android平臺的觸摸屏系統(tǒng)設(shè)計(jì)及實(shí)現(xiàn)[D].天津:南開大學(xué).2011.
[2]劉瑞.觸摸屏技術(shù)及其性能分析[J].裝備制造技術(shù).2010.
[3]李善平、劉文峰、王煥龍.Linux與嵌入式系統(tǒng)[M].清華大學(xué)出版社.2006.