《電子技術應用》
您所在的位置:首頁 > 模擬設計 > 設計應用 > 基于S3C2410的觸摸屏驅動程序設計
基于S3C2410的觸摸屏驅動程序設計
摘要: 在觸摸屏的設計中,抗干擾設計是難點和重點,直接關系到觸摸屏的工作性能。實驗發現坐標采集時,丟棄第一次采集值讀取的坐標轉換值效果較好。本文所介紹的驅動程序已經在博創公司的教學實驗設備UP-NETarm2410-S平臺上經過實際驗證,從數據穩定性和系統負載的角度看,效果良好。同時通過修改程序內部的定時器時鐘頻率可以改變筆在屏上移動所產生的數據量。
Abstract:
Key words :

  引言

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

  硬件實現方案

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


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

  嵌入式Linux系統下的驅動程序

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

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

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

 

 

 

  觸摸屏驅動程序設計

  觸摸屏驅動程序中重要數據結構

  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,    };

  在程序中有三個重要的數據結構:用于表示筆觸點數據信息的結構TS_RET,表示ADS7843中有關觸摸屏控制器信息的結構TS_DEV,以及驅動程序與應用程序的接口file_operations結構的s3c2410_fops。

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

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

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

  init_module函數

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


圖2 設備驅動在內核中的掛接、卸載和系統調用過程

 

 

  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為向系統登記的中斷處理子程序,中斷產生時由系統來調用;dev_name為設備名;dev_id為申請時告訴系統的設備標識符;irq_flags是申請時的選項,它決定中斷處理程序的一些特性,其中最重要的是中斷處理程序是快速處理程序還是慢速處理程序。

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


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

  在s3c2410_isr_tc()中設定了定時器的定時時間為50ms,并立即激活。因此有觸摸屏硬件中斷的情況下50ms后就會引發定時中斷,中斷服務程序為ts_timer_handler(),這個程序實現了觸摸屏中斷的下半部,即在過了抖動時間之后如果觸摸屏確實有有效事件發生則采集觸摸屏坐標,并將定時器的時間重新設為100ms并重新激活,這樣做的目的是如果觸摸筆是拖動的情況,以后每100ms采集一次坐標值,并存入緩沖區,如果不是拖動在采集一次坐標值之后,在第二次進入ts_timer_handler()時,查詢管腳的狀態值,則變為高電平,就將觸摸屏狀態tsdev.PenStatus設為PEN_UP,并釋放定時器,為下次觸摸屏事件做好準備,定時中斷服務程序流程圖如圖4所示。


圖4 定時中斷服務程序流程圖

 

 

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

  module_exit()

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

  接口函數s3c2410_ts_read( )

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

  坐標讀取函數s3c2410_get_XY()

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

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


圖5 ADS7843操作時序


圖6 X坐標采集流程

  結語

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

此內容為AET網站原創,未經授權禁止轉載。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          欧美在线看片a免费观看| 欧美日韩精品二区| 欧美成年人网站| 亚洲欧美日韩视频二区| 欧美好吊妞视频| 亚洲精品无人区| 欧美精品亚洲二区| 亚洲综合首页| 国产精品美女在线观看| 国产精品久久久久国产a级| 国内精品模特av私拍在线观看| 国内外成人免费激情在线视频网站| 久久久青草青青国产亚洲免观| 欧美在线你懂的| 久久精品盗摄| 在线欧美福利| 欧美国产另类| 亚洲影院高清在线| 91久久国产综合久久蜜月精品| 亚洲精选大片| 欧美影片第一页| 欧美吻胸吃奶大尺度电影| 亚洲精品久久久一区二区三区| 亚洲国产免费| 欧美在线观看一区二区三区| 欧美三日本三级少妇三2023| 欧美v国产在线一区二区三区| 欧美一区二区三区免费观看视频| 99国产精品99久久久久久粉嫩| 欧美va天堂| 99pao成人国产永久免费视频| 国产精品自拍小视频| 男人的天堂亚洲在线| 老司机免费视频一区二区| 亚洲一区二区毛片| 欧美日本免费一区二区三区| 国产精品免费aⅴ片在线观看| 黑人中文字幕一区二区三区| 欧美激情亚洲综合一区| 亚洲最新色图| 嫩草伊人久久精品少妇av杨幂| 亚洲视频每日更新| 久久久之久亚州精品露出| 国产日韩一区| 欧美激情一区| 香蕉亚洲视频| 欧美日韩天天操| 亚洲天堂第二页| 欧美日韩爆操| 影音先锋国产精品| 国语对白精品一区二区| 亚洲欧美日韩在线不卡| 国产日韩一区在线| 99精品国产一区二区青青牛奶| 亚洲精品视频免费在线观看| 尤物精品国产第一福利三区| 国产精品高清免费在线观看| 国产亚洲综合在线| 欧美日韩免费一区二区三区视频| 99视频一区二区| 国内久久精品| 欧美日韩午夜| 亚洲欧美自拍偷拍| 国产亚洲成av人在线观看导航| 国产日韩欧美精品一区| 欧美性视频网站| 亚洲国产精品尤物yw在线观看| 久久久久久亚洲精品杨幂换脸| 夜夜精品视频| 欧美精品国产一区| 欧美一级大片在线观看| 欧美午夜国产| 国产精品美女主播在线观看纯欲| 欧美激情视频在线免费观看 欧美视频免费一| 欧美—级高清免费播放| 免费久久精品视频| 国产在线播放一区二区三区| 欧美大片在线观看一区二区| 黑人极品videos精品欧美裸| 欧美成人免费一级人片100| 欧美视频一区二区三区在线观看| 影音先锋日韩精品| 国产精品av免费在线观看| 欧美日韩成人精品| 欧美日本一区二区高清播放视频| 影音先锋久久精品| 狠狠色综合色综合网络| 国产精品私人影院| 亚洲乱码日产精品bd| 在线视频精品| 亚洲网站在线观看| 亚洲性人人天天夜夜摸| 亚洲国产精品久久久久秋霞不卡| 欧美日本在线观看| 国产精品激情| 欧美亚洲免费在线| 欧美日韩xxxxx| 亚洲高清久久| 欧美少妇一区二区| 国产裸体写真av一区二区| 亚洲黄色性网站| 韩日成人在线| 激情国产一区二区| 亚洲欧美日韩人成在线播放| 亚洲日本欧美| 午夜精品福利在线| 亚洲三级国产| 久久久亚洲成人| 亚洲黑丝在线| 国产精品三区www17con| 亚洲精品美女在线| 欧美一级视频一区二区| 久久久久国产成人精品亚洲午夜| 美女诱惑黄网站一区| 亚洲一区二区三区四区视频| 国产热re99久久6国产精品| 老司机精品视频一区二区三区| 久久这里有精品视频| 欧美大学生性色视频| 欧美视频在线观看一区二区| 国产精品乱码久久久久久| 在线免费观看视频一区| 亚洲国产日韩精品| 久久精品国产99国产精品澳门| 国产日韩欧美夫妻视频在线观看| 国产精品视频久久| 欧美一区二区三区视频| 伊人狠狠色丁香综合尤物| 欧美激情精品久久久久久免费印度| 国产美女在线精品免费观看| 狠狠入ady亚洲精品| 久久久999精品| 韩日欧美一区二区三区| 欧美波霸影院| 国产一区二区精品丝袜| 国产精品成人免费| 在线播放亚洲一区| 国产精品每日更新| 狠狠色狠狠色综合日日小说| 18成人免费观看视频| 最新国产の精品合集bt伙计| 国产在线视频不卡二| 欧美伊人久久大香线蕉综合69| 国产乱码精品一区二区三区av| 欧美色图一区二区三区| 欧美特黄一级| 欧美日韩精品一区视频| 久久久久国产免费免费| 国产精品久久久久久久7电影| 亚洲黄色在线视频| 亚洲国产精品久久91精品| 久久久久9999亚洲精品| 国产美女精品人人做人人爽| 国产精品午夜国产小视频| 亚洲影院在线| 亚洲深夜影院| 欧美激情免费在线| 午夜精品区一区二区三| 激情欧美一区二区三区| 亚洲精华国产欧美| 最新亚洲电影| 国产精品中文字幕在线观看| 一本久道久久综合婷婷鲸鱼| 亚洲三级网站| 日韩一级精品| 国产精品乱码一区二区三区| 国产一区二区三区四区| 欧美不卡福利| 欧美性猛交99久久久久99按摩| 国内精品国语自产拍在线观看| 欧美日韩一级大片网址| 欧美亚洲色图校园春色| 亚洲欧美日韩在线观看a三区| 亚洲综合成人在线| 欧美色区777第一页| 久久久久久久综合狠狠综合| 国产亚洲精品久久久久动| 国产精品视频99| 亚洲免费中文字幕| 久久精品色图| 欧美黑人在线播放| 久久综合给合久久狠狠狠97色69| 欧美一区二区观看视频| 国内一区二区在线视频观看| 欧美色综合天天久久综合精品| 国产一区二区欧美| 国产午夜精品理论片a级探花| 欧美成人午夜激情视频| 国产精品99久久久久久久女警| 欧美日韩视频一区二区三区| 欧美影院午夜播放| 免费欧美日韩国产三级电影| 欧美高清在线精品一区| 亚洲免费影院| 欧美成人精品在线| 欧美在线视频在线播放完整版免费观看| 亚洲激情国产精品| 欧美3dxxxxhd| 夜夜爽av福利精品导航| 欧美黄色一区| 久久香蕉国产线看观看网| 国产一区二区在线观看免费播放| 亚洲一区二区三区精品在线观看| 久热精品视频在线观看| 伊人久久亚洲美女图片| 欧美aaa级| 国产亚洲在线| 欧美成人国产va精品日本一级| 欧美成人激情视频| 午夜精品福利电影| 一区二区三区黄色| 亚洲欧美国产日韩天堂区| 国产一区av在线| 亚洲电影视频在线| 国产精品九九| 久久久av毛片精品| 亚洲无玛一区| 久久一区精品| 伊人久久亚洲美女图片| 亚洲人成绝费网站色www| 亚洲一区二区三区精品视频| 亚洲美女福利视频网站| 欧美性猛交xxxx乱大交退制版| 久久夜色精品国产欧美乱极品| 韩国亚洲精品| 极品尤物av久久免费看| 欧美.日韩.国产.一区.二区| 国产精品99久久久久久久vr| 欧美成人午夜激情在线| 欧美日韩一区二区免费视频| 国产精品久久国产精品99gif| 欧美午夜寂寞影院| 亚洲午夜女主播在线直播| 久久av在线| 99国产精品一区| 欧美日韩一区二区在线播放| 久久久精品一区二区三区| 国产精品一区二区在线观看网站| 亚洲曰本av电影| 久久久精品免费视频| 老色鬼久久亚洲一区二区| 亚洲欧美影音先锋| 日韩一区二区精品| 久久蜜桃av一区精品变态类天堂| 女生裸体视频一区二区三区| aa级大片欧美三级| 久久久久9999亚洲精品| 国内精品国产成人| 亚洲欧洲日本mm| 亚洲精品综合精品自拍| 亚洲裸体俱乐部裸体舞表演av| 在线精品亚洲一区二区| 欧美国产日产韩国视频| 午夜精品视频在线观看| 久久视频精品在线| 欧美日韩91| 亚洲国产精品一区制服丝袜| 免播放器亚洲一区| 亚洲国产欧美在线人成| 亚洲精品国产精品国自产在线| 欧美亚洲一区三区| 在线观看91精品国产入口| 在线观看的日韩av| 亚洲欧美在线另类| 欧美一区二区三区在线播放| 国产美女高潮久久白浆| 亚洲欧美日韩一区二区在线| 国内揄拍国内精品少妇国语| 久久偷看各类wc女厕嘘嘘偷窃| 欧美午夜www高清视频| 久久精品国产久精国产思思| 欧美激情亚洲精品| 欧美成人午夜激情| 国产美女精品视频| 久久婷婷国产综合精品青草| 在线成人激情| 久久精品国产2020观看福利| 亚洲永久免费av| 亚洲国产精品一区在线观看不卡| 欧美在线观看一区二区| 国产日本欧美一区二区三区| 亚洲欧美日韩国产综合在线| 一区二区免费在线视频| 亚洲精一区二区三区| 国产女主播视频一区二区| 欧美成人激情视频免费观看| 亚洲经典三级| 亚洲一区二区三区在线播放| 国产精品第2页| 欧美成人精品激情在线观看| 国产精品成人国产乱一区| 国产一区视频观看| 国产日韩欧美综合精品| 亚洲国产乱码最新视频| 亚洲黄色三级| 午夜精品久久久久久久99樱桃| 欧美日韩国产综合一区二区| 亚洲国产成人高清精品| 亚洲午夜未删减在线观看| 欧美精品一区二区精品网| 欧美极品影院| 国产视频精品免费播放| 久久久久综合一区二区三区| 久久综合电影| 一本一本a久久| 国产精品久久久亚洲一区| 国产精品女主播在线观看| 国产精品成人免费| 亚洲精品中文在线| 国产亚洲精品bv在线观看| 亚洲一区二区三区在线视频| 久久久久青草大香线综合精品| 在线观看欧美一区| 亚洲一区影院| 最新高清无码专区| 99在线精品观看| 久久女同精品一区二区| 久久久噜噜噜久久狠狠50岁| 国产欧美一区二区精品婷婷| 最近中文字幕日韩精品| 99精品福利视频| 国产精品系列在线播放| 亚洲欧洲免费视频| 亚洲一区二区高清视频| 欧美日韩国产首页| 久久久久久久精| 亚洲国产裸拍裸体视频在线观看乱了| 男男成人高潮片免费网站|