基于S3C2410微處理器的觸摸屏設(shè)計
出處:沈陽農(nóng)業(yè)大學(xué) 徐昕 樸在林 許童羽 李征明 發(fā)布于:2011-05-30 21:44:55
觸控屏(Touch panel)又稱為觸控面板,是個可接收觸頭等輸入訊號的感應(yīng)式液晶顯示裝置,當(dāng)接觸了屏幕上的圖形按鈕時,屏幕上的觸覺反饋系統(tǒng)可根據(jù)預(yù)先編程的程式驅(qū)動各種連結(jié)裝置,可用以取代機(jī)械式的按鈕面板,并借由液晶顯示畫面制造出生動的影音效果。
隨著多媒體信息查詢的與日俱增,人們越來越多地談到觸摸屏,因為觸摸屏不僅適用于中國多媒體信息查詢的國情,而且觸摸屏具有堅固耐用、反應(yīng)速度快、節(jié)省空間、易于交流等許多優(yōu)點(diǎn)。利用這種技術(shù),我們用戶只要用手指輕輕地碰計算機(jī)顯示屏上的圖符或文字就能實現(xiàn)對主機(jī)操作,從而使人機(jī)交互更為直截了當(dāng),這種技術(shù)大大方便了那些不懂電腦操作的用戶。
觸摸屏作為一種的電腦輸入設(shè)備,它是目前簡單、方便、自然的一種人機(jī)交互方式。
如何在系統(tǒng)中集成觸摸屏模塊以及在嵌入式操作系統(tǒng)中實現(xiàn)其驅(qū)動程序,都成為嵌入式系統(tǒng)設(shè)計者需要考慮的問題。本文主要介紹在三星S3C2410X微處理器的硬件平臺上進(jìn)行基于嵌入式Linux的觸摸屏驅(qū)動程序設(shè)計。
硬件實現(xiàn)方案
SPI(Serial Peripheral Interface--串行外設(shè)接口)總線系統(tǒng)是一種同步串行外設(shè)接口,它可以使MCU與各種外圍設(shè)備以串行方式進(jìn)行通信以交換信息。
SPI接口是在CPU和外圍低速器件之間進(jìn)行同步串行數(shù)據(jù)傳輸,在主器件的移位脈沖下,數(shù)據(jù)按位傳輸,高位在前,低位在后,為全雙工通信,數(shù)據(jù)傳輸速度總體來說比I2C總線要快,速度可達(dá)到幾Mbps。SPI接口采用全雙工、四線通信系統(tǒng),S3C2410X是三星推出的自帶觸摸屏接口的ARM920T內(nèi)核芯片,ADS7843是一款性能優(yōu)異的觸摸屏控制器。
S3C2410X微處理器時一款由samsung公司為手持設(shè)備設(shè)計的低功耗、高集成度的基于ARM920T核的微處理器,為了降低系統(tǒng)總成本和減少外圍器件,這款芯片還集成了以下部件:16KB指令Cache、16KB數(shù)據(jù)Cache、MMU、外部存儲器控制器、LCD控制器、NAND FLASH控制器、4個DMA通道、3個UART通道、1個IIC總線控制器、1個IIS總線控制器、4個PWM定時器、1個內(nèi)部定時器、通用IO口、實時時鐘、8通道10位ADC和觸摸屏接口、USB主、USB從、SD/MMC卡接口等,現(xiàn)在它廣泛應(yīng)用于PDA、移動通信、路由器、工業(yè)控制等領(lǐng)域。ADS7843是一個內(nèi)置12位模數(shù)轉(zhuǎn)換、低導(dǎo)通電阻模擬開關(guān)的串行接口芯片。供電電壓2.7~5 V,參考電壓VREF為1 V~+VCC,轉(zhuǎn)換電壓的輸入范圍為0~ VREF,轉(zhuǎn)換速率為125 kHz。
本文采用SPI接口的觸摸屏控制器ADS7843外接四線電阻式觸摸屏,這種方式顯著的特點(diǎn)就是響應(yīng)速度更快、靈敏度更高,微處理器與觸摸屏控制器間的通訊時間大大減少,提高了微處理器的效率。鑒于ADS7843差分工作模式的優(yōu)點(diǎn),在硬件電路中將其配置為差分模式。
ADS7843與S3C2410的硬件連接如所示。
觸摸屏輸入系統(tǒng)示意圖
嵌入式Linux系統(tǒng)下的驅(qū)動程序
設(shè)備驅(qū)動程序是Linux內(nèi)核的重要組成部分,控制了操作系統(tǒng)和硬件設(shè)備之間的交互。Linux的設(shè)備管理是和文件系統(tǒng)緊密結(jié)合的,各種設(shè)備都以文件的形式存放在/dev目錄下,成為設(shè)備文件。應(yīng)用程序可以打開、關(guān)閉、讀寫這些設(shè)備文件,對設(shè)備的操作就像操作普通的數(shù)據(jù)文件一樣簡便。為開發(fā)便利、提高效率,本設(shè)計采用可安裝模塊方式開發(fā)調(diào)試觸摸屏驅(qū)動程序。
設(shè)備驅(qū)動在加載時首先需要調(diào)用入口函數(shù)init_module(),該函數(shù)完成設(shè)備驅(qū)動的初始化工作。其中重要的工作就是向內(nèi)核注冊該設(shè)備,對于字符設(shè)備調(diào)用register_chrdev()完成注冊,對于塊設(shè)備需要調(diào)用register_blkdev()完成注冊。
注冊成功后,該設(shè)備獲得了系統(tǒng)分配的主設(shè)備號、自定義的次設(shè)備號,并建立起與文件系統(tǒng)的關(guān)聯(lián)。字符設(shè)備驅(qū)動程序向Linux內(nèi)核注冊登記時,在字符設(shè)備向量表chrdevs中增加一個device_struct數(shù)據(jù)結(jié)構(gòu)條目,這個設(shè)備的主設(shè)備標(biāo)識符用作這個向量表的索引。向量表中的每一個條目,即一個device_struct數(shù)據(jù)結(jié)構(gòu)包括兩個元素:一個登記的設(shè)備驅(qū)動程序的名稱的指針和一個指向一組文件操作的指針。這塊文件操作本身位于這個設(shè)備的字符設(shè)備驅(qū)動程序中,每一個都處理特定的文件操作,比如打開、讀寫和關(guān)閉。
所謂登記,就是將由模塊提供的file_operations結(jié)構(gòu)指針填入device_struct數(shù)據(jù)結(jié)構(gòu)數(shù)組的某個表項。登記以后,位于上層的模塊(內(nèi)核)可以“看見”這個模塊了。但是,應(yīng)用程序卻還不能“看見”它,因而還不能通過系統(tǒng)調(diào)用它。要使應(yīng)用程序能“看見”這個模塊或者它所驅(qū)動的設(shè)備,就要在文件系統(tǒng)中為其創(chuàng)建一個代表它的節(jié)點(diǎn)。通過系統(tǒng)調(diào)用mknod()創(chuàng)建代表此項設(shè)備的文件節(jié)點(diǎn)——設(shè)備入口點(diǎn),就可使一項設(shè)備在系統(tǒng)中可見,成為應(yīng)用程序可以訪問的設(shè)備。另外,設(shè)備驅(qū)動在卸載時需要回收相應(yīng)的資源,令設(shè)備的相應(yīng)寄存器值復(fù)位并從系統(tǒng)中注銷該設(shè)備。
Linux操作系統(tǒng)通過系統(tǒng)調(diào)用和硬件中斷完成從用戶空間到內(nèi)核空間的控制轉(zhuǎn)移。設(shè)備驅(qū)動模塊的功能就是擴(kuò)展內(nèi)核的功能,主要完成兩部分任務(wù):一個是系統(tǒng)調(diào)用,另一個是處理中斷。
設(shè)備驅(qū)動在內(nèi)核中的掛接、卸載和系統(tǒng)調(diào)用過程
是一個設(shè)備驅(qū)動模塊動態(tài)掛接、卸載和系統(tǒng)調(diào)用的全過程。系統(tǒng)調(diào)用部分則是對設(shè)備的操作過程,比如open,read,write,ioctl等操作,設(shè)備驅(qū)動程序所提供的這組入口點(diǎn)由幾個結(jié)構(gòu)向系統(tǒng)進(jìn)行說明,分別是file_operations數(shù)據(jù)結(jié)構(gòu)、inode數(shù)據(jù)結(jié)構(gòu)和file 數(shù)據(jù)結(jié)構(gòu)。內(nèi)核內(nèi)部通過file結(jié)構(gòu)識別設(shè)備,通過file_operations數(shù)據(jù)結(jié)構(gòu)提供文件系統(tǒng)的入口點(diǎn)函數(shù),也就是訪問設(shè)備驅(qū)動的函數(shù),結(jié)構(gòu)中的每一個成員都對應(yīng)著一個系統(tǒng)調(diào)用。在嵌入式系統(tǒng)的開發(fā)中,我們一般僅僅實現(xiàn)其中幾個接口函數(shù):read、write、open、ioctl及release就可以完成應(yīng)用系統(tǒng)需要的功能。寫驅(qū)動程序的任務(wù)之一就是完成file_operations中的函數(shù)指針。
觸摸屏驅(qū)動程序設(shè)計
觸摸屏驅(qū)動程序中重要數(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,
};
在程序中有三個重要的數(shù)據(jù)結(jié)構(gòu):用于表示筆觸點(diǎn)數(shù)據(jù)信息的結(jié)構(gòu)TS_RET,表示ADS7843中有關(guān)觸摸屏控制器信息的結(jié)構(gòu)TS_DEV,以及驅(qū)動程序與應(yīng)用程序的接口file_operations結(jié)構(gòu)的s3c2410_fops。
TS_RET結(jié)構(gòu)體中的信息就是驅(qū)動程序提供給上層應(yīng)用程序使用的信息,用來存儲觸摸屏的返回值。上層應(yīng)用程序通過讀接口,從底層驅(qū)動中讀取信息,并根據(jù)得到的值進(jìn)行其他方面的操作。
TS_DEV結(jié)構(gòu)用于記錄觸摸屏運(yùn)行的各種狀態(tài),PenStatus包括PEN_UP、PEN_DOWN和PEN_FLEETING。buf[MAX_TS_BUF]是用來存放數(shù)據(jù)信息的事件隊列,head、tail分別指向事件隊列的頭和尾。程序中的筆事件隊列是一個環(huán)形結(jié)構(gòu),當(dāng)有事件加入時,隊列頭加一,當(dāng)有事件被取走時,隊列尾加一,當(dāng)頭尾位置指針一致時讀取筆事件的信息,進(jìn)程會被安排進(jìn)入睡眠。wq等待隊列,包含一個鎖變量和一個正在睡眠進(jìn)程鏈表。當(dāng)有好幾個進(jìn)程都在等待某件事時,Linux會把這些進(jìn)程記錄到這個等待隊列。它的作用是當(dāng)沒有筆觸事件發(fā)生時,阻塞上層的讀操作,直到有筆觸事件發(fā)生。lock使用自旋鎖,自旋鎖是基于共享變量來工作的,函數(shù)可以通過給某個變量設(shè)置一個特殊值來獲得鎖。而其他需要鎖的函數(shù)則會循環(huán)查詢鎖是否可用。MAX_TS_BUF的值為16,即在沒有被讀取之前,系統(tǒng)緩沖區(qū)中多可以存放16個筆觸數(shù)據(jù)信息。
s3c2410_fops就是內(nèi)核對驅(qū)動的調(diào)用接口,完成了將驅(qū)動函數(shù)映射為標(biāo)準(zhǔn)接口。上面的這種特殊表示方法不是標(biāo)準(zhǔn)C的語法,而是GNU編譯器的一種特殊擴(kuò)展,它使用名字進(jìn)行結(jié)構(gòu)字段的初始化,它的好處體現(xiàn)在結(jié)構(gòu)清晰,易于理解,并且避免了結(jié)構(gòu)發(fā)生變化帶來的許多問題。
接口函數(shù)s3c2410_ts_read( )
這個函數(shù)實現(xiàn)的任務(wù)是將事件隊列從設(shè)備緩存中讀到用戶空間的數(shù)據(jù)緩存中。實現(xiàn)的過程主要是通過一個循環(huán),只有在事件隊列的頭、尾指針不重合時,才能成功的從tsdev.tail指向的隊列尾部讀取到一組觸摸信息數(shù)據(jù),并退出循環(huán)。否則調(diào)用讀取函數(shù)的進(jìn)程就要進(jìn)入睡眠。
坐標(biāo)讀取函數(shù)s3c2410_get_XY()
在定時器中斷處理程序中,當(dāng)查詢到與相連的EINT5/GPF5為低電平時,即表示有有效事件,應(yīng)該調(diào)用s3c2410_get_XY()函數(shù)采集筆觸信息。
module_exit()
該函數(shù)調(diào)用s3c2410_ts_exit(),主要任務(wù)是撤銷驅(qū)動程序向內(nèi)核的登記以及釋放申請的中斷資源。
init_module函數(shù)
在函數(shù)內(nèi)部通過s3c2410_ts_init( )實現(xiàn)模塊的初始化工作。在本設(shè)計中設(shè)備與系統(tǒng)之間以中斷方式進(jìn)行數(shù)據(jù)交換。整個觸摸屏的驅(qū)動程序處理比較復(fù)雜,而且耗時較長,因而觸摸屏驅(qū)動程序不可能在中斷服務(wù)程序中完成。在Linux操作系統(tǒng)中一般把中斷處理切為兩個部分或兩半。中斷處理程序是上半部——接收到一個中斷,它就立即開始執(zhí)行,但只做有嚴(yán)格時限的工作,例如對接收的中斷進(jìn)行應(yīng)答或復(fù)位硬件。這些工作都是在所有中斷被禁止的情況下完成的,能夠被允許稍后完成的工作會推遲到下半部去。在Linux中下半部的實現(xiàn)有多種機(jī)制。
當(dāng)按觸摸屏?xí)r,ADS7843輸出的數(shù)值會有一個抖動過程,即從ADS7846輸出的數(shù)值有一個不穩(wěn)定時期,這個過程大約為10ms。所以中斷處理程序的下半部處理函數(shù)采用內(nèi)核定時器機(jī)制,使下半部在中斷發(fā)生50ms后再作處理。這樣有效地避開了ADS7843輸出值的不穩(wěn)定時期,使中斷服務(wù)程序和中斷處理任務(wù)串行化,達(dá)到了處理時間較長的觸摸屏事件的目的。驅(qū)動程序通過request_irq函數(shù)注冊并激活一個中斷處理程序,以便處理中斷。
int reguest_irq(unsigned int irq, void(*handler)(int, void *, struct pt_regs *), unsigned long irq_flags, const char *dev_name, void *dev_id)
上面的程序中,handler為向系統(tǒng)登記的中斷處理子程序,中斷產(chǎn)生時由系統(tǒng)來調(diào)用;參數(shù)irq表示所要申請的中斷號;dev_id為申請時告訴系統(tǒng)的設(shè)備標(biāo)識符;dev_name為設(shè)備名;irq_flags是申請時的選項,它決定中斷處理程序的一些特性,其中重要的是中斷處理程序是快速處理程序還是慢速處理程序。
本設(shè)計中觸摸屏控制器ADS7843的中斷輸出通過外部中斷5接在中斷控制器上,當(dāng)觸摸屏上有觸摸事件發(fā)生時,會引發(fā)中斷號為IRQ_EINT5的中斷服務(wù)程序s3c2410_isr_tc()。
所示為該中斷處理程序的流程圖。
觸摸屏硬件中斷處理程序流程圖
在s3c2410_isr_tc()中設(shè)定了定時器的定時時間為50ms,并立即激活。因此有觸摸屏硬件中斷的情況下50ms后就會引發(fā)定時中斷,中斷服務(wù)程序為ts_timer_handler(),這個程序?qū)崿F(xiàn)了觸摸屏中斷的下半部,即在過了抖動時間之后如果觸摸屏確實有有效事件發(fā)生則采集觸摸屏坐標(biāo),并將定時器的時間重新設(shè)為100ms并重新激活,這樣做的目的是如果觸摸筆是拖動的情況,以后每100ms采集坐標(biāo)值,并存入緩沖區(qū),如果不是拖動在采集坐標(biāo)值之后,在第二次進(jìn)入ts_timer_handler()時,查詢管腳的狀態(tài)值,則變?yōu)楦唠娖?,就將觸摸屏狀態(tài)tsdev.PenStatus設(shè)為PEN_UP,并釋放定時器,為下次觸摸屏事件做好準(zhǔn)備。
定時中斷服務(wù)程序流程圖如所示。
定時中斷服務(wù)程序流程圖
在s3c2410_ts_init()中的另一個重要任務(wù)是執(zhí)行接口函數(shù)s3c2410_ts_open(),在這個函數(shù)中初始化緩沖區(qū)的頭尾指針、觸摸屏狀態(tài)變量及觸摸屏事件等待隊列。
ADS7843有多種轉(zhuǎn)換時序,時序規(guī)定了芯片與設(shè)備及CPU間是如何配合工作的。設(shè)計中采用16個時鐘周期啟動轉(zhuǎn)換的坐標(biāo)轉(zhuǎn)換方式。
ADS7843的操作時序如所示。
坐標(biāo)的讀取是通過多次采集取平均值的方法,以X坐標(biāo)的讀取為例,其讀取過程如所示。循環(huán)過程中的每一步都在8個時鐘周期內(nèi)完成,數(shù)據(jù)的處理嚴(yán)格按照時序進(jìn)行,Y坐標(biāo)的采集與X坐標(biāo)類似。
ADS7843操作時序
X坐標(biāo)采集流程
在本文觸摸屏的設(shè)計中,抗干擾設(shè)計無疑是個難點(diǎn)和重點(diǎn),且直接關(guān)系到觸摸屏的工作性能。實驗發(fā)現(xiàn)坐標(biāo)采集時,丟棄次采集值讀取的坐標(biāo)轉(zhuǎn)換值效果較好。
本文所介紹的驅(qū)動程序已經(jīng)在博創(chuàng)公司的教學(xué)實驗設(shè)備UP-NETARM2410-S平臺上經(jīng)過實際驗證,從數(shù)據(jù)穩(wěn)定性和系統(tǒng)負(fù)載的角度看,效果良好。同時通過修改程序內(nèi)部的定時器時鐘頻率可以改變筆在屏上移動所產(chǎn)生的數(shù)據(jù)量。
觸摸屏發(fā)展趨勢
目前觸摸屏的應(yīng)用范圍從以往的銀行自動柜員機(jī)、工控計算機(jī)等小眾商用市場,迅速擴(kuò)展到手機(jī)、PDA、 GPS(定位系統(tǒng))、PMP(MP3,MP4等),甚至平板電腦(Tablet PC)等大眾消費(fèi)電子領(lǐng)域。展望未來,觸控操作簡單、便捷,人性化的觸摸屏有望成為人機(jī)互動的界面而迅速普及。 目前的觸控技術(shù)尚存在屏幕所使用的材源透光較差影響顯示畫面的清晰度,或者長期使用后出現(xiàn)坐標(biāo)漂移、影響使用等問題。而且,主要觸摸屏生產(chǎn)大廠多集中在日、美、韓等國家以及我國臺灣地區(qū);主要技術(shù)、關(guān)鍵零組件和原材料更是基本掌握在日、美廠商手中,中國大陸的觸摸屏/觸控面板產(chǎn)業(yè)還基本處于起步階段。但正因如此,整個觸控行業(yè)未來的上升空間還非常大,它也有望成為我國電子企業(yè)今后創(chuàng)新發(fā)展、大有作為的重要領(lǐng)域。觸摸屏目前主要還是集中在小尺寸上的應(yīng)用,未來的發(fā)展將是一個觸控和遙控的世界,所以大尺寸觸摸屏的發(fā)展是目前觸摸屏發(fā)展的趨勢,創(chuàng)科恒遠(yuǎn)在大尺寸觸摸屏的領(lǐng)域上發(fā)展有著先進(jìn)的技術(shù),尤其是多點(diǎn)觸摸的應(yīng)用領(lǐng)域,其在WINDOWS7下開發(fā)的多點(diǎn)觸摸技術(shù)已經(jīng)廣發(fā)應(yīng)用于市場,在市場的應(yīng)用中給了民眾耳目一新的感覺,深的廣大民眾的喜愛。所以未來的世界是個觸控的世界,是個遙控的世界,大尺寸觸摸屏的發(fā)展有著廣泛的空間。
數(shù)據(jù)資料:ADS7843.PDF
參考文獻(xiàn):
[1]. S3C2410X datasheet http://m.58mhw.cn/datasheet/S3C2410X_589566.html.
[2]. ARM920T datasheet http://m.58mhw.cn/datasheet/ARM920T_139814.html.
[3]. ADS7843 datasheet http://m.58mhw.cn/datasheet/ADS7843_1055179.html.
[4]. ADS7846 datasheet http://m.58mhw.cn/datasheet/ADS7846_1056189.html.
版權(quán)與免責(zé)聲明
凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://m.58mhw.cn,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實其內(nèi)容的真實性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。
如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
- ARM技術(shù)架構(gòu)與應(yīng)用開發(fā)實踐指南2026/1/6 10:40:19
- 嵌入式實時操作系統(tǒng)(RTOS)選型與移植技術(shù)指南2025/12/31 10:42:31
- 工業(yè)嵌入式系統(tǒng):通信接口技術(shù)選型與抗干擾設(shè)計實踐2025/12/15 14:36:53
- 深入解析嵌入式 OPENAMP 框架:開啟異核通信新時代2025/7/22 16:27:29
- 一文快速了解OPENWRT基礎(chǔ)知識2025/7/14 16:59:04









