基于S3C2410微處理器的觸摸屏設(shè)計(jì)
引言
隨著信息家電和通訊設(shè)備的普及,作為與用戶交互的終端媒介,觸摸屏在生活中得到廣泛的應(yīng)用。如何在系統(tǒng)中集成觸摸屏模塊以及在嵌入式操作系統(tǒng)中實(shí)現(xiàn)其驅(qū)動(dòng)程序,都成為嵌入式系統(tǒng)設(shè)計(jì)者需要考慮的問(wèn)題。本文主要介紹在三星S3C2410X微處理器的硬件平臺(tái)上進(jìn)行基于嵌入式Linux的觸摸屏驅(qū)動(dòng)程序設(shè)計(jì)。
硬件實(shí)現(xiàn)方案
SPI接口是Motorola推出的一種同步串行接口,采用全雙工、四線通信系統(tǒng),S3C2410X是三星推出的自帶觸摸屏接口的ARM920T內(nèi)核芯片,ADS7843為Burr-Brown生產(chǎn)的一款性能優(yōu)異的觸摸屏控制器。本文采用SPI接口的觸摸屏控制器ADS7843外接四線電阻式觸摸屏,這種方式最顯著的特點(diǎn)是響應(yīng)速度更快、靈敏度更高,微處理器與觸摸屏控制器間的通訊時(shí)間大大減少,提高了微處理器的效率。ADS7843與S3C2410的硬件連接如圖1所示,鑒于ADS7843差分工作模式的優(yōu)點(diǎn),在硬件電路中將其配置為差分模式。
圖1 觸摸屏輸入系統(tǒng)示意圖
嵌入式Linux系統(tǒng)下的驅(qū)動(dòng)程序
設(shè)備驅(qū)動(dòng)程序是Linux內(nèi)核的重要組成部分,控制了操作系統(tǒng)和硬件設(shè)備之間的交互。Linux的設(shè)備管理是和文件系統(tǒng)緊密結(jié)合的,各種設(shè)備都以文件的形式存放在/dev目錄下,成為設(shè)備文件。應(yīng)用程序可以打開(kāi)、關(guān)閉、讀寫(xiě)這些設(shè)備文件,對(duì)設(shè)備的操作就像操作普通的數(shù)據(jù)文件一樣簡(jiǎn)便。為開(kāi)發(fā)便利、提高效率,本設(shè)計(jì)采用可安裝模塊方式開(kāi)發(fā)調(diào)試觸摸屏驅(qū)動(dòng)程序。
設(shè)備驅(qū)動(dòng)在加載時(shí)首先需要調(diào)用入口函數(shù)init_module(),該函數(shù)完成設(shè)備驅(qū)動(dòng)的初始化工作。其中最重要的工作就是向內(nèi)核注冊(cè)該設(shè)備,對(duì)于字符設(shè)備調(diào)用register_chrdev()完成注冊(cè),對(duì)于塊設(shè)備需要調(diào)用register_blkdev()完成注冊(cè)。注冊(cè)成功后,該設(shè)備獲得了系統(tǒng)分配的主設(shè)備號(hào)、自定義的次設(shè)備號(hào),并建立起與文件系統(tǒng)的關(guān)聯(lián)。字符設(shè)備驅(qū)動(dòng)程序向Linux內(nèi)核注冊(cè)登記時(shí),在字符設(shè)備向量表chrdevs中增加一個(gè)device_struct數(shù)據(jù)結(jié)構(gòu)條目,這個(gè)設(shè)備的主設(shè)備標(biāo)識(shí)符用作這個(gè)向量表的索引。向量表中的每一個(gè)條目,即一個(gè)device_struct數(shù)據(jù)結(jié)構(gòu)包括兩個(gè)元素:一個(gè)登記的設(shè)備驅(qū)動(dòng)程序的名稱的指針和一個(gè)指向一組文件操作的指針。這塊文件操作本身位于這個(gè)設(shè)備的字符設(shè)備驅(qū)動(dòng)程序中,每一個(gè)都處理特定的文件操作,比如打開(kāi)、讀寫(xiě)和關(guān)閉。所謂登記,就是將由模塊提供的file_operations結(jié)構(gòu)指針填入device_struct數(shù)據(jù)結(jié)構(gòu)數(shù)組的某個(gè)表項(xiàng)。登記以后,位于上層的模塊(內(nèi)核)可以“看見(jiàn)”這個(gè)模塊了。但是,應(yīng)用程序卻還不能“看見(jiàn)”它,因而還不能通過(guò)系統(tǒng)調(diào)用它。要使應(yīng)用程序能“看見(jiàn)”這個(gè)模塊或者它所驅(qū)動(dòng)的設(shè)備,就要在文件系統(tǒng)中為其創(chuàng)建一個(gè)代表它的節(jié)點(diǎn)。通過(guò)系統(tǒng)調(diào)用mknod()創(chuàng)建代表此項(xiàng)設(shè)備的文件節(jié)點(diǎn)——設(shè)備入口點(diǎn),就可使一項(xiàng)設(shè)備在系統(tǒng)中可見(jiàn),成為應(yīng)用程序可以訪問(wèn)的設(shè)備。另外,設(shè)備驅(qū)動(dòng)在卸載時(shí)需要回收相應(yīng)的資源,令設(shè)備的相應(yīng)寄存器值復(fù)位并從系統(tǒng)中注銷(xiāo)該設(shè)備。
Linux操作系統(tǒng)通過(guò)系統(tǒng)調(diào)用和硬件中斷完成從用戶空間到內(nèi)核空間的控制轉(zhuǎn)移。設(shè)備驅(qū)動(dòng)模塊的功能就是擴(kuò)展內(nèi)核的功能,主要完成兩部分任務(wù):一個(gè)是系統(tǒng)調(diào)用,另一個(gè)是處理中斷。圖2是一個(gè)設(shè)備驅(qū)動(dòng)模塊動(dòng)態(tài)掛接、卸載和系統(tǒng)調(diào)用的全過(guò)程。系統(tǒng)調(diào)用部分則是對(duì)設(shè)備的操作過(guò)程,比如open,read,write,ioctl等操作,設(shè)備驅(qū)動(dòng)程序所提供的這組入口點(diǎn)由幾個(gè)結(jié)構(gòu)向系統(tǒng)進(jìn)行說(shuō)明,分別是file_operations數(shù)據(jù)結(jié)構(gòu)、inode數(shù)據(jù)結(jié)構(gòu)和file 數(shù)據(jù)結(jié)構(gòu)。內(nèi)核內(nèi)部通過(guò)file結(jié)構(gòu)識(shí)別設(shè)備,通過(guò)file_operations數(shù)據(jù)結(jié)構(gòu)提供文件系統(tǒng)的入口點(diǎn)函數(shù),也就是訪問(wèn)設(shè)備驅(qū)動(dòng)的函數(shù),結(jié)構(gòu)中的每一個(gè)成員都對(duì)應(yīng)著一個(gè)系統(tǒng)調(diào)用。在嵌入式系統(tǒng)的開(kāi)發(fā)中,我們一般僅僅實(shí)現(xiàn)其中幾個(gè)接口函數(shù):read、write、open、ioctl及release就可以完成應(yīng)用系統(tǒng)需要的功能。寫(xiě)驅(qū)動(dòng)程序的任務(wù)之一就是完成file_operations中的函數(shù)指針。
觸摸屏驅(qū)動(dòng)程序設(shè)計(jì)
觸摸屏驅(qū)動(dòng)程序中重要數(shù)據(jù)結(jié)構(gòu)
typedef struct {
unsigned short pressure;
unsigned short x;
unsigned short y;
unsigned short pad;
} TS_RET;
typedef struct {
unsigned int PenStatus;
TS_RET buf[MAX_TS_BUF];
unsigned int head, tail;
wait_queue_head_t wq;
spinlock_t lock;
} TS_DEV;
static struct file_operations s3c2410_fops = {
owner: THIS_MODULE,
open: s3c2410_ts_open,
read: s3c2410_ts_read, release: s3c2410_ts_release,
poll: s3c2410_ts_poll, };
在程序中有三個(gè)重要的數(shù)據(jù)結(jié)構(gòu):用于表示筆觸點(diǎn)數(shù)據(jù)信息的結(jié)構(gòu)TS_RET,表示ADS7843中有關(guān)觸摸屏控制器信息的結(jié)構(gòu)TS_DEV,以及驅(qū)動(dòng)程序與應(yīng)用程序的接口file_operations結(jié)構(gòu)的s3c2410_fops。
評(píng)論