基于Linux系統的觸摸屏驅動(dòng)方案
引言
本文引用地址:http://dyxdggzs.com/article/168330.htm觸摸屏作為一種輸入設備,具有堅固耐用、反應速度快、節省空間、易于交流等優(yōu)點(diǎn),提供簡(jiǎn)單、方便、自然的人機交互方式,目前被廣泛應用于工業(yè)控制、電子查詢(xún)、消費性電產(chǎn)品領(lǐng)域。
Linux作為是目前最流行的操作系統之一,在桌面系統、服務(wù)器領(lǐng)域有大量用戶(hù),具有源代碼開(kāi)放,支持的硬件豐富、高可移植等優(yōu)點(diǎn),在嵌入式領(lǐng)域也備受青睞。Linux根據不同設備,將驅動(dòng)程序分為字符設備驅動(dòng)、塊設備驅動(dòng)、網(wǎng)絡(luò )設備驅動(dòng)三種,Linux輸入子系統u是對字符類(lèi)型輸入設備驅動(dòng)實(shí)現方式的抽象,是對分散的、多種不同類(lèi)別的輸入設備進(jìn)行統一處理的內核驅動(dòng)模型。輸入子系統具高效、無(wú)Bug和可重用等優(yōu)點(diǎn)。本文對基于Linux輸入子系統的觸摸屏驅動(dòng)進(jìn)行深入的討論。
1 硬件平臺
S3C2440是三星公司推出的采用ARM920t內核的MCU,集成了豐富的外圍設備,其中包括4線(xiàn)電阻式觸摸屏控制器和8通道多路復用ADC。
觸摸屏由觸摸檢測部件和觸摸屏控制器構成,對應S3C2440平臺的四線(xiàn)電阻觸摸屏的外接電路和S3C2440芯片自帶的A/D轉換控制部分。四線(xiàn)電阻觸摸屏的外接電路控制上下兩層導電層的通斷情況以及如何取電壓,取電壓之后由S3C2440芯片中的A/D將模擬量轉換成數字量。S3C2440芯片的A/D轉換器有8個(gè)輸入通道,轉換結果為10bit數字,轉換過(guò)程在芯片內部自動(dòng)實(shí)現,轉換的結果從寄存器中取值,再進(jìn)行一定的轉后可直接得到觸摸點(diǎn)的坐標。S3C2440提供的ADC和觸摸屏接口如圖1所示,觸摸屏直接與引腳XP,XM,YP和YM連接,對觸摸屏兩個(gè)導電層的通斷通過(guò)XP,XM,YP和YM4個(gè)引腳控制。通過(guò)讀寫(xiě)指定的特殊寄存器,S3C2440的觸摸屏控制器將自動(dòng)控制觸摸屏接口打開(kāi)或關(guān)閉,按指定操作模式完成觸點(diǎn)數據的采集。
2 輸入子系統體系結構簡(jiǎn)介
設備驅動(dòng)程序在Linux內核中占很重要地位,設備驅動(dòng)以?xún)群四K方式實(shí)現,可動(dòng)態(tài)加載和卸載。Linux設備驅動(dòng)的實(shí)現只需根據內核提供的一組相關(guān)數據結構和驅動(dòng)接口標準,完成關(guān)鍵數據結構初始化和回調函數的編寫(xiě)。對字符設備驅動(dòng)內核提供cdev數據結構和file_operatiONs結構體及操作方法,實(shí)現字符設備驅動(dòng)只需完成cdev的初始化、file_operations中操作函數的實(shí)現并向內核注冊。
Linux輸入子系統是對物理形態(tài)各異的功能相似的輸入設備的抽象,是內核中字符設備驅動(dòng)接口的封裝。輸入子系統由設備驅動(dòng)層、核心層和事件處理層構成。設備驅動(dòng)層提供對硬件各寄存器的讀寫(xiě)訪(fǎng)問(wèn)和將底層硬件對用戶(hù)輸入訪(fǎng)問(wèn)的響應轉換為標準的輸入事件,通過(guò)核心層提交給事件處理層;核心層對設備驅動(dòng)層提供編程接口,對事件處理層的也提供編程接口;事件處理層為用戶(hù)空間的應用程序提供了統一訪(fǎng)問(wèn)設備的接口和驅動(dòng)層提交來(lái)的事件處理。基于輸入子系統設計驅動(dòng)時(shí)要實(shí)現設備驅動(dòng)層的驅動(dòng)和事件處理層的驅動(dòng),而輸入子系統在事件處理層為觸摸屏提供標準的事件接口,所以只要須完成設備驅動(dòng)層的驅動(dòng),即硬件寄存器的操作和提交輸入事件信息。基于輸入子系統的設備驅動(dòng)層驅動(dòng)的實(shí)現過(guò)程如下:
1)驅動(dòng)模塊加載函數中設置輸入設備支持輸入子系統的事件;Linux內核用input_dev代表一個(gè)輸入設備,對于觸摸屏通過(guò)對input_dev實(shí)例的evbit[0]的設置來(lái)支持同步(EN_SYN)、按鍵(EN_KEY)和絕對坐標(EV_ABS)事件。
2)通過(guò)內核提供的input_regiSTer_device0函數向輸入子系統注冊輸入設備。
3)輸入設備發(fā)生輸入操作時(shí)提交所發(fā)生的事件及對應鍵值或坐標等狀態(tài)信息。觸摸屏使用輸入子系統提供的通用輸入事件驅動(dòng)程序Evdev,將事件信息打包成Input_event類(lèi)型進(jìn)行報告。
3 Linux觸摸屏驅動(dòng)的實(shí)現
3.1 觸摸屏觸點(diǎn)數據采集
S3C2440觸摸屏控制器有四種工作模式,通過(guò)讀寫(xiě)ADCTSC、ADCDA、ADCDATl和ADCDLY寄存器完成觸摸屏控制器工作模式的選擇和觸摸屏觸點(diǎn)數據采集。由于觸摸動(dòng)作時(shí)間的隨機性,驅動(dòng)設計時(shí)選擇中斷工作方式。設置ADCTSC寄存器為0xD3使觸摸屏控制器進(jìn)入等待中斷模式,設置ADCDLY采樣延遲時(shí)間。當觸摸屏被按下,觸摸屏控制器將產(chǎn)生INT_TC中斷:在ⅡTC中斷處理程序中,設置ADCTSC寄存器為0x0C,觸摸屏控制器切換為自動(dòng)X(jué)/Y坐標轉換模式,將自動(dòng)轉換觸點(diǎn)對應的x,y坐標值,并分別寫(xiě)入ADCDAT0寄存器和ADCDTA1寄存器,發(fā)出INTADC中斷表示ADC轉換完成;進(jìn)入INT_ADC中斷處理程序讀取ADCDAT0寄存器和ADCDTA1寄存器中坐標數據并進(jìn)行相應轉換,數據采集后重新設置ADCTSC寄存器為0xD3使觸摸屏控制器進(jìn)入等待中斷模式,等待觸摸屏被按下。
3.2 驅動(dòng)初始化模塊
Linux驅動(dòng)程序以?xún)群四K方式加載運行。實(shí)現驅動(dòng)加載函數s3c2440ts_init()并通過(guò)module_init(s3c2440ts_init)向內核注冊。在驅動(dòng)加載函數主要完成:?jiǎn)⒂肁DC所需要的時(shí)鐘、映射10地址、初始化ADC和觸摸屏控制器相關(guān)的寄存器、申請INT_TS和INT_ADC中斷、初始化輸入設備、將輸入設備注冊到輸入子系統。關(guān)鍵代碼如下:
linux相關(guān)文章:linux教程
評論