<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于S3C2410的觸摸屏驅動(dòng)程序設計

基于S3C2410的觸摸屏驅動(dòng)程序設計

作者:沈陽(yáng)農業(yè)大學(xué) 徐昕 樸在林 許童羽 李征明 時(shí)間:2007-02-06 來(lái)源:電子產(chǎn)品世界 收藏

摘要: 本文介紹了基于三星X微處理器,采用SPI接口與控制器芯片完成模塊的設計。具體包括在操作系統中的軟件驅動(dòng)開(kāi)發(fā),采用內核定時(shí)器的下半部機制進(jìn)行了硬件中斷程序設計,采用16個(gè)時(shí)鐘周期的坐標轉換時(shí)序,實(shí)現觸摸點(diǎn)數據采集的方法,給出了坐標采集的流程。設計完成的觸摸屏驅動(dòng)程序在博創(chuàng )公司教學(xué)實(shí)驗設備UP-NETARM2410-S平臺上運行效果良好。

關(guān)鍵詞;SPI;;觸摸屏;S;驅動(dòng)程序

本文引用地址:http://dyxdggzs.com/article/22954.htm

引言

隨著(zhù)信息家電和通訊設備的普及,作為與用戶(hù)交互的終端媒介,觸摸屏在生活中得到廣泛的應用。如何在系統中集成觸摸屏模塊以及在嵌入式操作系統中實(shí)現其驅動(dòng)程序,都成為嵌入式系統設計者需要考慮的問(wèn)題。本文主要介紹在三星X微處理器的硬件平臺上進(jìn)行基于的觸摸屏驅動(dòng)程序設計。

硬件實(shí)現方案

SPI接口是Motorola推出的一種同步串行接口,采用全雙工、四線(xiàn)通信系統,S3C2410X是三星推出的自帶觸摸屏接口的ARM920T內核芯片,為Burr-Brown生產(chǎn)的一款性能優(yōu)異的觸摸屏控制器。本文采用SPI接口的觸摸屏控制器ADS7843外接四線(xiàn)電阻式觸摸屏,這種方式最顯著(zhù)的特點(diǎn)是響應速度更快、靈敏度更高,微處理器與觸摸屏控制器間的通訊時(shí)間大大減少,提高了微處理器的效率。ADS7843與S3C2410的硬件連接如圖1所示,鑒于A(yíng)DS7843差分工作模式的優(yōu)點(diǎn),在硬件電路中將其配置為差分模式。

圖1 觸摸屏輸入系統示意圖

嵌入式Linux系統下的驅動(dòng)程序

設備驅動(dòng)程序是Linux內核的重要組成部分,控制了操作系統和硬件設備之間的交互。Linux的設備管理是和文件系統緊密結合的,各種設備都以文件的形式存放在/dev目錄下,成為設備文件。應用程序可以打開(kāi)、關(guān)閉、讀寫(xiě)這些設備文件,對設備的操作就像操作普通的數據文件一樣簡(jiǎn)便。為開(kāi)發(fā)便利、提高效率,本設計采用可安裝模塊方式開(kāi)發(fā)調試觸摸屏驅動(dòng)程序。

設備驅動(dòng)在加載時(shí)首先需要調用入口函數init_module(),該函數完成設備驅動(dòng)的初始化工作。其中最重要的工作就是向內核注冊該設備,對于字符設備調用register_chrdev()完成注冊,對于塊設備需要調用register_blkdev()完成注冊。注冊成功后,該設備獲得了系統分配的主設備號、自定義的次設備號,并建立起與文件系統的關(guān)聯(lián)。字符設備驅動(dòng)程序向Linux內核注冊登記時(shí),在字符設備向量表chrdevs中增加一個(gè)device_struct數據結構條目,這個(gè)設備的主設備標識符用作這個(gè)向量表的索引。向量表中的每一個(gè)條目,即一個(gè)device_struct數據結構包括兩個(gè)元素:一個(gè)登記的設備驅動(dòng)程序的名稱(chēng)的指針和一個(gè)指向一組文件操作的指針。這塊文件操作本身位于這個(gè)設備的字符設備驅動(dòng)程序中,每一個(gè)都處理特定的文件操作,比如打開(kāi)、讀寫(xiě)和關(guān)閉。所謂登記,就是將由模塊提供的file_operations結構指針填入device_struct數據結構數組的某個(gè)表項。登記以后,位于上層的模塊(內核)可以“看見(jiàn)”這個(gè)模塊了。但是,應用程序卻還不能“看見(jiàn)”它,因而還不能通過(guò)系統調用它。要使應用程序能“看見(jiàn)”這個(gè)模塊或者它所驅動(dòng)的設備,就要在文件系統中為其創(chuàng )建一個(gè)代表它的節點(diǎn)。通過(guò)系統調用mknod()創(chuàng )建代表此項設備的文件節點(diǎn)——設備入口點(diǎn),就可使一項設備在系統中可見(jiàn),成為應用程序可以訪(fǎng)問(wèn)的設備。另外,設備驅動(dòng)在卸載時(shí)需要回收相應的資源,令設備的相應寄存器值復位并從系統中注銷(xiāo)該設備。

Linux操作系統通過(guò)系統調用和硬件中斷完成從用戶(hù)空間到內核空間的控制轉移。設備驅動(dòng)模塊的功能就是擴展內核的功能,主要完成兩部分任務(wù):一個(gè)是系統調用,另一個(gè)是處理中斷。圖2是一個(gè)設備驅動(dòng)模塊動(dòng)態(tài)掛接、卸載和系統調用的全過(guò)程。系統調用部分則是對設備的操作過(guò)程,比如open,read,write,ioctl等操作,設備驅動(dòng)程序所提供的這組入口點(diǎn)由幾個(gè)結構向系統進(jìn)行說(shuō)明,分別是file_operations數據結構、inode數據結構和file 數據結構。內核內部通過(guò)file結構識別設備,通過(guò)file_operations數據結構提供文件系統的入口點(diǎn)函數,也就是訪(fǎng)問(wèn)設備驅動(dòng)的函數,結構中的每一個(gè)成員都對應著(zhù)一個(gè)系統調用。在嵌入式系統的開(kāi)發(fā)中,我們一般僅僅實(shí)現其中幾個(gè)接口函數:read、write、open、ioctl及release就可以完成應用系統需要的功能。寫(xiě)驅動(dòng)程序的任務(wù)之一就是完成file_operations中的函數指針。

觸摸屏驅動(dòng)程序設計

觸摸屏驅動(dòng)程序中重要數據結構
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è)重要的數據結構:用于表示筆觸點(diǎn)數據信息的結構TS_RET,表示ADS7843中有關(guān)觸摸屏控制器信息的結構TS_DEV,以及驅動(dòng)程序與應用程序的接口file_operations結構的s3c2410_fops。

TS_RET結構體中的信息就是驅動(dòng)程序提供給上層應用程序使用的信息,用來(lái)存儲觸摸屏的返回值。上層應用程序通過(guò)讀接口,從底層驅動(dòng)中讀取信息,并根據得到的值進(jìn)行其他方面的操作。

TS_DEV結構用于記錄觸摸屏運行的各種狀態(tài),PenStatus包括PEN_UP、PEN_DOWN和PEN_FLEETING。buf[MAX_TS_BUF]是用來(lái)存放數據信息的事件隊列,head、tail分別指向事件隊列的頭和尾。程序中的筆事件隊列是一個(gè)環(huán)形結構,當有事件加入時(shí),隊列頭加一,當有事件被取走時(shí),隊列尾加一,當頭尾位置指針一致時(shí)讀取筆事件的信息,進(jìn)程會(huì )被安排進(jìn)入睡眠。wq等待隊列,包含一個(gè)鎖變量和一個(gè)正在睡眠進(jìn)程鏈表。當有好幾個(gè)進(jìn)程都在等待某件事時(shí),Linux會(huì )把這些進(jìn)程記錄到這個(gè)等待隊列。它的作用是當沒(méi)有筆觸事件發(fā)生時(shí),阻塞上層的讀操作,直到有筆觸事件發(fā)生。lock使用自旋鎖,自旋鎖是基于共享變量來(lái)工作的,函數可以通過(guò)給某個(gè)變量設置一個(gè)特殊值來(lái)獲得鎖。而其他需要鎖的函數則會(huì )循環(huán)查詢(xún)鎖是否可用。MAX_TS_BUF的值為16,即在沒(méi)有被讀取之前,系統緩沖區中最多可以存放16個(gè)筆觸數據信息。

s3c2410_fops就是內核對驅動(dòng)的調用接口,完成了將驅動(dòng)函數映射為標準接口。上面的這種特殊表示方法不是標準C的語(yǔ)法,而是GNU編譯器的一種特殊擴展,它使用名字進(jìn)行結構字段的初始化,它的好處體現在結構清晰,易于理解,并且避免了結構發(fā)生變化帶來(lái)的許多問(wèn)題。

init_module函數

這是模塊的入口函數。在函數內部通過(guò)s3c2410_ts_init( )實(shí)現模塊的初始化工作。在本設計中設備與系統之間以中斷方式進(jìn)行數據交換。整個(gè)觸摸屏的驅動(dòng)程序處理比較復雜,而且耗時(shí)較長(cháng),因而觸摸屏驅動(dòng)程序不可能在中斷服務(wù)程序中完成。在Linux操作系統中一般把中斷處理切為兩個(gè)部分或兩半。中斷處理程序是上半部——接收到一個(gè)中斷,它就立即開(kāi)始執行,但只做有嚴格時(shí)限的工作,例如對接收的中斷進(jìn)行應答或復位硬件。這些工作都是在所有中斷被禁止的情況下完成的,能夠被允許稍后完成的工作會(huì )推遲到下半部去。在Linux中下半部的實(shí)現有多種機制。按觸摸屏時(shí),從ADS7843輸出的數值有一個(gè)抖動(dòng)過(guò)程,即從ADS7846輸出的數值有一個(gè)不穩定時(shí)期,這個(gè)過(guò)程大約為10ms。所以中斷處理程序的下半部處理函數采用內核定時(shí)器機制,使下半部在中斷發(fā)生50ms后再作處理。這樣有效地避開(kāi)了ADS7843輸出值的不穩定時(shí)期,使中斷服務(wù)程序和中斷處理任務(wù)串行化,達到了處理時(shí)間較長(cháng)的觸摸屏事件的目的。驅動(dòng)程序通過(guò)request_irq函數注冊并激活一個(gè)中斷處理程序,以便處理中斷。

圖2 設備驅動(dòng)在內核中的掛接、卸載和系統調用過(guò)程

int reguest_irq(unsigned int irq, void(*handler)(int, void *, struct pt_regs *), unsigned long irq_flags, const char *dev_name, void *dev_id)
參數irq表示所要申請的中斷號;handler為向系統登記的中斷處理子程序,中斷產(chǎn)生時(shí)由系統來(lái)調用;dev_name為設備名;dev_id為申請時(shí)告訴系統的設備標識符;irq_flags是申請時(shí)的選項,它決定中斷處理程序的一些特性,其中最重要的是中斷處理程序是快速處理程序還是慢速處理程序。

本設計中觸摸屏控制器ADS7843的中斷輸出通過(guò)外部中斷5接在中斷控制器上,當觸摸屏上有觸摸事件發(fā)生時(shí),會(huì )引發(fā)中斷號為IRQ_EINT5的中斷服務(wù)程序s3c2410_isr_tc()。圖3所示為該中斷處理程序的流程圖。

圖3 觸摸屏硬件中斷處理程序流程圖

在s3c2410_isr_tc()中設定了定時(shí)器的定時(shí)時(shí)間為50ms,并立即激活。因此有觸摸屏硬件中斷的情況下50ms后就會(huì )引發(fā)定時(shí)中斷,中斷服務(wù)程序為ts_timer_handler(),這個(gè)程序實(shí)現了觸摸屏中斷的下半部,即在過(guò)了抖動(dòng)時(shí)間之后如果觸摸屏確實(shí)有有效事件發(fā)生則采集觸摸屏坐標,并將定時(shí)器的時(shí)間重新設為100ms并重新激活,這樣做的目的是如果觸摸筆是拖動(dòng)的情況,以后每100ms采集一次坐標值,并存入緩沖區,如果不是拖動(dòng)在采集一次坐標值之后,在第二次進(jìn)入ts_timer_handler()時(shí),查詢(xún)管腳的狀態(tài)值,則變?yōu)楦唠娖?,就將觸摸屏狀態(tài)tsdev.PenStatus設為PEN_UP,并釋放定時(shí)器,為下次觸摸屏事件做好準備,定時(shí)中斷服務(wù)程序流程圖如圖4所示。

圖4 定時(shí)中斷服務(wù)程序流程圖

在s3c2410_ts_init()中的另一個(gè)重要任務(wù)是執行接口函數s3c2410_ts_open(),在這個(gè)函數中初始化緩沖區的頭尾指針、觸摸屏狀態(tài)變量及觸摸屏事件等待隊列。

module_exit()
該函數調用s3c2410_ts_exit(),主要任務(wù)是撤銷(xiāo)驅動(dòng)程序向內核的登記以及釋放申請的中斷資源。

接口函數s3c2410_ts_read( )
這個(gè)函數實(shí)現的任務(wù)是將事件隊列從設備緩存中讀到用戶(hù)空間的數據緩存中。實(shí)現的過(guò)程主要是通過(guò)一個(gè)循環(huán),只有在事件隊列的頭、尾指針不重合時(shí),才能成功的從tsdev.tail指向的隊列尾部讀取到一組觸摸信息數據,并退出循環(huán)。否則調用讀取函數的進(jìn)程就要進(jìn)入睡眠。

坐標讀取函數s3c2410_get_XY()
在定時(shí)器中斷處理程序中,當查詢(xún)到與相連的EINT5/GPF5為低電平時(shí),即表示有有效事件,應該調用s3c2410_get_XY()函數采集筆觸信息。

ADS7843有多種轉換時(shí)序,時(shí)序規定了芯片與設備及CPU間是如何配合工作的。設計中采用16個(gè)時(shí)鐘周期啟動(dòng)一次轉換的坐標轉換方式。ADS7843的操作時(shí)序如圖5所示。坐標的讀取是通過(guò)多次采集取平均值的方法,以X坐標的讀取為例,其讀取過(guò)程如圖6所示。循環(huán)過(guò)程中的每一步都在8個(gè)時(shí)鐘周期內完成,數據的處理嚴格按照時(shí)序進(jìn)行,Y坐標的采集與X坐標類(lèi)似。

圖5 ADS7843操作時(shí)序

圖6 X坐標采集流程

結語(yǔ)

在觸摸屏的設計中,抗干擾設計是難點(diǎn)和重點(diǎn),直接關(guān)系到觸摸屏的工作性能。實(shí)驗發(fā)現坐標采集時(shí),丟棄第一次采集值讀取的坐標轉換值效果較好。本文所介紹的驅動(dòng)程序已經(jīng)在博創(chuàng )公司的教學(xué)實(shí)驗設備UP-NETARM2410-S平臺上經(jīng)過(guò)實(shí)際驗證,從數據穩定性和系統負載的角度看,效果良好。同時(shí)通過(guò)修改程序內部的定時(shí)器時(shí)鐘頻率可以改變筆在屏上移動(dòng)所產(chǎn)生的數據量。

參考文獻

1. 毛德操,胡希明著(zhù).Linux內核源代碼情景分析.杭州:浙江大學(xué)出版社,2001
2. 孫天澤,袁文菊,張海峰等.嵌入式設計及Linux驅動(dòng)開(kāi)發(fā)指南.北京:電子工業(yè)出版社,2005
3.  R Love. Linux內核設計與實(shí)現. 陳莉君,康華,張波等譯.北京:機械工業(yè)出版社,2006
4. 殷惠莉,劉少君,黃道平.基于uClinux觸摸屏的設計.電子工程師.2004(2)

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

linux相關(guān)文章:linux教程




評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>