999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

嵌入式Linux中觸摸屏驅(qū)動的設(shè)計(jì)與實(shí)現(xiàn)

2011-02-09 01:57:08周德榮
制造業(yè)自動化 2011年4期
關(guān)鍵詞:設(shè)備

周德榮

0 引言

觸摸屏作為一種輸入設(shè)備,具有堅(jiān)固耐用、反應(yīng)速度快、節(jié)省空間、易于交流等優(yōu)點(diǎn),提供簡單、方便、自然的人機(jī)交互方式,目前被廣泛應(yīng)用于工業(yè)控制、電子查詢、消費(fèi)性電產(chǎn)品領(lǐng)域。Linux作為是目前最流行的操作系統(tǒng)之一,在桌面系統(tǒng)、服務(wù)器領(lǐng)域有大量用戶,具有源代碼開放,支持的硬件豐富、高可移植等優(yōu)點(diǎn),在嵌入式領(lǐng)域也備受青睞。Linux根據(jù)不同設(shè)備,將驅(qū)動程序分為字符設(shè)備驅(qū)動、塊設(shè)備驅(qū)動、網(wǎng)絡(luò)設(shè)備驅(qū)動三種, Linux輸入子系統(tǒng)[1]是對字符類型輸入設(shè)備驅(qū)動實(shí)現(xiàn)方式的抽象,是對分散的、多種不同類別的輸入設(shè)備進(jìn)行統(tǒng)一處理的內(nèi)核驅(qū)動模型。輸入子系統(tǒng)具高效、無Bug和可重用等優(yōu)點(diǎn)。本文對基于Linux輸入子系統(tǒng)的觸摸屏驅(qū)動進(jìn)行深入的討論。

1 硬件平臺

S3C2440是三星公司推出的采用ARM920t內(nèi)核的MCU,集成了豐富的外圍設(shè)備,其中包括4線電阻式觸摸屏控制器和8通道多路復(fù)用ADC。觸摸屏由觸摸檢測部件和觸摸屏控制器構(gòu)成,對應(yīng)S3C2440平臺的四線電阻觸摸屏的外接電路和S3C2440芯片自帶的A/D 轉(zhuǎn)換控制部分。四線電阻觸摸屏的外接電路控制上下兩層導(dǎo)電層的通斷情況以及如何取電壓,取電壓之后由S3C2440芯片中的A/D將模擬量轉(zhuǎn)換成數(shù)字量。S3C2440芯片的A/D轉(zhuǎn)換器有8個輸入通道,轉(zhuǎn)換結(jié)果為10bit數(shù)字,轉(zhuǎn)換過程在芯片內(nèi)部自動實(shí)現(xiàn),轉(zhuǎn)換的結(jié)果從寄存器中取值,再進(jìn)行一定的轉(zhuǎn)后可直接得到觸摸點(diǎn)的坐標(biāo)。S3C2440提供的ADC和觸摸屏接口如圖1所示,觸摸屏直接與引腳XP,XM,YP和YM連接,對觸摸屏兩個導(dǎo)電層的通斷通過XP,XM,YP和YM 4個引腳控制。通過讀寫指定的特殊寄存器,S3C2440的觸摸屏控制器將自動控制觸摸屏接口打開或關(guān)閉,按指定操作模式完成觸點(diǎn)數(shù)據(jù)的采集。

圖1 S3C2440 ADC和觸摸屏接口結(jié)構(gòu)

2 輸入子系統(tǒng)體系結(jié)構(gòu)簡介

設(shè)備驅(qū)動程序[2]在Linux內(nèi)核中占很重要地位,設(shè)備驅(qū)動以內(nèi)核模塊方式實(shí)現(xiàn),可動態(tài)加載和卸載。Linux設(shè)備驅(qū)動的實(shí)現(xiàn)只需根據(jù)內(nèi)核提供的一組相關(guān)數(shù)據(jù)結(jié)構(gòu)和驅(qū)動接口標(biāo)準(zhǔn),完成關(guān)鍵數(shù)據(jù)結(jié)構(gòu)初始化和回調(diào)函數(shù)的編寫。對字符設(shè)備驅(qū)動內(nèi)核提供cdev數(shù)據(jù)結(jié)構(gòu)和file_operations結(jié)構(gòu)體及操作方法,實(shí)現(xiàn)字符設(shè)備驅(qū)動只需完成cdev的初始化、file_operations中操作函數(shù)的實(shí)現(xiàn)并向內(nèi)核注冊。

Linux輸入子系統(tǒng)是對物理形態(tài)各異的功能相似的輸入設(shè)備的抽象,是內(nèi)核中字符設(shè)備驅(qū)動接口的封裝。輸入子系統(tǒng)由設(shè)備驅(qū)動層、核心層和事件處理層構(gòu)成。設(shè)備驅(qū)動層提供對硬件各寄存器的讀寫訪問和將底層硬件對用戶輸入訪問的響應(yīng)轉(zhuǎn)換為標(biāo)準(zhǔn)的輸入事件,通過核心層提交給事件處理層;核心層對設(shè)備驅(qū)動層提供編程接口,對事件處理層的也提供編程接口;事件處理層為用戶空間的應(yīng)用程序提供了統(tǒng)一訪問設(shè)備的接口和驅(qū)動層提交來的事件處理。基于輸入子系統(tǒng)設(shè)計(jì)驅(qū)動時要實(shí)現(xiàn)設(shè)備驅(qū)動層的驅(qū)動和事件處理層的驅(qū)動,而輸入子系統(tǒng)在事件處理層為觸摸屏提供標(biāo)準(zhǔn)的事件接口,所以只要須完成設(shè)備驅(qū)動層的驅(qū)動,即硬件寄存器的操作和提交輸入事件信息[3]。基于輸入子系統(tǒng)的設(shè)備驅(qū)動層驅(qū)動的實(shí)現(xiàn)過程如下:

1)驅(qū)動模塊加載函數(shù)中設(shè)置輸入設(shè)備支持輸入子系統(tǒng)的事件;Linux內(nèi)核用input_dev代表一個輸入設(shè)備,對于觸摸屏通過對input_dev實(shí)例的evbit[0]的設(shè)置來支持同步(EN_SYN)、按鍵(EN_KEY)和絕對坐標(biāo)(EV_ABS)事件。

2)通過內(nèi)核提供的input_register_device() 函數(shù)向輸入子系統(tǒng)注冊輸入設(shè)備。

3)輸入設(shè)備發(fā)生輸入操作時提交所發(fā)生的事件及對應(yīng)鍵值或坐標(biāo)等狀態(tài)信息。觸摸屏使用輸入子系統(tǒng)提供的通用輸入事件驅(qū)動程序Evdev,將事件信息打包成Input_event類型進(jìn)行報告。

3 Linux觸摸屏驅(qū)動的實(shí)現(xiàn)

3.1 觸摸屏觸點(diǎn)數(shù)據(jù)采集

S3C2440觸摸屏控制器有四種工作模式[4],通 過 讀 寫 ADCTSC、ADCDAT0、ADCDAT1和ADCDLY寄存器完成觸摸屏控制器工作模式的選擇和觸摸屏觸點(diǎn)數(shù)據(jù)采集。由于觸摸動作時間的隨機(jī)性,驅(qū)動設(shè)計(jì)時選擇中斷工作方式。設(shè)置ADCTSC寄存器為0xD3使觸摸屏控制器進(jìn)入等待中斷模式,設(shè)置ADCDLY采樣延遲時間。當(dāng)觸摸屏被按下,觸摸屏控制器將產(chǎn)生INT_TC中斷;在INT_TC中斷處理程序中,設(shè)置ADCTSC寄存器為0x0C, 觸摸屏控制器切換為自動X/Y坐標(biāo)轉(zhuǎn)換模式,將自動轉(zhuǎn)換觸點(diǎn)對應(yīng)的x,y坐標(biāo)值,并分別寫入ADCDAT0寄存器和ADCDTA1寄存器,發(fā)出INT_ADC中斷表示ADC轉(zhuǎn)換完成;進(jìn)入INT_ADC中斷處理程序讀取ADCDAT0寄存器和ADCDTA1寄存器中坐標(biāo)數(shù)據(jù)并進(jìn)行相應(yīng)轉(zhuǎn)換,數(shù)據(jù)采集后重新設(shè)置ADCTSC寄存器為0xD3使觸摸屏控制器進(jìn)入等待中斷模式,等待觸摸屏被按下。

3.2 驅(qū)動初始化模塊

Linux驅(qū)動程序以內(nèi)核模塊方式加載運(yùn)行。實(shí)現(xiàn)驅(qū)動加載函數(shù)s3c2440ts_init()并通過module_init(s3c2440ts_init)向內(nèi)核注冊。在驅(qū)動加載函數(shù)主要完成:啟用ADC所需要的時鐘、映射IO地址、初始化ADC和觸摸屏控制器相關(guān)的寄存器、申請INT_TS和INT_ADC中斷、初始化輸入設(shè)備、將輸入設(shè)備注冊到輸入子系統(tǒng)。關(guān)鍵代碼如下:

/*初始化ADC控制寄存器和ADC觸摸屏控制寄存器*/

adc_initialize();

input_dev = input_allocate_device();

/* 設(shè)置觸摸屏支持的事件*/

dev->evbit[0] = BIT(EV_SYN) | BIT(EV_KEY)| BIT(EV_ABS);

/*設(shè)置所支持的按鍵*/

dev->keybit[BITS_TO_LONGS(BTN_TOUCH)]= BIT(BTN_TOUCH);/*設(shè)置絕對坐標(biāo)x、y的最小最大值(0-0x3FF)*/input_set_abs_params(dev,ABS_X,0,0x3FF,0,0);input_set_abs_params(dev,ABS_Y,0,0x3FF,0,0);input_set_abs_params(dev,ABS_PRESSURE,0,1,0,0);

/*申請觸摸屏中斷,觸摸屏按下或提筆時觸發(fā)*/

request_irq(IRQ_TC,tc_irq,IRQF_SAMPLE_RANDOM,"s3c2440_ts",1);

/*申請ADC中斷,AD轉(zhuǎn)換完成后觸發(fā)*/

request_irq(IRQ_ADC,adc_irq,IRQF_SHARED|IRQF_SAMPLE_RANDOM,"s3c2440_ts",1);

/*注冊觸摸屏輸入設(shè)備*/

input_register_device(dev);

3.3 中斷處理程序及事件報告

用戶對觸摸屏進(jìn)行按下、抬起和拖動等操作時,觸發(fā)中斷INT_TS,內(nèi)核進(jìn)入到中斷處理函數(shù)tc_irq ()進(jìn)行中斷處理。tc_irq ()中,通過ADC_LOCK鎖機(jī)制保證只有一個驅(qū)動程序使用ADC的中斷線,通過讀取ADCDAT0和ADCDAT1寄存器,判斷觸摸操作的狀態(tài),觸摸筆按下時調(diào)用ts_timer_fire()進(jìn)行數(shù)據(jù)轉(zhuǎn)換。當(dāng)數(shù)據(jù)轉(zhuǎn)換完成時產(chǎn)進(jìn)INT_ADC中斷,內(nèi)核進(jìn)入中斷處理函數(shù)adc_irq(),adc_irq()完成觸點(diǎn)信息采集并調(diào)用ts_timer_fire()進(jìn)行事件報告。事件報告流程如圖2所示。

圖2 事件報告流程

ts_timer_fire()是主要完成觸點(diǎn)坐標(biāo)信息向應(yīng)用層報告。updown、count為靜態(tài)全局變量,updown觸點(diǎn)狀態(tài),count代表1個 jiffies 時間內(nèi)ADC轉(zhuǎn)換的次數(shù),count為0,設(shè)置自動X/Y軸坐標(biāo)轉(zhuǎn)換模式,轉(zhuǎn)換完成后產(chǎn)生相應(yīng)的INT_ADC中斷通知轉(zhuǎn)換完畢。count不為0, input_report_abs()函數(shù)向輸入子系統(tǒng)報告x,y絕對坐標(biāo)事件,input_report_key()觸摸屏對應(yīng)按鍵被按下事件,輸入子系統(tǒng)使用input_sync()將報告的事件組成一個evdev包,通過/dev/input/eventX發(fā)送出去,應(yīng)用程序通過讀取/dev/input/eventX即可獲得事件信息。關(guān)鍵代碼如下:

static void ts_timer_fire(unsigned long data)

{

if (updown) {/*updown為1,觸點(diǎn)被按下,為0否則抬起*/

if (count != 0) {

/*報告x,y絕對坐標(biāo)值,觸摸屏對應(yīng)按鍵被按下,觸摸屏的狀態(tài)*/

input_report_abs(dev, ABS_X, xp);

input_report_abs(dev, ABS_Y, yp);

input_report_key(dev, BTN_TOUCH, 1);

input_report_abs(dev, ABS_PRESSURE, 1);

/*事件同步,組成evdev包提交*/

input_sync(dev);

}

/*設(shè)置觸摸屏控制器為自動X/Y軸坐標(biāo)轉(zhuǎn)換模式,自動地進(jìn)行X軸和Y軸的轉(zhuǎn)換操作,轉(zhuǎn)換完成后產(chǎn)生INT_ADC中斷通知轉(zhuǎn)換完畢*/

代碼省略…

} else {

count = 0;

/*如果觸摸筆是彈起狀態(tài),則提出報告,并讓觸摸屏處于等待觸摸的階段*/

input_report_key(dev, BTN_TOUCH, 0);

input_report_abs(dev, ABS_PRESSURE, 0);

input_sync(dev);

/*設(shè)置觸摸屏為等待中斷模式,等待觸摸筆按下*/

iowrite32(WAIT4INT(0), base_addr+S3C2410_ADCTSC);

}

}

4 結(jié)論

隨著信息技術(shù)的快速發(fā)展,嵌入式技術(shù)與人們的生活越來越緊密,觸摸屏作為一種新型輸入設(shè)備因具有輕便、占用空間少、方便靈活等優(yōu)點(diǎn),應(yīng)用逐漸普及。要充分發(fā)揮觸摸屏的優(yōu)點(diǎn),嵌入式中驅(qū)動設(shè)計(jì)至關(guān)重要。嵌入式Linux中基于輸入子系統(tǒng)實(shí)現(xiàn)觸摸屏驅(qū)動時,利用了Linux輸入子系統(tǒng)提供標(biāo)準(zhǔn)事件接口,簡化了驅(qū)動設(shè)計(jì),驅(qū)動設(shè)計(jì)的重點(diǎn)變成了觸摸屏控制器相關(guān)的硬件操作及功能實(shí)現(xiàn),充分體現(xiàn)Linux內(nèi)核代碼的高可重性,對其他類型輸入設(shè)備驅(qū)動程序的設(shè)計(jì)有一定參考作用。

[1] Sreekrishnan Venkateswaran.Essential Linux Device Drivers[M].Prentice Hall PTR,2009.4.

[2] Jonathan Corbet,Alessandro Rubini,Greg Kroah-Hartman,魏永明,譯.Linux設(shè)備驅(qū)動程序(第三版)[M].中國電力出版社,2006.

[3] 宋寶華.Linux設(shè)備驅(qū)動開發(fā)詳解[M].人民郵電出版社,2008.

[4] 韋東山.嵌入式Linux應(yīng)用開發(fā)完全手冊[M].人民郵電出版社,2008.

猜你喜歡
設(shè)備
諧響應(yīng)分析在設(shè)備減振中的應(yīng)用
調(diào)試新設(shè)備
基于VB6.0+Access2010開發(fā)的設(shè)備管理信息系統(tǒng)
基于MPU6050簡單控制設(shè)備
電子制作(2018年11期)2018-08-04 03:26:08
廣播發(fā)射設(shè)備中平衡輸入與不平衡輸入的轉(zhuǎn)換
電子制作(2018年10期)2018-08-04 03:24:48
食之無味,棄之可惜 那些槽點(diǎn)滿滿的可穿戴智能設(shè)備
500kV輸變電設(shè)備運(yùn)行維護(hù)探討
HTC斥資千萬美元入股虛擬現(xiàn)實(shí)設(shè)備商WEVR
IT時代周刊(2015年8期)2015-11-11 05:50:37
Automechanika Shanghai 2014 之“看” 汽保設(shè)備篇
如何在設(shè)備采購中節(jié)省成本
主站蜘蛛池模板: 综合亚洲网| 无码中文字幕乱码免费2| 国产精品内射视频| 在线精品亚洲一区二区古装| 欧美在线综合视频| 亚洲日韩国产精品综合在线观看| 亚洲av无码成人专区| 五月婷婷丁香综合| 色国产视频| 国产91线观看| 特级做a爰片毛片免费69| 欧美不卡在线视频| 日本久久久久久免费网络| 欧美另类一区| 日韩中文精品亚洲第三区| 色婷婷丁香| 国产麻豆精品久久一二三| 毛片网站在线看| 四虎免费视频网站| 在线免费不卡视频| 国产剧情国内精品原创| 国产亚洲成AⅤ人片在线观看| 久久精品人人做人人综合试看| 免费高清a毛片| 午夜精品久久久久久久无码软件 | 91毛片网| 亚洲人在线| 日本不卡在线视频| 粉嫩国产白浆在线观看| 国产精品理论片| 无码aaa视频| 欧美中文字幕在线二区| 久久综合伊人 六十路| 老司机aⅴ在线精品导航| 99re在线免费视频| 91口爆吞精国产对白第三集| 高h视频在线| 九九九精品视频| 无码AV高清毛片中国一级毛片| 免费一看一级毛片| 国产成人精品男人的天堂| 国产一在线观看| 99久久精品免费观看国产| 亚洲国产成人精品无码区性色| 永久免费无码成人网站| 五月激情综合网| 色哟哟国产成人精品| 制服丝袜国产精品| 97色伦色在线综合视频| 欧美综合中文字幕久久| 亚洲香蕉久久| 日韩福利在线观看| 亚洲日韩国产精品综合在线观看| 在线毛片免费| 国产精品香蕉| 国产人在线成免费视频| 成人一区在线| 欧美成人精品在线| jizz亚洲高清在线观看| 成人免费视频一区| 国产精品嫩草影院视频| 国产迷奸在线看| 1024你懂的国产精品| 日韩在线第三页| 久久久久国产精品熟女影院| 精品国产香蕉伊思人在线| 精品精品国产高清A毛片| 精品一區二區久久久久久久網站| 久久中文字幕不卡一二区| 99爱在线| 欧美久久网| 欧美一级高清片欧美国产欧美| 久久综合丝袜日本网| 99视频在线免费| 国产精品va免费视频| 国产91精品调教在线播放| 国产xxxxx免费视频| 亚洲精品第1页| 亚洲男人的天堂在线观看| 国产精品乱偷免费视频| 免费观看男人免费桶女人视频| 青青草一区二区免费精品|